Как устранить частичную задержку ответа от NginX?
У нас есть каскад из двух обратных прокси-серверов NginX перед веб-сервером Java.
Первый прокси работает на балансировщиках нагрузки FreeBSD (11.1-RELEASE-p10) и проксирует весь интернет-трафик во внутренней сети. Есть два таких балансировщика нагрузки. У них одинаковый конфиг:
location / {
proxy_pass http://app_servers;
proxy_set_header X-Request-ID $request_id;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
Второй прокси-сервер работает на серверах приложений CentOS и передает запросы различным приложениям на одном хосте. Есть два сервера приложений, которые также имеют одинаковый конфиг:
location / {
proxy_pass http://java_app;
proxy_redirect off;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $http_x_real_ip;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
Итак, конвейер выглядит так:
LB - AS - Java
Internet ---| X
LB - AS - Java
У веб-сервера Java есть путь запроса, который возвращает фрагментированные ответы HTTP 1.1. Каждый ответ занимает около 2 мс:
HTTP/1.1 200 OK
Connection: keep-alive
Transfer-Encoding: chunked
Content-Type: application/json;charset=UTF-8
Date: Tue, 06 Nov 2018 10:51:08 GMT
42
{..........JSON..........}
0
Второй прокси (на сервере приложений) также возвращает их примерно за 2 мс. Нет проблем там.
HTTP/1.1 200 OK
Server: nginx
Date: Wed, 07 Nov 2018 10:34:29 GMT
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
42
{..........JSON..........}
0
Но первый прокси (на балансировщике нагрузки) возвращает их клиенту примерно за 102 мс каждый. Это вводит постоянную задержку в 100 мс. Это проблема.
У того же Java-сервера есть другой путь запроса, который возвращает нормальные (не разделенные на части) ответы с Content-Length
заголовки. Эти ответы возвращаются через 2 мс обоими прокси без проблем. Они проходят через те же места в NginX.
Это не должно быть проблемой сети, потому что проблема наблюдается на обоих серверах приложений и на обоих шлюзах.
Это заставляет меня думать, что чанкованное кодирование как-то вызывает задержку в 100 мс. Но я не понимаю, почему, и я не знаю, как это исправить.
Любые подсказки будут оценены.
1 ответ
Если вы используете nginx >= 1.8, вы можете использовать:
proxy_request_buffering off