我有一个 Apache2 设置,作为多个 python 应用程序的前端服务器,由gunicorn。我使用 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>
总体来说,这个设置运行得很好。但我有一个问题:当我重新启动 gunicorn 进程(需要 2-5 秒)并且有来自 Apache 的请求时,该请求将失败并出现 503 错误。到目前为止一切顺利。但即使 gunicorn 进程恢复后,Apache 仍不断返回 503 错误。只有在完全重新启动 Apache 后,它才会从代理服务器恢复提供内容。
有没有什么办法可以避免这种行为?
答案1
添加retry=0
到您的 ProxyPass 行:
ProxyPass / http://127.0.0.1:4711/ retry=0
来自mod_proxy 文档:
连接池工作器重试超时(以秒为单位)。如果后端服务器的连接池工作器处于错误状态,Apache 将不会将任何请求转发到该服务器,直到超时到期。这可以关闭后端服务器进行维护,然后稍后将其重新联机。值为 0 表示始终重试处于错误状态的工作器,没有超时。
答案2
您是否按照记录的方法重新启动 gunicorn?
我推荐一种简单的方法。如果在您的环境中 2-5 秒的停机时间是可以接受的,那么我是否可以建议简单地编写脚本,让 Apache 服务在您重新启动 gunicorn 服务后立即重新启动?
在生产环境中,我建议使用 HAProxy 而不是 Apache 作为前端,这样您可能会获得更好的运气。