[Nginx] Como derrotar response_status = 0

Um artigo da categoria “sidenotes”.

TL: DR:

http2_max_field_size 8k; # всех спасет!

Em um dos projetos, após alterar alguma lógica interna do backend, comecei a observar um estranho response_code nos logs, ou seja, 0. Nos logs fica mais ou menos assim:

{
  "timestamp": "2020-01-17T08:41:51+00:00",
  "remote_addr": "zzz.zzz.zzz.zzz",
  "request_time": 0,
  "upstream_response_time": "",
  "upstream_header_time": "",
  "http_accept_language": "-language",
  "response_status": 0,
  "request": "",
  "host": "example.com",
  "upstream_addr": "",
  "http_referrer": "",
  "request_length": 5854,
  "bytes_sent": 0,
  "http_user_agent": ""
}


Ler a documentação e pesquisar no Google sobre este tópico não rendeu absolutamente nada - porque... Afirma-se que esse comportamento ocorre quando o cliente fecha a conexão sem passar os cabeçalhos. Bem, e várias coisas exóticas com o tamanho do buffer para wsgi_, que no nosso caso não cabia na palavra “de forma alguma”.

Em geral, decidimos que o problema não é um problema, dado que em nossos volumes não é nada crítico.

Exatamente até que fiquei intrigado com o seguinte problema: em alguns casos, os links abrem sem problemas via http, mas se recusam completamente a funcionar via https, produzindo o maravilhoso: Conexão #0 ao host exemplo.com deixada intacta
curl: (52) resposta vazia do servidor

Nos logs, conseguimos rastrear isso apenas por IP - não houve solicitação ou qualquer outro dado, como pode ser visto no exemplo acima. Só o status notório é 0, mas sei que não interrompi o pedido! Comecei a descobrir o que poderia dar errado. E tudo acabou sendo muito simples:

ouvir 443 ssl http2 pendências=8192;

Pois bem, se você usa http2 para conexões SSL, então não basta apenas configurar os buffers de solicitação, eles também devem ser configurados em ngx_http_v2_module, a saber:

Синтаксис:	http2_max_field_size размер;
Умолчание:	http2_max_field_size 4k;
Контекст:	http, server

Limita o tamanho máximo de um cabeçalho de solicitação compactado usando HPACK. A restrição se aplica igualmente ao nome e ao valor. Se a codificação Huffman for usada, o tamanho real das cadeias de nome e valor descompactadas poderá ser maior. O limite padrão é adequado para a maioria das consultas.

Em geral, é isso. E por que tudo? Porque o comprimento do link era longo - maior que os mesmos 4k.

Ao configurá-lo para, por exemplo, 8kb (ou tanto quanto for suficiente), resolvemos o problema.
Essas coisas.

Fonte: habr.com

Adicionar um comentário