На сервере 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
Правила iptables для противодействия наиболее распространенным DoS-атакам?
Возможно, у вас есть куча процессов, ожидающих подзапросов к apache, в то время как эти процессы гарантируют, что у apache никогда не будет запасного процесса для ответа?
Важно, чтобы любой вызов URL-адреса на том же сервере имел тайм-аут.