Назад | Перейти на главную страницу

Apache: «сбой тела запроса на передачу» из-за времени работы клиента

У меня есть Rest API, построенный на Python, который обслуживается gunicorn в контейнере докеров за прокси-сервером Apache, который обрабатывает SSL. Запросы к этому API выполняются из Python на машине с Windows 10 с использованием requests пакет:

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

В последнее время я заметил, что примерно каждый второй запрос POST (полезная нагрузка JSON) к API возвращал ошибку сервера 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)

Я попытался добавить KeepAlive и timeout в директиву 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, отправляемого с этого компьютера?

FWIW, запросы аутентифицируются с помощью подписи HMAC на основе времени (например, AWS API), но эта подпись проверяется только в бэкэнде Python, а не прокси-сервером Apache.

Спасибо за ваш вклад!