Цель данной статьи показать как добавить поддержку запуска PHP как модуля FastCGI. По результатам некоторых тестов, данная конфигурация является более быстрой чем PHP как модуль Apache (mod_php) и как модуля CGI (mod_cgi). Результаты моих тестов показали, что сайт, где php работает как модуль Apache проигрывает в производительности 1 мс сайту с FastCGI. Так же, конфигурация FastCGI безопаснее, т.к. позволяет запускать Apache от пользователя, отличного от пользователя веб-сервера.
Более детально о том, что такое FastCGI нам может рассказать интернет. Привожу цитату из wikipedia:
Интерфейс FastCGI — клиент-серверный протокол взаимодействия вебсервера и приложения, дальнейшее развитие технологии CGI. По сравнению с CGI является более производительным и безопасным.
FastCGI ликвидирует множество ограничений CGI-программ. Проблема CGI-программ в том, что они должны быть перезапущены веб-сервером при каждом запросе, что приводит к понижению производительности.
FastCGI убирает это ограничение, сохраняя процесс запущенным и передавая запросы этому постоянно запущенному процессу. Это позволяет не тратить время на запуск новых процессов.
В то время как CGI-программы взаимодействуют с сервером через STDIN и STDOUT запущенного CGI-процесса, FastCGI-процессы используют Unix Domain Sockets или TCP/IP для связи с сервером. Это даёт следующее преимущество над обычными CGI-программами: FastCGI-программы могут быть запущены не только на этом же сервере, но и где угодно в сети. Также возможна обработка запросов несколькими FastCGI-процессами, работающими параллельно.
lighttpd включает в себя внутренний распределитель нагрузки FastCGI, который может использоваться для распределения сразу на несколько FastCGI-серверов. В отличие от иных решений, в кластере должен находиться только FastCGI-процесс, а не целый веб-сервер. Это позволяет использовать FastCGI-процессу больше ресурсов, что характерно, например, для load-balancer+apache+mod_php.
При сравнении php-FastCGI с apache+mod_php, необходимо обращать внимание на то, что FastCGI обеспечивает дополнительную безопасность, как, например, запуск FastCGI процесса под пользователем, отличным от пользователя web-сервера, а также может находиться в chroot’е, отличном от chroot’а веб-сервера.
При сравнении perl-FastCGI с apache+mod_perl(1,2), то, кроме вышеуказанного, заметно, что для разделяемого использования памяти между процессами, реализуемого в mod_perl через startup.pl, необходим FastCGI — менеджер процессов, реализованный на Perl. Это реализуется модулем FCGI::ProcManager и надстройкой над ним, FCGI::Spawn.
Установка
Ставить будем из портов:
# cd /usr/ports/www/mod_fcgi
# make install clean
Так же важно убедиться, что PHP поддерживает FastCGI:
# cd /usr/ports/lang/php5
# make showconfig | grep -i FASTCGI
Вы должны увидеть следующую строчку:
FASTCGI=on "Enable fastcgi support (CGI only)"
Если этого нет, то надо будет пересобрать PHP с поддержкой FastCGI.
Настройка
После установки модуля, на экране будут даны инструкции как активировать его в Apache. Для этого надо добавить в файл /usr/local/etc/apache22/httpd.conf следующие строчки:
LoadModule fcgid_module libexec/apache22/mod_fcgid.so
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
FCGIWrapper /usr/local/bin/php-cgi .php
</IfModule>
Пример настройки VirtualHost’a:
<VirtualHost *:8080>
ServerAdmin [email protected]
DocumentRoot "/usr/local/www/domain"
ServerName server.ru
ServerAlias www.server.ru
<Directory "/usr/local/www/domain">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
SetHandler fcgid-script
FCGIWrapper /usr/local/bin/php-cgi .php
Options ExecCGI
Allow from all
</Directory>
</VirtualHost>