Apache module mod_fcgid

Распределение нагрузки

FastCGI plugin предоставляет автоматическое распределение нагрузки между несколькими FastCGI серверами.

  fastcgi.server = ( ".php" => 
                   ( "server1" => 
                     ( "host" => "10.0.0.3",
                       "port" => 1030 ),
                     "server2" =>
                     ( "host" => "10.0.0.3",
                       "port" => 1030 )
                   )
                 )

Чтобы понять как работает распределение нагрузки вы можете включить опцию и получить вывод подобный этому:

  proc 127.0.0.1 1031  1 1 1 31454
  proc 127.0.0.1 1028  1 1 1 31442
  proc 127.0.0.1 1030  1 1 1 31449
  proc 127.0.0.1 1029  1 1 2 31447
  proc 127.0.0.1 1026  1 1 2 31438
  got proc 34 31454
  release proc 40 31438
  proc 127.0.0.1 1026  1 1 1 31438
  proc 127.0.0.1 1028  1 1 1 31442
  proc 127.0.0.1 1030  1 1 1 31449
  proc 127.0.0.1 1031  1 1 2 31454
  proc 127.0.0.1 1029  1 1 2 31447

Данный вывод показывает множество порождений FastCGI на локальной машине. Следующее объяснение верно также и для удалённых соединений.

Вывод показывает:

IP, порт, unix-socket (в данном случае пусто)
is-local, показатель (0 — не выставлено, 1 — запущено, … )
активные соединения (загрузка)
PID
Как вы можете видеть список всё время упорядочен по полю загрузки

При запросе нового соединения, выбирается первый указатель на FastCGI процесс (один с наименьшей нагрузкой), значение загрузки увеличивается на 1 (got proc: …) и список сортируется вновь.

Если FastCGI запрос заканчивается или соединение обрывается, загрузка FastCGI proc уменьшается на 1 и список опять сортируется (release proc: …)

Такое поведение занимает мало кода, весьма эффективно, и позволяет использовать fastcgi-сервера равнозагруженно, даже если они имеют разные CPU.

Troubleshooting

Generic troubleshooting

There are basically two best ways to troubleshoot FastCGI problems. The first is to check if the FastCGI application you are trying to run actually works. If there are syntax errors in the script, or if the interpreter cannot be found, there will be no error logging, so be careful in making sure the script is correct.

If running in Static/Dynamic mode, make sure Apache and the script are not running. Now start Apache, and verify that the socket is correctly created:

If the socket is not being created, FastCGI may not have been setup correctly.

Also check that FastCGI has spawned the Process Manager and at least one instance of your script (Static/Dynamic mode):

If the Process Manager ( process) is not running, something is wrong with either your FastCGI installation or the or directive.

If running in External mode, verify you are running the script as the proper user:

Before running the script, make sure there is no socket file in . Start your script, and verify that it has created the socket with the correct persmissions and ownerships:

The owner and group should match the username and group of the Apache sub-processes and the socket permissions should allow reading and writing from and to the socket by both the Apache user, and your application.

Common logfile errors

FastCGI does its best to log errors to the various log files when problems occur. Errors end up in the custom log file for your virtual host (if defined) or in the global error log (). If you can’t find any errors, but your application still fails, check every log file you can for possible clues.

Sometimes the errors FastCGI logs are rather cryptic. Here are some of the more common errors, and how to possibly resolve them.

FastCGI cannot connect to the application socket because it does not have the correct ownership or permissions. This usually happens in external mode, when the application you are trying to run creates the socket itself. Make sure you are running the application as the web server user and that the web server can read and write from and to the socket. Sometimes the socket will not be removed by Apache or your application, and it will have the wrong permissions. Your application can’t overwrite the socket with a correct one, and fails silently. Make sure to remove any socket files before starting Apache:

FastCGI tried to start the script you gave as a parameter to the or directive, but it did probably does not exist, or couldn’t be started correct.

The ExecCGI option has not been enabled for the directory in which you are trying to run the script. Make sure you have enabled it (see chapter ‘Install and Prepare FastCGI’).

There is something wrong with your script, and this is its output. Fix the script.

For some reason FastCGI was not able to communicate with your Python script. Possible reasons include a faulty socket (write permission denied or wrong ownership or group), failure in your script to correctly read from the socket or incorrect reading from the socket.

Устранение неполадок при открытии файлов FCGI

Общие проблемы с открытием файлов FCGI

FastCGI Script не установлен

Дважды щелкнув по файлу FCGI вы можете увидеть системное диалоговое окно, в котором сообщается «Не удается открыть этот тип файла». В этом случае обычно это связано с тем, что на вашем компьютере не установлено FastCGI Script для %%os%%. Так как ваша операционная система не знает, что делать с этим файлом, вы не сможете открыть его дважды щелкнув на него.

Совет: Если вам извстна другая программа, которая может открыть файл FCGI, вы можете попробовать открыть данный файл, выбрав это приложение из списка возможных программ.

Установлена неправильная версия FastCGI Script

В некоторых случаях у вас может быть более новая (или более старая) версия файла FastCGI Script, не поддерживаемая установленной версией приложения. При отсутствии правильной версии ПО FastCGI Script (или любой из других программ, перечисленных выше), может потребоваться загрузить другую версию ПО или одного из других прикладных программных средств, перечисленных выше. Такая проблема чаще всего возникает при работе в более старой версии прикладного программного средства с файлом, созданным в более новой версии, который старая версия не может распознать.

Совет: Иногда вы можете получить общее представление о версии файла FCGI, щелкнув правой кнопкой мыши на файл, а затем выбрав «Свойства» (Windows) или «Получить информацию» (Mac OSX).

Резюме: В любом случае, большинство проблем, возникающих во время открытия файлов FCGI, связаны с отсутствием на вашем компьютере установленного правильного прикладного программного средства.

Даже если на вашем компьютере уже установлено FastCGI Script или другое программное обеспечение, связанное с FCGI, вы все равно можете столкнуться с проблемами во время открытия файлов FastCGI Script. Если проблемы открытия файлов FCGI до сих пор не устранены, возможно, причина кроется в других проблемах, не позволяющих открыть эти файлы. Такие проблемы включают (представлены в порядке от наиболее до наименее распространенных):

Устранение проблем

Ссылки

Сервер Apache бывает трудно настроить правильно. Ниже приведены некоторые ссылки, которые могут быть полезны при возникновении проблем:

  • Руководство по устранению проблем

Тестирование

Проверка IP-интерфейсов и портов, на которых Apache2 работает и слушает их:

tcp     0     0 0.0.0.0:80      0.0.0.0:*     LISTEN     0     10932720     4544/apache2        
tcp     0     0 0.0.0.0:443     0.0.0.0:*     LISTEN     0     10932716     4544/apache2        

Проверка соединения с запущенным на localhost сервером Apache:

Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Тестовое соединение можно разорвать нажатием Ctlr+c и Enter.

apr_sockaddr_info_get() failed for <System_Hostname>

Ошибка:

apache2: apr_sockaddr_info_get() failed for System_Hostname

Решение:

Когда такое происходит, добавьте имя хоста в файл /etc/hosts:

Файл Добавление имени хоста для Apache

127.0.0.1 localhost System_Hostname

[править] Настройка nginx + spawn-fcgi

Скрипт запуска/останова nginx и spawn-fcgi в Gentoo Linux

Скрипт следует разместить по следующему пути:
и обязательно дать ему права на выполнение:

chmod +x /etc/init.d/nginx

Содержимое скрипта следующее:

#!/sbin/runscript
start(){
  # run fastcgi server
  exec 2>&1
  PHP_FCGI_CHILDREN=5 \
  PHP_FCGI_MAX_REQUESTS=1000 \
  exec /usr/bin/spawn-fcgi -n -s /var/run/php-fcgi.sock -n -u nobody -U nobody -- /usr/bin/php-cgi &

  # run nginx
  cd /usr/local/nginx/sbin
  ./nginx &
}

stop(){
  kill -QUIT `cat /usr/local/nginx/logs/nginx.pid`
  killall -9 php-cgi
}

Запуск/останов делается командой:

/etc/init.d/nginx start # запуск
/etc/init.d/nginx stop # останов

Для автоматического запуска/останова при перезапуске VDS необходимо создать ссылку:

ln -s /etc/init.d/nginx /etc/runlevels/default/nginx

Настройка виртуальных хостов в nginx

Допустим у нас будет два домена:

  • по умолчанию (default, когда к VDS обращаются по IP адресу без указания хоста)
  • mysite.ru

Для этого создадим следующие файлы и каталоги:

mkdir /usr/local/nginx/www
mkdir /usr/local/nginx/www/default
mkdir /usr/local/nginx/www/mysite.ru
chown -R nobody:nogroup /usr/local/nginx/www/*
mkdir /usr/local/nginx/conf/vhosts
touch /usr/local/nginx/conf/vhosts/default
touch /usr/local/nginx/conf/vhosts/mysite.ru

Основной файл конфигурации nginx в минимальном виде выглядит так:

worker_processes  1;
 
events {
  worker_connections  1024;
}

http {
  include             mime.types;
  default_type        application/octet-stream;
  sendfile            on;
  keepalive_timeout   65;

  include             vhosts/*;
}

Для хоста по умолчанию файл конфигурации имеет следующее содержимое:

server {
   listen 80;
   server_name _;

   root /usr/local/nginx/www/default;
   index index.html; # если сайт на PHP - заменить на index.php

   # замена mod_rewrite (как у apache)
   location / {
       if (!-e $request_filename ) {
           rewrite ^(.*)$ /index.php?q=$1;
       }
   }

   # указываем наш fastcgi сервер как обработчик
   location ~ \.php$ {
       fastcgi_pass   unix:/var/run/php-fcgi.sock;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/www/default/$fastcgi_script_name;
       include        fastcgi_params;
   }
}

Для хоста файл конфигурации имеет следующее содержимое:

server {
   listen 80;
   server_name mysite.ru *.mysite.ru;

   root /usr/local/nginx/www/mysite.ru;
   index index.php;

   location / {
       if (!-e $request_filename ) {
           rewrite ^(.*)$ /index.php?q=$1;
       }
   }

   location ~ \.php$ {
       fastcgi_pass   unix:/var/run/php-fcgi.sock;
       fastcgi_index  index.php;
       fastcgi_param  SCRIPT_FILENAME  /usr/local/nginx/www/mysite.ru/$fastcgi_script_name;
       include        fastcgi_params;
   }
}

Если понадобится добавить ещё хосты, то надо просто:

  1. создать соответствующий каталог в
  2. создать и отредактировать (см. выше) файл конфигурации для хоста в

Всё! 🙂

Пример¶

См.также

http://chriswu.me/blog/writing-hello-world-in-fcgi-with-c-plus-plus/

Nginx

Примечание

Nginx доступен по адресу http://localhost:8080/

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# default.nginx

server {
    listen 80 default_server;

    root /usr/share/nginx/html;
    index index.html index.htm;

    include includes/fcgi.nginx;
    include includes/static.nginx;
}
1
2
3
4
5
6
7
# fcgi.nginx

location /fastcgi_hello {
    # host and port to fastcgi server
    include         fastcgi.conf;
    fastcgi_pass 172.17.0.895000;
}

fastcgi_param

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

С

Примечание

Компиляция

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/*
 * hello.cpp
 * Copyright (C) 2015 uralbash <root@uralbash.ru>
 *
 * Distributed under terms of the MIT license.
 */
#include "fcgi_stdio.h"
#include <stdlib.h>

int main(void)
{
    while(FCGI_Accept() >= )
    {
        printf("Content-type: text/html\r\nStatus: 200 OK\r\n\r\nHello World!");
    }

    return ;
}

Запуск fcgi сервера на 5000 порту

spawn-fcgi -p 5000 -n hello.fcgi

Примечание

Пример доступен по адресу http://localhost:8080/fastcgi_hello

Troubleshooting

See the status of the Apache daemon with systemctl.

Apache logs can be found in

/run/httpd not being created at boot

If as the root user complains about «unsafe path transition», check ownership of your root directory.

ls -la /
chown root:root /

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.

If when loading the fails, and you get an error like this in the journal:

Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.

This is because PHP includes support for a module that is not threadsafe, and you are trying to use a threaded MPM. One solution to fix this is to use a non-threaded MPM. Try replacing with :

/etc/httpd/conf/httpd.conf
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

and restart .

AH00534: httpd: Configuration error: No MPM loaded.

You might encounter this error after a recent upgrade. This is only the result of a recent change in that you might not have reproduced in your local configuration.
To fix it, uncomment the following line.

/etc/httpd/conf/httpd.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

and restart .

AH00072: make_sock: could not bind to address

This can be caused by multiple things. Most common issue being that something is already listening on a given port, check via netstat that this is not happening:

# netstat -lnp | grep -e :80 -e :443

If you get any output, stop the given service that’s taking up the port or kill the runaway process that is causing the port to be bound, and try again.

Another issue could be that Apache is not starting as root for some reason — try starting it manually and see if you still get the AH0072 error.

# httpd -k start

Finally, you can also have an error with your config and you are listening twice on the given port. Following is an example of a bad config that will trigger this issue:

Listen 0.0.0.0:80
Listen :80

AH01071: Got error ‘Primary script unknown’

This can be caused by in the php-fpm systemd unit file if you are serving files in such as in a virtual host environment. You can disable this feature by and restarting php-fpm. Alternatively, move your document root.

Changing the max_execution_time in php.ini has no effect

If you changed the in to a value greater than 30 (seconds), you may still get a response from Apache after 30 seconds. To solve this, add a directive to your http configuration right before the block:

/etc/httpd/conf/httpd.conf
ProxyTimeout 300

and restart .

Шаг 3 — Настройка Apache для обоих сайтов

В этом разделе мы создадим два файла конфигурации виртуального хоста. Это позволит двум нашим сайтам одновременно работать с двумя разными версиями PHP.

Для обслуживания этого контента Apache необходимо создать файл виртуального хоста с правильными директивами. Вместо изменения файла конфигурации по умолчанию , мы создадим два новых файла в директории .

Вначале создайте новый файл конфигурации виртуального хоста для сайта . Здесь вы предписываете Apache использовать для рендеринга содержимого :

Добавьте в файл следующее: Убедитесь, что путь к директории сайта, имя сервера и версия PHP соответствуют вашей системе:

/etc/apache2/sites-available/site1.your_domain.conf

В этом файле вы изменили на новую директорию и на адрес электронной почты, доступный администратору сайта . Также вы изменили параметр , устанавливающий базовый домен для этой конфигурации виртуального хоста, и добавили директиву для запуска PHP как сервера процессов fastCGI.

Сохраните и закройте файл.

Теперь создайте новый файл конфигурации виртуального хоста для сайта . Для этого субдомена мы будем развертывать :

/etc/apache2/sites-available/site2.your_domain.conf

Сохраните файл и закройте его после завершения. Проверьте файл конфигурации Apache на наличие синтаксических ошибок:

Вывод должен выглядеть так:

Активируйте оба файла конфигурации виртуального хоста:

Отключите сайт по умолчанию, поскольку он не потребуется:

Перезапустите службу Apache, чтобы применить изменения:

Мы настроили Apache для обслуживания каждого из сайтов и теперь протестируем их и убедимся, что на них работают правильные версии PHP.

Опции

Поддержка FastCGI в lighttod предоставляется через модуль fastcgi (mod_fastcgi) который имеет 2 опции в конфигурационном файле: Значение от 0 до 65535 для выставления уровня отладки в FastCGI модуле. На данный момент используются только 0 или 1. Выставите 1 чтобы включить отладку, и 0 чтобы выключить. сообщает модулю куда надо отправлять FastCGI вызовы. каждое расширение файла может отправлять своему собственному FastCGI серверу. Балансировка нагрузки реализуется указанием нескольких FastCGI сервером для одного расширения.

структура секции:

 ( <extension> => 
  ( <handle> => 
    ( "host" => <string> ,
      "port" => <integer> ,
      "socket" => <string>,       # socket
                                  # или пара host+port
      "bin-path" => <string>,     # ОПЦИОНАЛЬНО 
      "bin-environment" => <array>, # ОПЦИОНАЛЬНО 
      "bin-copy-environment" => <array>, # ОПЦИОНАЛЬНО 
      "mode" => <string>,         # ОПЦИОНАЛЬНО
      "docroot" => <string> ,     # ОПЦИОНАЛЬНО если "mode" 
                                  # не "authorizer"
      "check-local" => <string>,  # ОПЦИОНАЛЬНО
      "min-procs" => <integer>,   # ОПЦИОНАЛЬНО
      "max-procs" => <integer>,   # ОПЦИОНАЛЬНО
      "max-load-per-proc" => <integer>, # ОПЦИОНАЛЬНО
      "idle-timeout" => <integer> # ОПЦИОНАЛЬНО
    )
  ), 
  ( <handle> => ... 
  )
 )

<extension>: расширение файла или префикс (если начинается с «/»)<handle>: уникальное имя для этого handle «host» : имя хоста/ip данного FastCGI процесса «port» : tcp-порт на «host» используемый FastCGI процессом «bin-path» : путь к локальному исполняемому файлу FastCGI который должен быть запущен если не используется отдельный FastCGI процесс «socket» : путь к unix-domain socket «mode» : режим FastCGI протокола. По умолчанию это «responder», также есть режим «authorizer» . «docroot» : это опционально, и это docroot (корневая директория для документов) на удалённом хосте для режима «responder» mode. Для режима «authorizer» это ОБЯЗАТЕЛЬНО и указывает на docroot для авторизованных запросов. По причинам безопастности рекомендуется держать этот docroot вне дерева каталога server.document-root. «check-local» : опционально и может быть включено «enable» (по умолчанию) или «disable». Если включено то сервер сначала проверяет файл в локальном server.document-root каталоге и возвращает 404 (Not Found) если такого файла нет. Если выключено, то сервер перенаправляет запрос к FastCGI интерфейсу без этой проверки.
Если указана bin-path:

«min-procs» : выставляет минимальное количество процессов стартующих при запуске «max-procs» : верхний лимит запущенных процессов «max-load-per-proc» : максимальное количество ожидающих процессов до того как запуститься новый процесс «idle-timeout» : количество секунд после прошествия которых неиспользуемый процесс будет уничтожен «bin-environment» : помещает переменную окружения для запускаемого процесса «bin-copy-environement» : очищает переменные окружения и копирует только указанные переменные в новое окружение создаваемого процесса

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector