[Nginx] Comment résoudre response_status = 0

Article du genre « notes en marge ».

TL:DR :

http2_max_field_size 8k; # tout le monde sera sauvé !

Dans l'un de mes projets, aprĂšs modification de la logique interne du backend, j'ai commencĂ© Ă  observer un code de rĂ©ponse Ă©trange dans les logs, Ă  savoir — 0. Dans les logs, cela ressemble Ă  peu prĂšs Ă  ceci :

{
  "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": ""
}


Lire la documentation et googler sur ce sujet n’a rien donnĂ© — car il est affirmĂ© que ce comportement survient lorsque le client ferme la connexion sans transmettre les en-tĂȘtes. Et il y a une certaine excentricitĂ© concernant la taille du buffer pour wsgi_, qui dans notre cas ne convenait absolument pas.

En gros, nous avons décidé que le problÚme n'était pas un problÚme, étant donné que dans nos volumes, cela n'est absolument pas critique.

Jusqu'à ce que je sois confronté à un autre problÚme : dans certains cas, les liens s'ouvrent sans problÚme en http, mais refusent complÚtement de fonctionner en https, affichant la merveilleuse : Connection #0 to host example.com left intact.
curl: (52) Réponse vide du serveur

Dans les logs, cette anomalie n'a pu ĂȘtre suivie que par IP — ni la requĂȘte, ni d'autres donnĂ©es, comme le montre l'exemple ci-dessus — n'Ă©taient prĂ©sentes. Juste le fameux statut 0, mais je sais que je n'ai pas interrompu la requĂȘte ! J'ai commencĂ© Ă  gratter pour voir ce qui pouvait mal tourner. Et tout s’est avĂ©rĂ© trĂšs simple :

listen 443 ssl http2 backlog=8192;

Donc, si vous utilisez http2 pour les connexions ssl, il ne suffit pas de configurer simplement les buffers de requĂȘte, il faut aussi les configurer dans ngx_http_v2_module, Ă  savoir :

Syntaxe :	http2_max_field_size taille;
Valeur par défaut :	http2_max_field_size 4k;
Contexte :	http, server

Limite la taille maximale des en-tĂȘtes de requĂȘte, compressĂ©e Ă  l'aide de HPACK. La limite s'applique Ă©galement bien au nom qu'Ă  la valeur. Si le codage de Huffman est utilisĂ©, la taille rĂ©elle des chaĂźnes de nom et de valeur dĂ©compressĂ©es peut ĂȘtre supĂ©rieure. La limite par dĂ©faut convient Ă  la plupart des requĂȘtes.

En gros, c'est ça. Et pourquoi donc ? Parce que la longueur du lien Ă©tait grande — plus que ces 4k.

En le rĂ©glant, par exemple, Ă  8kb (ou autant que nĂ©cessaire) — nous rĂ©solvons le problĂšme.
VoilĂ  donc.

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster