Я хотел спросить вас об известных вам методах настройки PHP / Apache, их плюсах и минусах. Начну сам:
---------------- PHP как модуль Apache----------------
Плюсы: хорошая скорость, так как не нужно каждый раз запускать exe, особенно в mpm-рабочий Режим. Вы также можете использовать различные Ускорители PHP в этом режиме как APC или eAccelerator.
Минусы: если вы запускаете apache в режиме mpm-worker, вы можете столкнуться с проблемами стабильности, потому что каждый сбой в любом php-скрипте приведет к нестабильности всего пула потоков этого процесса apache. Также в этом режиме все скрипты выполняются от имени пользователя apache. Это плохо для безопасности. Для настройки mpm-worker требуется PHP, скомпилированный в поточно-безопасном режиме. По крайней мере, репозитории CentOS и RedHat по умолчанию не имеют поточно-ориентированной версии PHP, поэтому в этих ОС вам необходимо самостоятельно скомпилировать хотя бы PHP (есть способ активировать рабочий mpm на Apache). Использование потокобезопасных двоичных файлов PHP считается экспериментальным и нестабильным. Кроме того, многие расширения PHP не поддерживают поточно-безопасный режим или не были хорошо протестированы в поточно-безопасном режиме.
---------------- PHP как CGI ----------------
Похоже, это самая медленная конфигурация по умолчанию, которая сама по себе является "мошенничеством";)
---------------- PHP как CGI через mod_suphp ----------------
Плюсы: suphp позволяет выполнять сценарии php от имени владельца файла сценария. Таким образом, вы можете безопасно разделить разные сайты на одной машине. Кроме того, suphp позволяет использовать разные файлы php.ini для каждого виртуального хоста.
Минусы: PHP в режиме CGI означает меньшую производительность. В этом режиме вы не можете использовать ускорители php, такие как APC, потому что каждый раз, когда создается новый процесс, для обработки скрипта, который делает кеш предыдущего процесса бесполезным. Кстати, вы знаете, как применить какой-нибудь ускоритель в этой конфигурации? Я слышал что-то об использовании shm для кеширования байт-кода php. Кроме того, в этом режиме нельзя настроить PHP через файлы .htaccess. Вам нужно будет установить PECL htscanner для этого, если вам нужно установить различные параметры для каждого сценария через .htaccess (директивы php_value / php_flag)
---------------- PHP как CGI через suexec ----------------
Эта конфигурация выглядит так же, как и suphp, но я слышал, что она медленнее и менее безопасна. Применяются почти те же плюсы и минусы.
---------------- PHP как FastCGI ----------------
Плюсы: Стандарт FastCGI позволяет одному процессу php обрабатывать несколько скриптов до того, как процесс php будет убит. Таким образом вы повышаете производительность, так как не нужно запускать новый процесс php для каждого скрипта. Вы также можете использовать ускорители PHP в этой конфигурации (см. Комментарий в разделе «Минусы»). Кроме того, FCGI почти как suphp также позволяет выполнять процессы php от имени некоторого пользователя. mod_fcgid похоже, имеет наиболее полную поддержку fcgi и гибкость для apache.
Минусы: Использование ускорителя php в режиме fastcgi приведет к высокому потреблению памяти, потому что каждый процесс PHP будет иметь свой собственный кеш байт-кода (если нет какого-либо ускорителя, который может использовать общую память для кеша байт-кода. Есть ли такой?). FastCGI также немного сложен в настройке. Вам необходимо создать различные файлы конфигурации и внести некоторые изменения в конфигурацию.
Кажется, что fastcgi - самая стабильная, безопасная, быстрая и гибкая конфигурация PHP, однако ее немного сложно настроить. Но, может быть, я что-то упустил?
Комментарии приветствуются!
Запуск PHP через FastCGI, безусловно, даст вам максимальную гибкость. Вы можете не только безопасно использовать Apache mpm-worker, но и вообще использовать другой веб-сервер (например, nginx).
Но даже при использовании Apache «PHP через FastCGI» на данный момент является не одним вариантом, а как минимум двумя: mod_fastcgi, mod_fcgid. Кроме того, вы можете использовать динамические, статические или внешние процессы FastCGI; с suexec или без него. А еще есть внутренний менеджер процессов FastCGI PHP, который теперь заменен очень красивым PHP-FPM в PHP 5.3. Все эти варианты имеют разные плюсы и минусы и могут привести к разным проблемам.
Имея выбор, я бы выбрал mod_fastcgi с PHP-FPM на данный момент, в основном потому, что он обеспечивает чрезвычайно универсальные и стабильные настройки.
Не совсем отвечаю на ваш вопрос, но я не понимаю, что FastCGI сложно настроить. Он отличается от других методов, которые он должен заменить (mod_php, mod_python, ...), поэтому может потребоваться переписать часть кода. Это может быть сложно, но, по крайней мере, для настройки Apache я считаю, что это несложно. В качестве примера я тестировал приложение WSGI на Python и хотел посмотреть, как оно работает со всеми протоколами, которые поддерживает WSGI. Вот файл виртуального хоста с конфигурациями для всех протоколов (с mod_fastcgi
):
<VirtualHost *:8888>
DocumentRoot "/home/test/"
#FastCGIExternalServer /home/test/wsgi -host 127.0.0.1:3333
#SCGIMount / 127.0.0.1:3333
FastCgiServer /home/test/wsgi/fcgi.py -idle-timeout 60 -processes 1
<Directory "/home/test/wsgi/">
Options +ExecCGI +FollowSymLinks
AddHandler fastcgi-script .py
#AddHandler wsgi-script .py
#AddHandler cgi-script .py
</Directory>
</VirtualHost>
Мне это не кажется сложным. Конечно, FastCGI поддерживает множество опций, и его можно довести до смерти, но это другое дело.
Для запуска от имени другого пользователя используйте suexec и FastCGIWrapper
, тогда это становится:
FastCGIWrapper On
<VirtualHost *:8888>
SuexecUserGroup test test
DocumentRoot "/home/test/"
FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1
<Directory "/var/www/test/">
Options +ExecCGI +FollowSymLinks
AddHandler fastcgi-script .py
</Directory>
</VirtualHost>
И увидеть эта ссылка для настраиваемого php.ini, но вы можете указать его с помощью -initial-env
вариант, т.е.
FastCgiServer /var/www/test/fcgi.py -idle-timeout 60 -processes 1 -inital-env PHPRC=/blah/
Хороший кандидат: Apache 2 ITK MPM
apache2-mpm-itk (для краткости просто mpm-itk) - это MPM (модуль мультиобработки) для веб-сервера Apache. mpm-itk позволяет вам запускать каждый из ваших виртуальных хостов под отдельным идентификатором uid и gid - короче говоря, скрипты и файлы конфигурации для одного виртуального хоста больше не должны быть доступны для чтения для всех других виртуальных хостов.
Очень хорошо работал для одного из наших клиентов с сотнями VirtualHosts с довольно большим количеством посетителей.
Вы получаете все преимущества от запуска PHP как модуля и устраняете некоторые недостатки.
Для меня вопрос в том, какова цель веб-сервера. Обслуживает ли он более одного виртуального хоста? Если это так, то вам нужно пожертвовать производительностью ради изолированной безопасности. Да, производительность действительно страдает, но с сегодняшним оборудованием все равно требуется довольно много трафика, чтобы вызвать серьезные проблемы с производительностью.
Если производительность так важна, запустите один сайт на VPS или выделенном сервере и настройте производительность.