У меня есть установка с 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
Тайм-аут повторной попытки работника пула подключений в секундах. Если рабочий пула подключений к внутреннему серверу находится в состоянии ошибки, Apache не будет пересылать запросы на этот сервер до истечения тайм-аута. Это позволяет выключить внутренний сервер для обслуживания и вернуть его в работу позже. Значение 0 означает, что рабочие процессы всегда будут повторяться в состоянии ошибки без тайм-аута.
Вы следуете документированному методу перезапуска Gunicorn?
Я бы рекомендовал простой подход. Если 2–5 секунд - приемлемое время простоя в вашей среде, могу ли я предложить просто написать сценарий службы Apache для перезапуска сразу после перезапуска службы gunicorn?
В производственной среде я бы предложил использовать HAProxy вместо Apache в качестве внешнего интерфейса, и вам может повезти больше.