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

Как устранить задержку фрагментированного ответа от 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 мс. Но я не понимаю, почему, и не знаю, как это исправить.

Будем признательны за любые подсказки.

Если вы используете nginx> = 1.8, вы можете использовать:

 proxy_request_buffering off