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

Недостаточно используемый сервер Apache Достигнуто MaxRequestWorkers: утечка памяти?

На сервере Ubuntu с 1 ГБ ОЗУ сервер Apache 2.4.7 с конфигурацией по умолчанию начал иногда перестать отвечать на запросы. Он используется для личного облака + других нужд и веб-сайта с низким трафиком.

Исследование error.log выявило эту закономерность, которая кажется повторяющейся каждый раз, когда возникает проблема:

[mpm_prefork:error] [pid 31950] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

после которого access.log вообще не регистрирует доступ. А через день:

[mpm_prefork:notice] [pid 31950] AH00171: Graceful restart requested, doing restart

что, по-видимому, не имело никакого значения.

Мне каждый раз приходилось перезапускать сервер вручную.

Сейчас я смотрю на mpm_prefork.conf, который установлен по умолчанию, и из информации, которую мне удалось собрать, я не думаю, что мне нужно что-то менять. Я начал подозревать утечку памяти и прочитал это MaxConnectionsPerChild 1000 это своего рода хакерство для предотвращения утечки памяти, поэтому я установил для него значение 1000 и посмотрю, как он себя ведет. Так как это время от времени ошибка, трудно понять, что именно вызывает проблему.

Как вы думаете, используя MaxConnectionsPerChild в этом контексте это хорошая стратегия (надеемся, что утечка памяти будет исправлена ​​в дальнейшем выпуске сайта, который я размещаю), или это просто не указывает на утечку памяти?

NB: имея средний процесс Apache, потребляющий ~ 20 МБ памяти, я уменьшил MaxRequestWorkers со 150 до 30 (учитывая, что для Apache на сервере доступно 500 МБ памяти). Теперь у меня есть:

<IfModule mpm_prefork_module>
        StartServers              5
        MinSpareServers           5
        MaxSpareServers           10
        MaxRequestWorkers         30
        MaxConnectionsPerChild    1000
</IfModule>

Я не думаю, что память достигла пика, но, поскольку мой клиент Мунин упал, теперь я понимаю, что не могу этого исключить.

Окончательный ответ - удаление Owncloud 8.0.0 из корневого каталога моих документов. После этого Apache работает так, как ожидалось ...

Было бы хорошо понять, что было причиной проблемы, и как настроить Apache, чтобы он мог обрабатывать проблемное приложение PHP. Жаль, что MaxConnectionsPerChild не может справиться с проблемой в этом случае, но опять же, я не уверен, что произошло на самом деле, хотя MaxRequestWorkers журнал ошибок, казалось, указывал, что проблема была в количестве потоков.

Может моя ситуация слишком уникальна, я получал то же самое server reached MaxRequestWorkers setting ошибка и полагал, что мой также был сайтом с низким трафиком. В противном случае бревна были бесплодными. Я нашел сообщение, в котором говорилось, что я могу повысить уровень ведения журнала Apache с «предупреждать» до «отлаживать», поэтому я изменил его в надежде почерпнуть что-нибудь полезное. Я следил за /var/log/apache2/error.log когда я перезапустил Apache, результат сразу превратился в бесконечный беспорядок с прокруткой. Я не мог его прочитать, так как он пролетал так быстро. Я заметил, что каждые 1000 строк или около того была нормальная строка, но остальные строки были идентичны - все происходили с российского IP. Моя первая ДОС!

Я читал, что вы можете отбрасывать пакеты с определенного ip, используя строку в iptables. Я пробежал две строчки и прокрутка прекратилась - ХОЛОДНО.

iptables -A INPUT -s <ip address here> -j DROP
iptables -A INPUT -s <ip address here> -j DROP

Есть много хороших ресурсов о том, как смягчить атаки DOS, но я еще не знал, что я был под одним из них. Следуя этому [mpm_prefork:error] ключ к разгадке был моим большим прорывом. Я уверен, что не каждая ошибка prefork является DOS-атакой, но, возможно, этот пост может кому-то помочь!

https://linuxaria.com/howto/how-to-verify-ddos-attack-with-netstat-command-on-linux-terminal

https://stackoverflow.com/questions/38357269/mpm-preforkerror-ah00161-server-reached-maxrequestworkers-setting/38362719

Правила iptables для противодействия наиболее распространенным DoS-атакам?

Возможно, у вас есть куча процессов, ожидающих подзапросов к apache, в то время как эти процессы гарантируют, что у apache никогда не будет запасного процесса для ответа?

Важно, чтобы любой вызов URL-адреса на том же сервере имел тайм-аут.