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

Я хочу написать что-то, что перезапускает службу httpd, когда мой сервер apache умирает

Я неохотный «системный администратор» среднего кулинарного блога, который работает на экземпляре t2.small EC2 и использует WordPress в стеке LAMP. Несмотря на то, что он довольно плохой «системный администратор», он на самом деле работает очень надежно и эффективно, несмотря на то, что отправляет ОЧЕНЬ много трафика. Я сделал все, что мог, но время от времени (примерно раз в год) кому-то удается взломать его с помощью атаки типа DDOS. Обычно происходит то, что сервер apache умирает, и любой, кто запрашивает что-либо с веб-сайта, получает тайм-аут HTTP. Перезапуск службы httpd сразу решает проблему.

Я думаю о том, чтобы запланировать задание CRON для вызова веб-сайта каждые 5 минут, и если он обнаружит, что он получает тайм-аут более двух раз, он перезапускает службу httpd и отправляет мне электронное письмо. Это НЕ одно из решений типа «Я не могу правильно настроить свой сервер Apache, поэтому перезапускаю его каждый час». Apache настроен и прекрасно работает, когда его не взламывают. И я применил как можно больше передовых методов защиты от взлома брандмауэра. Мое объяснение в основном таково: «Хакеры и сумасшедшие всегда находят новые способы избить меня, и когда они это сделают, я предпочитаю 10 минут простоя и электронное письмо, чем потенциально часы простоя (если я сплю или в отъезде)». Вопрос в том, хорошее ли это решение или есть лучший, более системный способ сделать это с использованием какой-либо существующей технологии?

ПРИМЕЧАНИЕ. Когда я говорю, что сервер apache умирает, на самом деле это выглядит нормально, когда вы запускаете top -U apache. Что он делает, так это пишет о 10

(12) Невозможно выделить память: AH00159: fork: невозможно создать вилку нового процесса

в error_log и просто ничего не делает до перезапуска.

Вы можете сделать это довольно легко, проверив код возврата curl команда:

#!/bin/bash
# Request website (timeout five seconds)
/usr/bin/curl -m5 $1 > /dev/null
RC=$?
if [ $RC -ne 0 ]; then
    echo Website: $1 not running, restarting apache. Curl RC: $RC
    /usr/sbin/service httpd restart
fi

Идея в том, что если код возврата не равен 0, т.е. запрос не удался, перезапустите apache.

Вы бы поместили его в cron примерно так:

*/5 * * * * /path/to/check_site.sh website.url.com >> /path/to/log/file.log 2>&1

Это обеспечит регистрацию результатов.

Примечание: это пластырь. Это хорошая идея, чтобы убедиться, что это не повторяется постоянно. Возможно, поставить send me an email линия?

Какое-то время Microsoft игнорировала robots.txt и забивала мой сервер своим сканером поисковых систем. Когда все замедлялось, я видел до 200 экземпляров httpd, большинство из которых были сканерами Microsoft! Поэтому я реализовал следующий скрипт, который проверяет, сколько экземпляров httpd запущено, и, если больше определенного числа, убивает их все.

Это довольно просто. Вы можете изменить количество экземпляров httpd в строке 5 с «30» на любое другое. Вы можете изменить время между мониторингами, изменив «сон 30» на любое количество секунд, которое вы предпочитаете. Я искал только уничтожение экземпляров краулера Microsoft, но это потребовало бы синтаксического анализа журналов apache, в которые я не хотел входить.

#!/bin/bash
while [ 1 ]
    do
    set `psg httpd | wc`
    if test $1 -gt 30
    then
        echo killing
        killall httpd
    else
        echo -n $1 ' '
    fi
    sleep 30
done