У меня есть 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.
Спасибо за ваш вклад!