Как устранить частичную задержку ответа от 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
Другие вопросы по тегам