apache2 + mod_fastcgi + suexec + php5.2 = нестабильно при высокой нагрузке
Я размещаю несколько (~30) разных сайтов на одном сервере с apache2+fastcgi+suexec+php5. Сайты имеют разную загрузку и разное время выполнения своих сценариев (некоторые из них обрабатывают запрос в течение 5-7 секунд, некоторые <1sek).
Иногда, когда один сайт получает очень высокую нагрузку (все экземпляры php этого сайта создаются и используются) - зависает весь сервер apache. Apache (работник mpm) создает новые процессы вплоть до верхнего предела. Похоже, что он начинает ставить в очередь ВСЕ новый запрос для КАЖДОГО сайта, а не только тот, который имеет высокую нагрузку и быстро достигает ограничений процесса... перезапуск apache решает проблему...
config: FastCgiConfig -singleThreshold 1 -multiThreshold 10 -listen-queue-глубина 30 -maxProcesses 80 -maxClassProcesses 12 -idle-timeout 30 -pass-header HTTP_AUTHORIZATION -pass-header If-Modified-Since -pass-header If-None-Match
(ранее было задано значение по умолчанию -listen-queue-глубина = 100, но это ничего не изменило...)
Какие-либо предложения?
Другой вопрос - как реализована эта очередь прослушивания? это одна очередь для всего apache или уникальная очередь для каждого определенного php приложения (сайт suexec)?
Я хотел бы добиться чего-то вроде этого: когда один сайт получает высокую нагрузку и его очередь переполнена - сервер выполняет следующий запрос, но только для этого одного сайта.. Другие сайты должны работать должным образом...
4 ответа
Apache 2.4 предлагает новый прокси-модуль fastcgi (mod_proxy_fcgi), который может прокси-запросы к php-fpm. Использование mod_proxy в качестве посредника означает, что у вас есть доступ ко всем параметрам mod_proxy, включая параметры очередей и истощения, отделенные от основного сервера.
Я бы посоветовал вам установить его на тестовом сервере с событиями apache 2.4 MPM и php-fpm; Вы также можете настроить каждый пул php для разных приложений.
Вы пытались вместо этого mod_fcgid? Это намного лучше в обработке высокой нагрузки на вашем сервере.
Вы можете просмотреть серию веб-учебников здесь: http://blog.stuartherbert.com/php/category/the-web-platform/
Я лично нахожу это очень проницательным! Возможно, этот урок будет таким же полезным: http://blog.stuartherbert.com/php/2008/10/07/can-you-secure-a-shared-server-with-php-fastcgi/
Я бы рекомендовал честно перенести сайт с большим трафиком на свою машину, если он использует столько ресурсов.
Если fastcgi раскручивает сценарии php как пользовательский процесс, то ОС должна применять определения /etc/security/limits.conf (в частности, nproc).
то есть: apache будет пытаться ускорить процесс от имени этого пользователя, а операционная система остановит процесс, потому что он превысил ограничение процесса.
это своего рода клудж, хотя; если машина в противном случае простаивает, вы все равно будете уничтожать соединения.
почему бы вам просто не подключить своего крупного клиента к выделенной машине? или раскрутить вторичный apache, слушая через высокий порт, с установленным разрешением занимаемой площади / времени выполнения? Вы можете использовать mod_proxy для прозрачной передачи запросов.
тем не менее, я не слишком знаком с fastcgi, поэтому, возможно, уже есть какая-то система квот; хотя быстрое чтение документов ничего не дало.