и решить.
Есть nginx, который проксирует запросы на некий апстрим (фактически тоже веб-сервер, только самописный).
От пользователя присылается некий POST запрос. Иногда nginx отбивает в ответ 502 ошибкой (каждый второй, каждый третий-четверты запрос).
Если разбираться, то получается следующее:
Все указанные запросы делаются с сервера, на котором размещен nginx proxy.
1. запрос напрямую в самописный веб-сервер (в ответе сервере data не показываем, только лишь заголовки ответа)
curl -sSL -D - -X POST -H "Content-Type: application/json" -d @json.txt -vvv "http://self-written-web-server:20000/my/?user_id=1&request=e36216c7" -o /dev/null
2.Запрос в него же через nginx:
curl -sSL -D - -X POST -H "Content-Type: application/json" -d @json.txt -vvv "http://nginx-host/my/?user_id=1&request=e36216c7" -o /dev/null
Файл json.txt размером где-то 500K.
Проксирование на nginx выглядит так:
location /my/ {
proxy_pass http://self-written-web-server:20000/;
}
Все curl запросы напрямую в self-written-web-server всегда успешно заканчиваются.
Если посмотреть логи веб-сервера nginx в момент проблемы, то там есть следующее:
[warn] 8840#0: *7453145025 a client request body is buffered to a temporary file /home/nginx/tmp/body/0486399818, client: self-written-web-server, server: some-hostname, request: "POST /my/?id=1&request_id=e36216c7 HTTP/1.1", host: "nginx-host"
[error] 8840#0: *7453145025 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: nginx-host, server: some-hostname, request: "POST /my/?id=1&request_id=e36216c7 HTTP/1.1", upstream: "http://self-written-web-server:20000/?id=1&request_id=e36216c7", host: "nginx-host"
"502" self-written-web-server:20000 0.000 - "POST /my/?id=1&request_id=e36216c7 HTTP/1.1" -
При этом на самописном веб-сервере в момент проблемного запроса логов нету.
Обычно ошибка Connection reset by peer) while reading response header from upstream говорит, что надо смотреть апстрим, на который nginx пересылает запрос.
Но запросы минуя nginx, всегда заканчиваются успешно.
Куда еще можно посмотреть, в какие опции?
Пробовал ngx_http_proxy_module покрутить (https://nginx.org/ru/docs/http/ngx_http_proxy_module.html), но безуспешно.
Не успевает сервер отвечать. Сделать несколько апстримов на него, nginx будет слать запросы по очереди
А json-ы меньшего размера пролезают? Не 500, а, скажем, 50 кб?
речь про самописный веб-сервер? (что не успевает). Запросы напрямую на него курлом с сервера с nginx всегда проходят
Сделай курлом в скрипте 100 запросов подряд, увидишь что не всегда )
proxy_request_buffering off стоит?
проверил, курлом раз в 2 сек, напрямую в самописный веб-сервер - 0 ошибок (все 200 ответы), через прокси - всего из 19 запросов, 3 bad gateway было
да, изначально стояло, попробовал on также, не помогло
У тебя же всё в ошибке описано - (104: Connection reset by peer) Nginx считает, что твой сервер рвёт соединение. Почему он рвёт? Ну может слишком много времени ждал ответа от Nginx, пока nginx положил тело запроса в буфер, пока перешлёт запрос бэку. Вообще я сталкивался, что в таких случаях помогает keepalive директива. Я бы ещё посмотрел в сторону таймаутов keep-alive, при их несовпадении периодически соединение может рваться.
Обсуждают сегодня