Apache module mod_fcgid
Содержание:
- Распределение нагрузки
- Troubleshooting
- Устранение неполадок при открытии файлов FCGI
- Устранение проблем
- [править] Настройка nginx + spawn-fcgi
- Пример¶
- Troubleshooting
- /run/httpd not being created at boot
- Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.
- AH00534: httpd: Configuration error: No MPM loaded.
- AH00072: make_sock: could not bind to address
- AH01071: Got error ‘Primary script unknown’
- Changing the max_execution_time in php.ini has no effect
- Шаг 3 — Настройка Apache для обоих сайтов
- Опции
Распределение нагрузки
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; } }
Если понадобится добавить ещё хосты, то надо просто:
- создать соответствующий каталог в
- создать и отредактировать (см. выше) файл конфигурации для хоста в
Всё! 🙂
Пример¶
См.также
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.soLoadModule 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» : очищает переменные окружения и копирует только указанные переменные в новое окружение создаваемого процесса