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

apache выключается, поскольку достигнуто максимальное количество клиентов

есть серьезная проблема. У меня есть виртуальный сервер, на котором работает Apache, и два веб-проекта с большим количеством посетителей (около 5 обращений в секунду). Мой сервер начинает отключаться сам. В журнале ошибок я обнаружил эту проблему

[error] server reached MaxClients setting, consider raising the MaxClients setting
[notice] caught SIGTERM, shutting down

поэтому я ищу решение, чтобы поднять эти цифры. Я обнаружил, что это число находится в двух разделах в конфигурации apache. С участием

/usr/sbin/httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

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

<IfModule prefork.c>
    StartServers       8
    MinSpareServers    5
    MaxSpareServers   20
    ServerLimit     1024
    MaxClients      1024
    MaxRequestsPerChild  4000
</IfModule>

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

На сервере работает Linux CentOS 5.4.

Спасибо бени

Поскольку ваш сервер работает в режиме prefork, это означает, что каждое соединение получает свой собственный процесс - поэтому прежде всего проверьте, есть ли в системе 1024 или около того процессов httpd.

Чтобы лучше понять, что делает ваш сервер, вы можете включить страницу состояния сервера.

LoadModule status_module modules/mod_status.so

ExtendedStatus On

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from .example.com
</Location>

Затем это позволит вам просмотреть состояние подключений к вашему серверу и попытаться выяснить, что является причиной использования всех подключений.

Мое подозрение - это возможность какого-то мошеннического прокси-сервера или оператора перезаписи, который заставляет сервер постоянно зацикливать свои соединения внутри себя, пока все они не будут использованы.

Может быть, на вашем сервере включена функция KeepAlive и безумно высокая ценность KeepAliveTimeOut?

Это может привести к появлению группы неактивных соединений, ожидающих слишком долгого завершения работы, что приведет к сбою сервера.

Проверьте свою конфигурацию apache и / или определения виртуального хоста.

M

Прежде чем снова увеличивать число, вы можете сделать несколько вещей, чтобы уменьшить количество процессов, запускаемых Apache.

Включите поддержку активности и установите для него очень низкий тайм-аут:

KeepAlive On
MaxKeepAliveRequests 200
KeepAliveTimeout 5

Все запросы от одного и того же клиента будут обрабатываться через одно TCP-соединение с сервером. Низкое значение KeepAliveTimeout означает, что Apache быстро отключит соединение KeepAlive, так что, пока клиент не оставляет паузу связи более 5 секунд, клиент может использовать только одно соединение для всей загрузки страницы.

Кроме того, уменьшите максимальное количество запросов на ребенка примерно до 1000. Процессы Apache часто увеличивают использование памяти с каждым запросом, поэтому снижение максимального количества запросов в конечном итоге приведет к снижению общего использования памяти для данного количества процессов httpd.

Наконец, как было сказано ранее, вы должны следить за сервером в самый загруженный час, используя TOP или команду ps. Узнайте, сколько процессов apache порождается и сколько памяти каждый из них потребляет. Затем вы можете рассчитать правильное максимальное количество клиентов на основе доступной оперативной памяти серверов и использования памяти для каждого процесса.

Если вы по-прежнему видите проблемы после этих настроек, возможно, вы захотите отказаться от модуля предварительной вилки Apache по умолчанию и использовать вместо него рабочий модуль mpm. Это потребует использования fastcgi или чего-то подобного для обработки запросов php; в конце концов, это хорошая идея сама по себе.

кашель nginx кашель ;)