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

Как автоматически перезапустить службу Apache после ошибки HTTP 503?

Наш производственный сервер работает под управлением Apache v2.2.4 на CentOS5.2. Мононуклеоз v1.2.4 интегрирован в Apache.

Недавно мы столкнулись с проблемой на нашем производственном сервере. Из журнала access_log Apache я обнаружил внутреннюю ошибку сервера HTTP 500 для одного из HTTP-запросов, и все последующие HTTP-запросы также завершились неудачно, но с ошибкой недоступности службы HTTP 503. После этого ни один из запросов не был успешным. Кроме того, только спустя некоторое время мы поняли, что наше приложение не работает из-за этой ошибки, и перезапустили службу Apache.

Мои вопросы:

  1. Как в такой ситуации автоматически перезапустить службу Apache при обнаружении ошибки HTTP 503? Можно ли установить какую-либо директиву Apache?
  2. вообще, что может вызвать ошибку HTTP 503 в Apache?

НОТА: Mono помогает запускать приложения, разработанные в .NET, в ОС на базе Linux.

РЕДАКТИРОВАТЬ: Я согласен найти первопричину этой проблемы. Фактически, мы это тоже анализировали. Пока мы не решим эту проблему, я выясняю, можно ли перезапустить ее немедленно, без простоев / перебоев в обслуживании пользователей приложений.

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

#!/bin/sh                                                                                                            
HTTP_STATUS=`lynx -head -source http://mysite.com |head -1 |awk '{print $2}'`                             
if [ "$HTTP_STATUS" = "503" ]                                                                                       
then                                                                                                                 
        /etc/init.d/http restart                                                                                   
fi                                                                                                                   

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

Если вы все еще настаиваете, попробуйте посмотреть на что-нибудь вроде SWATCH для отслеживания журналов Apache и устранения ошибки 503.

Ошибки 503 обычно связаны с ошибками обслуживаемого приложения или ошибкой конфигурации. Он должен быть в журнале ошибок apache (если у вас нет журнала ошибок, включите его в конфигурации с помощью Журнал ошибок директиве и контролируйте, какой уровень регистрации ошибок вы хотите с LogLevel).

Ты можешь использовать контролировать чтобы проверить страницу и убедиться, что код HTTP с определенной страницы в порядке, и что делать, если нет (например, перезапуск apache).

У вас может быть что-то вроде следующего в вашем httpd.conf:

ErrorDocument 500 /cgi-bin/handle-500-error.pl

Это вызовет сценарий всякий раз, когда обнаруживается ошибка, и настроит его на перезапуск сервера.

Я столкнулся с ошибкой 503, когда что-то, что я выполняю обратным проксированием за Apache, не работает. Перезапуск службы с обратным проксированием исправляет это, но эта ошибка ожидается, если я отключил эту службу.

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

Я понимаю, что вы хотите:

Вы хотите, чтобы что-то отслеживало журнал и МОМЕНТАЛЬНО перезапускало apache, если возникнет конкретная ошибка. Вы не хотите зондировать каждую минуту, просто смотрите журнал.

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

Тем не мение! Как правило, это не очень хорошая идея, поскольку некоторые люди мог узнайте, что вы искали, в файле журнала, а затем просто продолжайте делать 404 ошибки с этой строкой в ​​конце URL-адреса. Но:

Отредактируйте файл конфигурации и направьте журнал ошибок в сценарий, например:

ErrorLog "| /bin/bash /scripts/logMonitor.sh"

Затем создайте этот сценарий, и это может быть что-то вроде этого:

#!/bin/bash

while read input; do

  if [[ $input == *someError* ]]; then
    echo "--- ERROR REGISTERED - RESTARTING APACHE ---" >> /tmp/err.log
    /etc/init.d/apache2 restart
  fi    

  # Always log what is thrown at us.
  echo "$input" >> /tmp/err.log

done

Это сделает то, о чем вы просите, но это некрасиво и не рекомендуется.