Dev (Back & Front)ARTIGO

Nginx Proxy: upstream enviando um header muito grande enquanto lê um header de resposta do upstream

Veja como resolver um erro em seu log se estiver executando uma configuração de proxy Nginx.

Se você estiver executando uma configuração de proxy Nginx, pode ter o seguinte erro em seu log:

$ tail -f error.log
[error] 19896#0: upstream sent too big header while reading response header from upstream,
   client: 10.5.120.6,
   server: host.tld,
   request: "GET /path/to/file.php HTTP/1.1",
   upstream: "",
   host: "host.tld"

[error] 19899#0: upstream sent too big header while reading response header from upstream,
   client: 10.5.120.6,
   server: host.tld,
   request: "GET /path/to/file.php HTTP/1.1",
   upstream: "",
   host: "host.tld"

Em sua configuração do proxy Nginx, você provavelmente terá algo muito semelhante a isto:

server {
  listen        80;
  server_name   host.tld;

  location / {
    proxy_pass       http://upstream;
    ...
  }
}

Para resolver esse problema, aumente os buffers de proxy que o Nginx usa. Antes de o Nginx enviar uma resposta de volta para o visitante, ele irá armazenar em cache o pedido que teve que fazer a partir do seu upstream. No entanto, existem buffers limitados disponíveis para armazenar tal resposta. Se os cabeçalhos HTTP contêm mais informações do que o previsto, esses buffers de proxy pode ficar saturados, e o Nginx vai recusar o pedido com o erro “upstream sent too big header while reading response header from upstream” em seu log.

Para resolver isso, adicione a configuração proxy_buffer_size no seu bloco de localização.

server {
  listen        80;
  server_name   host.tld;

  location / {
    proxy_pass       http://upstream;
    ...

    proxy_buffer_size          128k;
    proxy_buffers              4 256k;
    proxy_busy_buffers_size    256k;
  }
}

Essa mudança aumenta o buffer de proxy do Nginx de 4KB (padrão) para 128KB, geralmente grande o suficiente para armazenar em cache qualquer resposta do backend sem representar um risco para o seu servidor. Afinal de contas, esse servidor tem agora que atribuir mais memória para o buffer a cada resposta do backend.

***

Mattias Geniar faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: https://ma.ttias.be/nginx-proxy-upstream-sent-big-header-reading-response-header-upstream/

Trabalha com programação de linguagens e servidores há mais de 10 anos. Atualmente, trabalha na Nucleus como desenvolvedor e engenheiro de sistemas. Seus interesses incluem Linux, Apache, MySQL e PHP.

Ver perfil