[Nginx] Como derrotar response_status = 0

Um artigo da categoria "notas à margem".

TL: DR:

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

Em um dos projetos, após alterar algumas lógicas internas do backend, comecei a ver um código de resposta estranho nos logs — especificamente, 0. Os logs eram 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": ""
}


A leitura da documentação e as buscas no Google não trouxeram absolutamente nada, pois alega-se que esse comportamento ocorre quando o cliente fecha a conexão sem transmitir os cabeçalhos. Além disso, há algumas informações incomuns sobre o tamanho do buffer para wsgi_, que, no nosso caso, era completamente inadequado.

Em resumo, decidimos que o problema não era um problema, visto que, com o volume de produção que tínhamos, não era nada crítico.

Até que me deparei com o seguinte problema: em alguns casos, os links abrem sem problemas via HTTP, mas se recusam completamente a funcionar via HTTPS, exibindo a maravilhosa mensagem: "Connection #0 to host example.com left intact" (Conexão #0 com o host example.com mantida).
curl: (52) Resposta vazia do servidor

Só consegui rastrear isso nos logs pelo IP — nenhuma requisição ou qualquer outro dado, como você pode ver no exemplo acima. Apenas o famigerado status 0, mas eu sei que não interrompi a requisição! Comecei a investigar para ver o que poderia estar errado. Acabou sendo muito simples:

escute 443 ssl http2 backlog=8192;

Bem, se você usa http2 para conexões SSL, não basta apenas configurar os buffers de requisição; você também precisa configurá-los no módulo ngx_http_v2_module, ou seja:

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

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

Então, é isso. Mas por quê? Porque o comprimento do link era longo — maior do que aqueles 4k.

Ao definirmos esse valor para, por exemplo, 8 kb (ou o máximo que for provável), resolvemos o problema.
Essas coisas.

Fonte: habr.com

Compre hospedagem confiável para sites com proteção DDoS, servidores VPS VDS 🔥 Compre hospedagem de sites confiável com proteção contra DDoS, servidores VPS/VDS | ProHoster