Назад | Перейти на главную страницу

apache2 + mod_fastcgi + suexec + php5.2 = нестабильно при высокой нагрузке

Я размещаю несколько (~ 30) разных сайтов на одном сервере с apache2 + fastcgi + suexec + php5. Сайты имеют разную нагрузку и разное время выполнения своих скриптов (некоторые из них обрабатывают запрос 5-7 секунд, некоторые <1 сек).

Иногда, когда один сайт получает очень высокую нагрузку (создаются и используются все экземпляры php этого сайта) - зависает весь сервер apache. Apache (worker mpm) создает новые процессы до верхнего предела. Похоже, он начинает ставить в очередь ВСЕ новые запросы для КАЖДОГО сайта, а не только для того, который имеет высокую нагрузку и быстро достигает ограничений процесса ... перезапуск apache решает проблему ...

config: FastCgiConfig -singleThreshold 1 -multiThreshold 10 -listen-queue-depth 30 -maxProcesses 80 -maxClassProcesses 12 -idle-timeout 30 -pass-header HTTP_AUTHORIZATION -pass-header If-Modified-Since -pass-header If-None-Match

(раньше по умолчанию -listen-queue-depth = 100, но это ничего не меняло ...)

Какие-либо предложения?

Другой вопрос - как реализована эта очередь прослушивания? это одна очередь для всего apache или уникальная очередь для каждого определенного приложения php (сайт suexec)?

Я хотел бы добиться чего-то вроде этого: когда один сайт получает высокую нагрузку и его очередь заполнена - сервер отклоняет следующий запрос, но только для этого одного сайта .. Другие сайты должны работать правильно ...

Apache 2.4 предлагает новый прокси-модуль fastcgi (mod_proxy_fcgi), который может проксировать запросы к php-fpm. Использование mod_proxy в качестве посредника означает, что у вас есть доступ ко всем параметрам mod_proxy, включая параметры очереди и истощения, отдельно от основного сервера.

Я бы посоветовал вам установить его на тестовом сервере с MPM событий apache 2.4 и php-fpm; вы также можете настроить каждый пул php для разных приложений.

Здесь вы можете просмотреть серию веб-руководств: 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, так что, возможно, уже доступна некоторая система квот; быстрое прочтение документации ничего не дало.

А вы вместо этого пробовали mod_fcgid? Он намного лучше справляется с высокой нагрузкой на ваш сервер.