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

mod_proxy возвращает 503 ошибки даже после резервного копирования прокси-службы

У меня есть установка с Apache2 в качестве интерфейсного сервера для нескольких приложений Python, обслуживаемых Gunicorn. Моя установка Apache2 с использованием mod_proxy выглядит так:

<VirtualHost *:80>
    ServerName example.com
    UseCanonicalName On
    ServerAdmin webmaster@localhost

    LogLevel warn
    CustomLog /var/log/apache2/example.com/access.log combined
    ErrorLog /var/log/apache2/example.com/error.log
    ServerSignature On

    Alias /media/ /home/example/example.com/pysrc/project/media/

    ProxyPass /media/ !
    ProxyPass / http://127.0.0.1:4711/
    ProxyPassReverse / http://127.0.0.1:4711/
    ProxyPreserveHost On
    ProxyErrorOverride Off
</VirtualHost>

В целом, эта установка работает очень хорошо. Однако у меня есть одна проблема: когда я перезапускаю процесс стрельбы (занимает 2-5 секунд) и есть запрос от Apache, этот запрос завершится ошибкой с ошибкой 503. Все идет нормально. Но Apache продолжает возвращать 503 ошибки даже после того, как процесс стрельбы был восстановлен. Он возобновляет обслуживание контента с прокси-сервера только после полного перезапуска Apache.

Есть ли способ обойти такое поведение?

Добавить retry=0 в ваши строки ProxyPass:

ProxyPass / http://127.0.0.1:4711/ retry=0

Из документация по mod_proxy:

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

Вы следуете документированному методу перезапуска Gunicorn?

Я бы рекомендовал простой подход. Если 2–5 секунд - приемлемое время простоя в вашей среде, могу ли я предложить просто написать сценарий службы Apache для перезапуска сразу после перезапуска службы gunicorn?

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