I’m using Ubuntu 20.04, I’ve experienced exactly same problem — only one version of PHP was showing up, the latest one. I tried to setup three PHP versions to run with the same Apache simultaneously.
It looked to me as if SetHandler line for all three configs was set to the same value of last loaded config file.
Config files was listed in following order in directory:
- /etc/apache2/conf-enabled/php5.6-fpm.conf
- /etc/apache2/conf-enabled/php7.4-fpm.conf
- /etc/apache2/conf-enabled/php8.1-fpm.conf
Apache logs showed, every virtualhost I’ve created, which was supposed to run different version of PHP, was trying to connect to the same unix socket of php8.1.
Alfredos answer didn’t solve the problem on its own for me.
Solution which worked for me was switching from using unix sockets to TCP sockets, as form of communication between apache2 and php-pfm.
To do that, I’ve modified those three files to set ip and listening port of php-pfm.
in file:
/etc/php/5.6/fpm/pool.d/www.conf
listen = 127.0.0.1:9056
in file:
/etc/php/7.4/fpm/pool.d/www.conf
listen = 127.0.0.1:9074
in file:
/etc/php/8.1/fpm/pool.d/www.conf
listen = 127.0.0.1:9081
To reflect above changes in Apache, I’ve modified files: /etc/apache2/conf-enabled/php*-fpm.conf and /etc/apache2/sites-enabled/php*.mydomain.conf so Apache can connect to proper ip/port. Config files incorporates Alfredos answer.
file /etc/apache2/conf-enabled/php5.6-fpm.conf looks like this:
<IfModule !mod_php5.c>
<IfModule proxy_fcgi_module>
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://localhost:9056"
</If>
</FilesMatch>
<FilesMatch ".+.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^.ph(p[3457]?|t|tml|ps)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
file /etc/apache2/conf-enabled/php7.4-fpm.conf looks like this:
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://localhost:9074"
</If>
</FilesMatch>
<FilesMatch ".+.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
file /etc/apache2/conf-enabled/php8.1-fpm.conf looks like this:
<IfModule !mod_php8.c>
<IfModule proxy_fcgi_module>
<IfModule setenvif_module>
SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
</IfModule>
<FilesMatch ".+.ph(ar|p|tml)$">
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9081"
</If>
</FilesMatch>
<FilesMatch ".+.phps$">
Require all denied
</FilesMatch>
<FilesMatch "^.ph(ar|p|ps|tml)$">
Require all denied
</FilesMatch>
</IfModule>
</IfModule>
My virtual hosts files looks like this:
/etc/apache2/sites-enabled/php56.mydomain.com.conf :
<VirtualHost *:80>
ServerName php56.mydomain.com
ServerAlias www.php56.mydomain.com
DocumentRoot /var/www/php56
<Directory /var/www/php56>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch .php$>
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9056"
</If>
</FilesMatch>
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/php56.error.log
CustomLog ${APACHE_LOG_DIR}/php56.access.log combined
</VirtualHost>
/etc/apache2/sites-enabled/php74.mydomain.com.conf :
<VirtualHost *:80>
ServerName php74.mydomain.com
ServerAlias www.php74.mydomain.com
DocumentRoot /var/www/php74
<Directory /var/www/php74>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch .php$>
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9074"
</If>
</FilesMatch>
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/php74.error.log
CustomLog ${APACHE_LOG_DIR}/php74.access.log combined
</VirtualHost>
/etc/apache2/sites-enabled/php81.mydomain.com.conf :
<VirtualHost *:80>
ServerName php81.mydomain.com
ServerAlias www.php81.mydomain.com
DocumentRoot /var/www/php81
<Directory /var/www/php81>
Options -Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
<FilesMatch .php$>
<If "-f %{REQUEST_FILENAME}">
SetHandler "proxy:fcgi://127.0.0.1:9081"
</If>
</FilesMatch>
LogLevel debug
ErrorLog ${APACHE_LOG_DIR}/php81.error.log
CustomLog ${APACHE_LOG_DIR}/php81.access.log combined
</VirtualHost>
For reference:
#apache2 -v
Server version: Apache/2.4.41 (Ubuntu)
Server built: 2021-10-14T16:24:43
I hope it helps and spare You some time.
EDIT:
To answer your question, is there an error in your config. Line with SetHandler may be a problem if you use TCP sockets, because port is not specified and that could cause Apache trying to connect to same PHP version.
Where else to look for:
Check if you have proper SetHandler lines in those files as well: /etc/apache2/sites-enabled/php*.mydomain.conf
Check if SetHandler lines from above files match «listen» lines from following files:
/etc/php/*/fpm/pool.d/www.conf
- Forum
- The Ubuntu Forum Community
- Ubuntu Specialised Support
- Ubuntu Servers, Cloud and Juju
- Server Platforms
- [ubuntu] ERROR: Module fcgid does not exist!
-
I’m not sure what’s going on or how to get this to work.
I am running Ubuntu 10.04 x86 64 bit Desktop.I want to accomplish setting up a virtual host environment for education reasons.
How may I accomplish this?
So far I am going by this following guide: http://howtoforge.net/how-to-set-up-…n-ubuntu-10.04 But when I get to the part of entering the command in the terminal «a2enmod fcgid» I get the following error: «ERROR: Module fcgid does not exist» I’ve been pulling my hair and spent a ton of time trying out how to set up suexec and virtual hosting
.
-
Re: ERROR: Module fcgid does not exist!
Any one, have the answer to this ? At least on how to get the fcgid Module installed… after installing do I need to restart to activate it?
Bookmarks
Bookmarks

Posting Permissions
Самыми распространенными ошибками mod_fcgid являются «Premature end of script headers», «can’t lock process table in pid», «can’t apply process slot», «couldn’t bind unix domain socket», «exit(communication error), get unexpected signal 11″…
Причины этих ошибок могут быть разные, от неправильных прав на файлы до неполной загрузки файла на сервер, не правильно написанного скрипта и неправильного режима передачи файла ASCII/Двоичный. Иногда бывает проблема кроется в переводе строк Windows формата, в этом случае может помочь команда col -bx <input_file> output_file (скобки обязательны!) или редактор notepad++ «Конверсия конца строки«.
Но когда mod_fcgid в целом работает нормально, а «Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: …» и «Premature end of script headers: php-fcgi-wrapper, referer: …» продолжают регулярно появляться в error_log, при этом php_errors.log и /var/log/httpd/suexec.log не предоставляет никакой дополнительной информации, то копать нужно глубже — /var/log/messages или /var/log/kernel.log.
Chapter 1. Connection reset by peer: mod_fcgid: error reading data from FastCGI server
[Fri Dec 16 04:30:14.424452 2016] [fcgid:warn] [pid 26593] (104)Connection reset by peer: [client 127.0.0.1:42657] mod_fcgid: error reading data from FastCGI server, referer: http://example.com/install/index.php?restart=true [Fri Dec 16 04:30:14.424564 2016] [core:error] [pid 26593] [client 127.0.0.1:42657] End of script output before headers: index.php, referer: http://example.com/install/index.php?restart=true |
Если увеличение значений в FcgidProcessLifeTime, FcgidIOTimeout, FcgidIdleTimeout, FcgidBusyTimeout, не решает проблему, тогда нужно смотреть, а не используются ли PHP акселераторы типа APC. Например при использовании opcache в PHP 7 установка PrestaShop 1.7 обламывалась с ошибкой «Connection reset by peer: mod_fcgid: error reading data from FastCGI server«, в php.ini была указана директория для дополнительного кеширования байткода «opcache.file_cache=/var/www/.tmp
«, но после того, как «;opcache.file_cache=/var/www/.tmp
» была закомментирована — проблема исчезла.
Section 1. Причина №1 — неправильные «чмоды»
Основной причиной, как правило, появления этой ошибки может быть нехватка прав/полномочий на выполнение FastCGI скрипта, РНР в нашем случае.
Права на домашний каталог юзера в котором лежат файлы сайта должны быть 0755 и не меньше, а иначе будет «форбайден» (НТТР 403: 13PermissionDenied — Httpd Wiki), на файл же выполняющий обработку (онже FcgidWrapper) CGI скриптов «чмоды» (chmod) как минимум 750.
Если не помогло, смотрим иные варианты…
Section 2. Причина №2 — нахватка системных ресурсов
Например, первые ошибки mod_fcgid мы получили в error_log «Fri Mar 08 13:42:10 2013«:
[Fri Mar 08 13:42:10 2013] [warn] [client 81.83.хх.ххх] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: ... [Fri Mar 08 13:42:10 2013] [error] [client 81.83.хх.ххх] Premature end of script headers: php—fcgi—wrapper, referer: ... |
Тогда открываем /var/log/messages или /var/log/kernel, находим системные события происходившие в упомянутое выше время вплоть до секунды и смотрим что же там творилось до и после ошибки php-cgi: http://pastebin.com/Gz5ccSNV
Как видим OOM Killer (oom-killer) начал прибивать процессы уже когда памяти совсем не осталось. OOM Killer — это реализация «Out of memory Killer» на уровне ядра Linux.
Виртуальной памяти (swap) в системе может быть немеряно, разумеется в пределах адресации HDD, а вот оперативной (RAM-ы) вполне ограниченное её количество. Бывают ситуации когда «чилды» (форки) процессов системы поедают ее всю (swap + RAM), и тут OOM Killer начинает среди процессов, кроме kernel init и threads, такой, который по его (oom-killer) мнению является самым ущербным (badness) и начинает его убивать.
В примере выше как раз возникла именно такая ситуация, когда «Free swap = 0kB» процессами (их чилдами/форками httpd-олигархов) httpd и php-cgi съедена вся память включая файл подкачки, «Swap is 100% used» и «Memory is 99% used» — обычно в таких ситуациях система уходит в нирвану и прекращает отвечать/реагировать на внешние команды.
Для решения проблемы поедания памяти рекомендуется снизить число чилдов (CHILDREN) апача и PHP, если PHP_FCGI_CHILDREN больше 2. Понизить значение PHP_FCGI_CHILDREN, а в случае использования PHP акселераторов типа APC и т.д. установить PHP_FCGI_CHILDREN = 0 ибо как сказано в секции «Special PHP considerations» официального мана mod_fcgid, чтоPHP акселератор APC не в состоянии расшаривать свой кэш для PHP модуля mod_fcgid если mod_fcgid/PHP использует управление процессами! Про иные акселераторы ничего не сказано, но всё же если используются любые акселераторы, то лучше управление процессами оставить на совести httpd демона.
Второй способ побороть ошибки «Connection reset by peer: mod_fcgid: error reading data from FastCGI server» и «Premature end of script headers: php-fcgi-wrapper» — это не устанавливать слишком высокое значение в PHP_FCGI_MAX_REQUESTS, которое по умолчанию равно = 500. Вместе с этим использовать директиву FcgidMaxRequestsPerProcess, значение которой должно быть <= PHP_FCGI_MAX_REQUESTS — т.е. если PHP_FCGI_MAX_REQUESTS = 1000, то и значение FcgidMaxRequestsPerProcess должно быть = 1000 или меньше, по умолчанию количество запросов отправляемых в php-cgi не контролируется, т.е. FcgidMaxRequestsPerProcess = 0.
В некоторых случаях помогает увеличение РНР лимита в php.ini, в директивах «max_execution_time = 180«, «max_input_time = 120» и «default_socket_timeout = 180«, а также установкой «FcgidIOTimeout 300» и «FcgidBusyTimeout 500» в vi /etc/httpd/conf/httpd.conf или же конфиге виртуального хоста — разумеется под каждые конкретные условия значения подбираются экспериментальным путём.
Следующим шагом будет выбор стратегии выделения памяти (OVERCOMMIT_GUESS (0), OVERCOMMIT_ALWAYS (1), OVERCOMMIT_NEVER (2)) отличной от стратегии по умолчанию. По умолчанию sysctl -w vm.overcommit_memory=0 система пытается оценить объем свободной памяти, а на практике же удовлетворяет все запросы к памяти до момента её полной утечки, после чего вызывает упомянутый выше OOM Killer (oom-killer) уже тогда, когда система ушла в нирвану «Free swap = 0kB», «Swap is 100% used» и «Memory is 99% used».
vm.overcommit_memory=1 почти тоже что и = 0, только теперь уже система не пытается оценивать объем свободной памяти, а делает вид, что её всегда хватает до момента её полной утечки. vm.overcommit_memory=2 запретит выделять больше памяти чем имеется в файле подкачки и больше оперативной памяти в процентном соотношении указанном в параметре vm.overcommit_ratio=?. Также можно вырубить эвристический поиск ущербного процесса для убивания, по умолчанию vm.oom_kill_allocating_task=0 (OOM Killer) сканирует весь список задач и на основе своего эвристического алгоритма выбирает процесс для убивания, что отнимает дополнительные ресурсы системы. Значение выше 0 запрещает сканировать список задач и говорит «OOM Killer-у» уничтожать любой процесс запросивший больше РАМ-ы чем имеется в наличии.
sysctl —w vm.overcommit_memory=2 sysctl —w vm.overcommit_ratio=90 sysctl —w vm.oom_kill_allocating_task=1 |
Для изменений на постоянной основе добавим в /etc/sysctl.conf. Ещё как вариант можно сделать ещё один файл подкачки, на случай вонючий:)
dd if=/dev/zero of=/root/swap1 bs=1024 count=1024K 1048576+0 records in 1048576+0 records out 1073741824 bytes (1.1 GB) copied, 8.61173 s, 125 MB/s mkswap /root/swap1 Setting up swapspace version 1, size = 1048572 KiB no label, UUID=ba18ffde—b25b—4844—9da4—6fd095c9182f swapon /root/swap1 vi /etc/fstab /root/swap1 swap swap defaults 0 0 |
Chapter 3. mod_fcgid: can’t lock process table in pid
Это сообщение «mod_fcgid: can’t lock process table in pid» (mod_fcgid: не может заблокировать таблицу процессов в pid) может возникать тогда, когда регулярно используется команда «apachectl graceful» — т.е. перезапуск без разрыва текущих соединений, а её выполнение попадает во время интенсивного использования/нагрузки сервера.
Chapter 4. mod_fcgid: can’t apply process slot
«mod_fcgid: can’t apply process slot» — mod_fcgid не может выделить слот для процесса…
Section 1. Причина №1 — проблемы сегментации
В лог файл виртуального хоста получили «[warn] [client 78.159.53.233] mod_fcgid: can’t apply process slot for /var/www/user/php/php-cgi-wrapper, referer: https://www.google.com.ua/«, а в лог файл самого сервера множественные «[crit] (22)Invalid argument: ap_queue_pop failed«.
Ошибкой «Invalid argument: ap_queue_pop failed» в лог файл /var/log/httpd/error_log нагадило мегов на 300 с лишним за какие-то считанные минуты. Этой ошибке предшествовали сообщения «[alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread» и «[notice] child pid 2839 exit signal Segmentation fault (11) Error in my_thread_global_end(): 1 threads didn’t exit«.
На ibm.com рекомендовалось увеличить значение «sysctl -w kernel.threads-max=120000» (по умолчанию 3525 в CentOS 6 и 7877 в CentOS 5) и уменьшить «stack size» с 10240 кб до «ulimit -s 256«.
Размер для каждого потока «thread» равен размеру «stack size», а если Apache запущен как Workerи завышены значения MaxClients, MinSpareThreads, MaxSpareThreads и ThreadsPerChild, в условиях нехватки памяти, то получим «[alert] (11)Resource temporarily unavailable: apr_thread_create: unable to create worker thread Error in my_thread_global_end(): 1 threads didn’t exit»
Можно увеличить kernel.threads-max, но «stack size» лучше оставить как есть, а иначе на некоторых страницах сайта это может вызывать ошибку «exit(communication error), get unexpected signal 11«! Однако принимая во внимание предыдущий абзац, «stack size» можно попробовать урезать в 3-5 раза или же урезать ThreadsPerChild если продолжаем получать «Resource temporarily unavailable: apr_thread_create: unable to create worker thread«.
Установить ограничение для «stack size» на постоянной основе можно в конф. файле /etc/security/limits.conf:
.... * soft stack 2048 apache hard stack 5120 # End of file |
В примере выше мягкий лимит на «stack size» для всех установлен в 2 МБ, а для пользователя apache ограничен жестким лимитом в 5 МБ. После изменения лимитов с помощью «ulimit -s 256» нужно остановить и снова запустить сервер «service httpd stop && service httpd start«, чтобы изменения вступили в силу, изменения в /etc/security/limits.conf вступят в силу после перезагрузки ОС!
Section 2. Причина №2 — проблема конфигурации
…»mod_fcgid: can’t apply process slot» может быть связана не только с ошибками сегментации, но и с другими причинами такими, как например конфигурация самого mod_fcgid. Рядом с ошибкой «mod_fcgid: can’t apply process slot» граничит и «apache https 503» (ака «Service Unavailable»).
Основную погоду делают параметры:
- FcgidMaxProcesses — максимально допустимое число php-cgi процессов запущенных одновременно;
- FcgidMaxProcessesPerClass — максимально допустимое число php-cgi процессов для каждого класса.
PerClass-ом в Апаче, имхо … как я понимаю, считается базовый хост и все его виртуальные хосты. Значит, если FcgidMaxProcessesPerClass 2, а виртуальных хостов у нас 15 + 1 базовый хост, то в итоге получаем 32 php-cgi процесса, но если FcgidMaxProcesses (1000 по умолчанию) будет ниже 32, то в итоге в лог можем получить «mod_fcgid: can’t apply process slot», а в браузер «503 Service Unavailable».
В некоторых случаях (зависит от нагрузки) значение FcgidMaxProcessesPerClass должно быть не меньше 3-5.
Chapter 5. exit(communication error), get unexpected signal 11
Эта ошибка результат уменьшения «stack size»:
less /var/log/httpd/error_log [Sun Nov 03 00:40:30 2013] [error] mod_fcgid: process /var/www/wrs/php/php—cgi—w rapper(2558) exit(communication error), get unexpected signal 11 [Sun Nov 03 00:40:30 2013] [warn] [client xxx.xxx.xxx.xxx] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server, referer: http://example. com [Sun Nov 03 00:40:30 2013] [error] [client xxx.xxx.xxx.xxx] Premature end of script headers: index.php, referer: http://example.com/ less /var/log/messages Nov 3 00:56:21 samp kernel: php—cgi[2666]: segfault at 7fffe9034f30 ip 00000000004740c3 sp 00007fffe9034ef0 error 6 in php—cgi[400000+341000] |
Premature end of script headers / exit(communication error), get unexpected signal 11 в некоторых случаях может возникать из-за PHP акселераторов типа APC, обычно отсутствует если PHP работает «Как модуль APACHE».
Примечательно, что данная ошибка может проявляться только на некоторых страницах, обычно больших по размеру, где, например, может быть много кода раскрашиваемого Geshi плагином. Часто такие страницы создают большую нагрузку на ЦП и превысив всевозможные лимиты вызывают segfault.
Chapter 6. user mismatch (daemon instead of www)
Связанные ошибки:
/home/user/logs/error_log [Mon Dec 16 12:36:19.011343 2013] [fcgid:warn] [pid 17033:tid 2183892224] [clien t 178.94.242.15:54550] mod_fcgid: error reading data, FastCGI server closed conn ection [Mon Dec 16 12:36:19.016230 2013] [core:error] [pid 17033:tid 2183892224] [clien t 178.94.242.15:54550] End of script output before headers: writetest.php — logs/error_log suexec policy violation: see suexec log for more details — logs/suexec_log [2013—12—16 12:36:19]: user mismatch (daemon instead of www) |
Ошибка вызвана несовпадением имени пользователя указанного в директиве AP_HTTPD_USER, имя которого можно узнать выполнив «suexec -V«, с именем пользователя, которое указано в /var/www/conf/httpd.conf.
В данном случае AP_HTTPD_USER для suexec = www, а имя указанное в httpd.conf = daemon. Решение: в конфиге /var/www/conf/httpd.conf, в директивах User и Group указать имя www вместо daemon.
Chapter 7. mod_fcgid: couldn’t bind unix domain socket /var/www/logs/fcgidsock/29944.19
Сопутствующие ошибки:
[Mon Dec 16 12:40:29.310746 2013] [fcgid:warn] [pid 29944:tid 665836768] (13)Per mission denied: mod_fcgid: spawn process /home/user/php/php—cgi—wrapper error [Mon Dec 16 12:40:30.344063 2013] [fcgid:error] [pid 29944:tid 665836768] (13)Pe rmission denied: mod_fcgid: couldn‘t bind unix domain socket /var/www/logs/fcgid sock/29944.19 |
Решается сменой прав на каталог «chmod 777 /var/www/logs/fcgidsock/» или же сменой каталога директивой FcgidIPCDir
…
Если есть ещё какие вопросы по другим ошибкам mod_fcgid, то пишем в комментарии…
Chapter 8. Ссыль по теме:
- mod_fcgid — Apache HTTP Server
- Documentation for /proc/sys/vm/*
В статье рассказывается, как установить web сервер Apache2 c mod_fcgid и PHP5 на ubuntu 10.04
mod_fcgid –является более современной альтернативой mod_fastcgi. Одним из его неоспоримых полюсов, это возможность выполнять php скрипы с правами владельца скрипта, а не пользователя от имени которого работает Apache.
Подготовка:
Для примера будет использоваться Ubuntu 10.04 с установленными последними обновлениями. Также в качестве наглядности будет подняты виртуальные хосты с именами example1.org и example2.org
Заходим в систему как root:
sudo su
Перенастраиваем пакет dash
dpkg-reconfigure dash
В открывшимся окне выбираем НЕТ
Для нормальной работы, нам необходимо остановить и затем и убрать из системы AppArmor:
/etc/init.d/apparmor stop
update-rc.d -f apparmor remove
aptitude remove apparmor apparmor-utils
Устанавливаем необходимые пакеты – Apache, PHP5, mod_fcgi
aptitude install apache2 php5-cgi libapache2-mod-fcgid apache2-suexec
Лирическое отступление, если в вашей системе уже установлен Apache2 с PHP5, то нам необходимо отключить модуль PHP.
Теперь нам необходимо активировать –mod_rewrite, suexec, include, fcgid
a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgid
редактируем файл /etc/php5/cgi/php.ini
nano /etc/php5/cgi/php.ini
найти и снять комментарий со строки
cgi.fix_pathinfo=1
сохраняем изменения, выходим
Далее нам необходимо отредактировать файл /etc/apache2/mods-available/fcgid.conf
nano /etc/apache2/mods-available/fcgid.conf
Необходимо добавить строку PHP_Fix_Pathinfo_Enable 1
Чтобы секция <IfModule mod_fcgid.c> выглядила как указано ниже ( в отличии от предыдущих версий ubuntu)
<IfModule mod_fcgid.c>
AddHandler fcgid-script .fcgi
FcgidConnectTimeout 20
PHP_Fix_Pathinfo_Enable 1
</IfModule>
Перезапускаем Apache
/etc/init.d/apache2 restart
Если все прошло без ошибок идем дальше.
Создаем виртуальные хосты для сайтов: example1.org и example2.org
Для начала, добавим в систему новых пользователей и группы, отключив им доступ к командной строке (в целях безопасности)
groupadd example1
groupadd example2
useradd -s /bin/false -d /var/www/example1 -m -g example1 example1
useradd -s /bin/false -d /var/www/example2 -m -g example2 example2
Создадим домашние директории нашим пользователям
mkdir -p /var/www/example1/web
chown example1:example1 /var/www/example1/web
mkdir -p /var/www/example2/web
chown example2:example2 /var/www/example2/web
Попробуем запустить PHP используя suExec с помощью команды:
/usr/lib/apache2/suexec –V
Должно выдать, то что указано ниже, корневая директория WEB сервера находится /var/www/
- root@ubuntu:/home/admin# /usr/lib/apache2/suexec -V
- -D AP_DOC_ROOT=»/var/www»
- -D AP_GID_MIN=100
- -D AP_HTTPD_USER=«www-data»
- -D AP_LOG_EXEC=»/var/log/apache2/suexec.log»
- -D AP_SAFE_PATH=»/usr/local/bin:/usr/bin:/bin»
- -D AP_UID_MIN=100
- -D AP_USERDIR_SUFFIX=«public_html»
- root@ubuntu:/home/admin#
Для справки:
Данная система не может использовать бинарнарники, которые находятся в /usr/lib/cgi-bin/php т.к. они находятся вне корневой директории сайта. suExec-не поддерживает использование символических ссылок (symlinks) по этому мы будем создавать для каждого сайта отдельную директорию для выполнения скриптов, хозяином которой будет являться пользователь, от имени которого эти скрипты выполняются.
mkdir -p /var/www/php-fcgi-scripts/example1
mkdir -p /var/www/php-fcgi-scripts/example2
nano /var/www/php-fcgi-scripts/example1/php-fcgi-starter
Добавляем в него следующее содержимое
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
Для второго сайта тоже самое:
nano /var/www/php-fcgi-scripts/example2/php-fcgi-starter
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
php-fcgi-starter скрипт должен быть исполняемым, а директории в которых он находится, должны быть открыты для записи.
chmod 755 /var/www/php-fcgi-scripts/example1/php-fcgi-starter
chmod 755 /var/www/php-fcgi-scripts/example2/php-fcgi-starter
chown -R example1:example1 /var/www/php-fcgi-scripts/example1
chown -R example2:example2 /var/www/php-fcgi-scripts/example2
Создаем виртуальные хосты Apache2 для сайтов example1.org и example2.org
nano /etc/apache2/sites-available/example1
<VirtualHost *:80>
ServerName example1.org
ServerAlias www.example1.org
ServerAdmin webmaster@example1.org
DocumentRoot /var/www/example1/web/
<IfModule mod_fcgid.c>
SuexecUserGroup example1 example1
<Directory /var/www/example1/web/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/php-fcgi-scripts/example1/php-fcgi-starter .php
Order allow,deny
Allow from all
</Directory>
</IfModule>
ErrorLog /var/www/example1/error.log
CustomLog /var/www/example1/access.log combined
ServerSignature Off
</VirtualHost>
nano /etc/apache2/sites-available/example2
<VirtualHost *:80>
ServerName example2.org
ServerAlias www.example2.org
ServerAdmin webmaster@example2.org
DocumentRoot /var/www/example2/web/
<IfModule mod_fcgid.c>
SuexecUserGroup example2 example2
<Directory /var/www/example2/web/>
Options +ExecCGI
AllowOverride All
AddHandler fcgid-script .php
FCGIWrapper /var/www/php-fcgi-scripts/example2/php-fcgi-starter .php
Order allow,deny
Allow from all
</Directory>
</IfModule>
ErrorLog /var/www/example2/error.log
CustomLog /var/www/example2/access.log combined
ServerSignature Off
</VirtualHost>
Активируем виртуальные хосты
a2ensite example1
a2ensite example2
Перезапускаем Apache, чтобы изменения вступили в силу:
/etc/init.d/apache2 reload
Теперь необходимо все это протестировать
Создаем в каждой директории тестовый скрипт
nano /var/www/example1/web/test.php
С таким содержимым:
<?php
phpinfo();
?>
Теперь мы можем зайти на наш сервер, набрав example1.org/test.php
( если у вас еще нет домена, а потренироваться очень хочется, то можно добавить запись в файл hosts, XXX.XXX.XXX.XXX example1.org -где XXX. IP вашего виртуального сервера)
В секции Server API видно с помощью чего выполняются php скрипты.
Легкий тюнинг, файла php.ini
Т.к. у нас скрипты выполняются из разных директорий, то и настройки PHP у них должны быть свои, на примере сайта example2.org рассмотрим эту ситуацию.
cp /etc/php5/cgi/php.ini /var/www/example2/
chown example2:example2 /var/www/example2/php.ini
Теперь можно модифицировать совершенно спокойно фал /var/www/example2/php.ini
Он для данного виртуального хоста свой и не зависит от основного файла.
Теперь нам необходимо открыть /var/www/php-fcgi-scripts/example2/php-fcgi-starter
nano /var/www/php-fcgi-scripts/example2/php-fcgi-starter
И заменить значения на наши:
#!/bin/sh
PHPRC=/var/www/example2/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php
сохраняем и выходим
перезапускаем Apache
/etc/init.d/apache2 reload
Создаем тестовый файл
nano /var/www/example2/web/test.php
С содержимым
<?php
phpinfo();
?>
Протестируем наш сайт example2.org/test.php, нас интересует строка Loaded Configuration File в которой будет указано место расположения /var/www/example2/php.ini
Изменение настроек PHP
nano /var/www/php-fcgi-scripts/example2/php-fcgi-starter
( для примера если необходимо отключить magic_quotes_gpc, для сайта example2.org добавляем в файл)
#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php -d magic_quotes_gpc=off
перезапустим Apache
/etc/init.d/apache2 reload
Снова заходим на наш тестовый сайт example2.org/test.php
И находим строку magic_quotes_gpc теперь она у нас в положении OFF, т.е. выключено.
Тоже самое можно проделать и с первым виртуальным хостом, тогда сайты будут работать независимо друг от друга и иметь собственные настройки php.
Mod Fcgid
Mod Fcgid is an apache module that enables it to talk to fastcgi enabled application. It can be used to setup with apache to run php over fastcgi. It is an alternative to the older mod_fastcgi and has some differences with it.
In this post we shall be setting up apache with php using this module. You can also setup apache + php with mod_fastcgi.
Since fastcgi keeps php execution out of apache, we are free to use a thread based mpm like mpm worker.
Install
For the setup we need apache, php (with cgi binary), mod_fcgid, mpm worker. Install them right away from the commandline.
# sudo apt-get install apache2 libapache2-mod-fcgid apache2-mpm-worker php5 php5-cgi
Enable mod_fcgid
# sudo a2enmod fcgid
Locate configuration files
After installing the necessary packages, its time to configure mod_fcgid. The configuration is mostly done through various configuration files. Therefore its important to know where the configuration files are.
The apache configuration file on ubuntu/debian is located at the following path
/etc/apache2/sites-available/default
To find out the location of apache configuration file for your distro, use the apache2/httpd/apachectl command.
# apachectl -S apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName VirtualHost configuration: wildcard NameVirtualHosts and _default_ servers: *:80 is a NameVirtualHost default server 127.0.1.1 (/etc/apache2/sites-enabled/000-default:1) port 80 namevhost 127.0.1.1 (/etc/apache2/sites-enabled/000-default:1) Syntax OK
So the configuration file is at /etc/apache2/sites-enabled/000-default.
Configure Fcgid
Apache needs to configured to use mod_fcgid to process all «.php» files and mod_fcgid needs to be told the location of the php fastcgi binary, which is php-cgi located at
/usr/bin/php-cgi
Add the following configuration to the root directory section in the vhost block
<Ifmodule mod_fcgid.c> # FCGID registers a handler named fcgid-script AddHandler fcgid-script .php Options +ExecCGI FcgidWrapper /usr/local/bin/php-fcgid-wrapper </IfModule>
This tells apache to use the wrapper script to launch fastcgi process php-cgi. It also tells apache to run .php files using fcgid handler.
To control the fcgid settings like maximum number of processes, add the relevant settings outside the vhost block.
<Ifmodule mod_fcgid.c> # Context - server config FcgidMaxProcesses 150 # Otherwise php output shall be buffered FcgidOutputBufferSize 0 </IfModule>
These settings apply to the server context and hence must be outside any Vhost block.
Wrapper script
Now the wrapper script that is used by mod_fcgid to launch php-cgi processes.
#!/bin/sh # Set desired PHP_FCGI_* environment variables. # Example: # PHP FastCGI processes exit after 500 requests by default. PHP_FCGI_MAX_REQUESTS=10000 export PHP_FCGI_MAX_REQUESTS # Replace with the path to your FastCGI-enabled PHP executable exec /usr/bin/php-cgi
We are storing the wrapper script at /usr/local/bin/php-fcgid-wrapper but it can be stored anywhere and the path has to be mentioned in apache configuration.
Make the wrapper script executable using chmod
/usr/local/bin# chmod +x php-fcgid-wrapper
Otherwise you get an error in your apache log like this
[Tue Jun 11 02:53:20 2013] [warn] [client 127.0.0.1] (104)Connection reset by peer: mod_fcgid: error reading data from FastCGI server [Tue Jun 11 02:53:20 2013] [error] [client 127.0.0.1] Premature end of script headers: server.php
Also make sure not to use the «PHP_FCGI_CHILDREN» setting. The php-cgi binary can fork out multiple child processes and manage them, but fcgid will not pass more than a single request to the php-cgi binary at a time, hence the child processes wont be used. This is explained in the documentation
PHP child process management (PHP_FCGI_CHILDREN) should always be disabled with mod_fcgid, which will only route one request at a time to application processes it has spawned; thus, any child processes created by PHP will not be used effectively. (Additionally, the PHP child processes may not be terminated properly.) By default, and with the environment variable setting PHP_FCGI_CHILDREN=0, PHP child process management is disabled. The popular APC opcode cache for PHP cannot share a cache between PHP FastCGI processes unless PHP manages the child processes. Thus, the effectiveness of the cache is limited with mod_fcgid; concurrent PHP requests will use different opcode caches.
Also you cannot use APC with fcgid.
References
http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
Apache2 fails to start with libapache2-mod-fcgid: No such file or directory: mod_fcgid
Bug #1266400 reported by
Stephen
on 2014-01-06
This bug affects 2 people
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
libapache2-mod-fcgid (Ubuntu)
|
Confirmed |
Undecided |
Unassigned
|
Bug Description
When I upgraded to saucy, Apache2 failed to start with the full error in /var/log/apache2/error_log:
[Sun Jan 05 07:32:52.418401 2014] [fcgid:emerg] [pid 15690:tid 3074378304] (2)No such file or directory: mod_fcgid: Can’t create shared memory for size 1167812 bytes
This appears to be because the configuration directive for SharememPath used by mod_fcgid is not set correctly in the configuration files. That variable needs to be set to a directory that is created and empty. Such a directory seems to exist: /var/lib/apache2/module/enabled_by_admin/fcgid
I was able to add this to my Apache configuration to solve the issue:
<IfModule mod_fcgid.c>
SharememPath /var/lib/apache2/module/enabled_by_admin/fcgid
</IfModule>
This SharememPath setting should be made by default in /etc/apache2/mods-available/fcgid.conf
ProblemType: Bug
DistroRelease: Ubuntu 13.10
Package: libapache2-mod-fcgid 1:2.3.9-1
ProcVersionSignature: Ubuntu 3.11.0-14.21-generic 3.11.7
Uname: Linux 3.11.0-14-generic i686
ApportVersion: 2.12.5-0ubuntu2.2
Architecture: i386
Date: Mon Jan 6 04:14:00 2014
Dependencies:
gcc-4.8-base 4.8.1-10ubuntu9
libc6 2.17-93ubuntu4
libgcc1 1:4.8.1-10ubuntu9
multiarch-support 2.17-93ubuntu4
InstallationDate: Installed on 2011-06-16 (935 days ago)
InstallationMedia: Ubuntu 11.04 «Natty Narwhal» — Release i386 (20110427.1)
MarkForUpload: True
SourcePackage: libapache2-mod-fcgid
UpgradeStatus: Upgraded to saucy on 2014-01-02 (3 days ago)