Demi44
@Demi44
System administrator, devops

Почему могут падать процессы phpб в режиме fast_cgi + apache-worker?

Есть ВПС сервер на базе Debian 8, на нем вертится apache-2.4.10 в режиме mpm-worker
для работы php использую mod_fcgi, без suexec.

PHP 5.6.29-0+deb8u1, без модулей кеширования.

настройки в целом ничего особенного:
<IfModule mod_fcgid.c>
FcgidIPCDir /var/run/mod_fcgid
FcgidProcessTableFile /var/run/mod_fcgid/fcgid_shm
FcgidMaxRequestLen 20000000
FcgidConnectTimeout 10
FcgidIdleTimeout 10
PHP_Fix_Pathinfo_Enable 1
FcgidMaxProcesses 200000
</IfModule>


php-wrapper
#!/bin/bash
PHPRC=$PWD/../etc/php5
export PHPRC
umask 022
export PHP_FCGI_CHILDREN
export PHP_FCGI_MAX_REQUESTS=99999990
SCRIPT_FILENAME=$PATH_TRANSLATED
export SCRIPT_FILENAME
exec /usr/bin/php5-cgi


На сервере 32Гб оперативки + 8 ядер, на ssd дисках. Основной контент немного статики + легкие php скрипты, данные беруться и записываются в redis на том же сервере. На сервере порядка 30 доменов, все работают по одному принципу.

Странность в том, что периодически, по не выясненным причинам, на ходу начинает падать php, сначала идет несколько таких сообщений:

(104)Connection reset by peer: [client 1.1.1.1:29617] mod_fcgid: error reading data from FastCGI server  
[core:error] [pid 8840:tid 47795850016512] [client 1.1.1.1:29617] End of script output before headers: script.php


после чего происходит жесткое падение одного домена (самого нагржуеного)
mod_fcgid: can't apply process slot for /path/to/wrapper/php


При этом остальные домены работают без проблем, для каждого домена свой wrapper.
Лечится на время по разному, но вроде как помогает следующая комбинация
/etc/init.d/apache2 stop
 rm -f /var/run/mod_fcgid/* 
 /etc/init.d/apache2 stop


В скрипт /etc/init.d/apache2 добавил ulimit -s unlimited

Вариант увеличить FcgidMaxProcesses не помогает, все равно периодами падает. Из симптомов еще
- Падает после перезапуска (добавлял домены на сервер - после активации и "reload" для apache2 происходила эта ситуация, так же после ротации логов и просто на ходу.

Есть подозрение что все это как то связано с тайматуами для FCGI и какими то еще лимитами, но не могу понять какими именно, похожий конфиг и с большей нагрузкой есть на другом сервере, но на нем трафика от 2 до 5 раз больше.
Подозреваю что то типа - когда апач рестртуется, релоадится или еще что то, остаются где то в системе подвисшие fcgi таблицы, когда апач стартует, он ожидает от этих таблиц (процессов или как их правильно назвать не знаю) ответа, данных или еще какой то активности, но ее не происходит, в итоге забиваются какие то лимиты и wrapper не может создать еще процессы для обработки запросов, в итоге апач валит 503 и все ложится.
Тут на сервере нагрузка в среднем 30-50 запросов в секунду.
Вариант ставить nginx+php-fpm не рассматриваю так как не вижу смысла, php-fpm не особо отличается от fcgi режима, думаю что при большой нагрузке могут быть похожие проблемы, а тестировать не хочу без серьезных аргументов.

Основная рекомендация в интернете повышать кол-во процессов для FcgidMaxProcesses, но толку нет, так же как и от PHP_FCGI_MAX_REQUESTS.

Так как все остальные домены работают, думаю причина в каких то настройках php, но не могу понять каких. Все домены работают от www-data.
  • Вопрос задан
  • 1035 просмотров
Пригласить эксперта
Ответы на вопрос 1
norguhtar
@norguhtar
Биллинги в телекоме мой конек
Не проще будет переключить на mod_proxy_fcgi + php-fpm? Если использовать Proxy via Handler все реврайты будут работать. Для автоматического перезапуска php-fpm когда он внезапно упал можно использовать supervisord
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽