Apache:由于客户端正常运行时间,“传递请求正文失败”

Apache:由于客户端正常运行时间,“传递请求正文失败”

我有一个用 Python 构建的 Rest API,由 gunicorn 在处理 SSL 的 Apache 代理后面的 docker 容器中提供服务。使用以下包从 Windows 10 计算机上的 Python 发出对该 API 的请求requests

Python 3.4 (Win 10) -(HTTPS)-> Apache (Ubuntu 16.04) -(HTTP)-> Gunicorn (Docker)

最近我注意到,几乎每个对 API 的 POST 请求(JSON 有效负载)都会返回 502 服务器错误,并且我在 Apache 日志中看到了以下错误:

[proxy:error] [pid 14977:tid 140336549893888] (32)Broken pipe: [client xx.xx.xx.xx:51720] AH01084: pass request body failed to 127.0.0.1:13770 (127.0.0.1)

我尝试将KeepAlivetimeout参数添加到 ProxyPass 指令中,当出现此错误时通常会建议这样做。我最终得到了以下 Apache 配置,但错误仍然存​​在:

<VirtualHost *:443>
    ServerName api.example.org

    ProxyPass / http://127.0.0.1:13770/ timeout=600 Keepalive=On retry=1 acquire=3000
    ProxyPassReverse / http://127.0.0.1:13770/

    RequestHeader set "X-Forwarded-Proto" expr=%{REQUEST_SCHEME}
    RequestHeader set "X-Forwarded-SSL" expr=%{HTTPS}

    ErrorLog /var/log/apache2/api_error.log
    CustomLog /var/log/apache2/api_access.log combined

    SSLCertificateFile /etc/letsencrypt/live/api.example.org/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/api.example.org/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateChainFile /etc/letsencrypt/live/api.example.org/chain.pem
</VirtualHost>

最后我意识到只有一台客户端机器导致了这些错误,而且它已经运行了大约一周。我重新启动了那台机器上的 Windows,错误就消失了。

客户端的正常运行时间是否会以某种方式影响该机器发出的 POST 请求主体?

值得一提的是,请求通过基于时间的 HMAC 签名(如 AWS API)进行身份验证,但该签名仅在 Python 后端进行验证,而不是由 Apache 代理进行验证。

感谢您的输入!

相关内容