Desenvolvimento

18 mai, 2016

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

Publicidade

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/