即使代理服务恢复后,mod_proxy 仍返回 503 错误

即使代理服务恢复后,mod_proxy 仍返回 503 错误

我有一个 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 作为前端,这样您可能会获得更好的运气。

相关内容