複数のpythonアプリが gunicorn によって提供されるアプリ)のフロントエンドサーバーとしてApache2を使用したセットアップがあります。mod_proxyを使用した私のApache2セットアップは次のようになります。
<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>
通常、この設定はかなりうまく機能します。ただし、1つの問題があります。gunicornプロセスを再起動し(2〜5秒かかります)、Apacheからの要求があると、その要求は503エラーで失敗します。ここまでは順調ですね。しかし、gunicornプロセスが復旧した後でも、Apacheは503エラーを返し続けます。 Apacheを完全に再起動した後にのみ、プロキシサーバーからコンテンツの提供を再開します。
この動作を回避する方法はありますか?
追加 retry=0
をProxyPass行に追加します。
ProxyPass / http://127.0.0.1:4711/ retry=0
mod_proxyのドキュメント から:
接続プールワーカーのタイムアウト(秒単位)。バックエンドサーバーへの接続プールワーカーがエラー状態の場合、Apacheはタイムアウトが期限切れになるまでそのサーバーに要求を転送しません。これにより、メンテナンスのためにバックエンドサーバーをシャットダウンし、後でオンラインに戻すことができます。値0は、タイムアウトのないエラー状態のワーカーを常に再試行することを意味します。