Se você estiver no nginx > = 1,8, poderá usar:
proxy_request_buffering off
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.
Se você estiver no nginx > = 1,8, poderá usar:
proxy_request_buffering off