Como eliminar o atraso de resposta em partes do NginX?

3

Temos uma cascata de dois proxies reversos NginX na frente de um servidor web Java.

O primeiro proxy é executado nos balanceadores de carga FreeBSD (11.1-RELEASE-p10) e procura todo o tráfego de internet na rede interna. Existem dois desses balanceadores de carga. Eles têm uma configuração idêntica:

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  "";
}

O segundo proxy é executado nos servidores de aplicativos e solicitações de proxies do CentOS para diferentes aplicativos no mesmo host. Existem dois servidores de aplicativos em questão, também com configuração idêntica:

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;
}

O pipeline é assim:

            LB - AS - Java
Internet ---|  X
            LB - AS - Java

O servidor da Web Java tem um caminho de solicitação que retorna respostas em partes do HTTP 1.1. Cada resposta demora cerca de 2 ms:

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

O segundo proxy (no servidor de aplicativos) os retorna em aproximadamente 2 ms também. Não há problema aí.

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

Mas o primeiro proxy (no balanceador de carga) os retorna ao cliente em cerca de 102 ms cada. Introduz um atraso consistente de 100 ms. Esse é o problema.

O mesmo servidor Java tem outro caminho de solicitação que retorna respostas normais (não segmentadas) com Content-Length cabeçalhos. Essas respostas são retornadas em 2 ms por ambos os proxies sem problemas. Eles passam exatamente pelos mesmos locais no NginX.

Não deve ser um problema de rede, porque o problema é observado em ambos os servidores de aplicativos e em ambos os gateways.

Isso me faz pensar que a codificação em partes de alguma forma está causando o atraso de 100 ms. Mas eu não entendo por que e não sei como consertar isso.

Quaisquer pistas serão apreciadas.

    
por Ilya Vassilevsky 07.11.2018 / 12:04

1 resposta

0

Se você estiver no nginx > = 1,8, poderá usar:

 proxy_request_buffering off
    
por 16.11.2018 / 14:29