[Nginx] Comment vaincre Response_status = 0

Un article de la catégorie « sidenotes ».

TL: DR:

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

Sur l'un des projets, après avoir modifié une certaine logique interne du backend, j'ai commencé à observer un étrange code de réponse dans les journaux, à savoir 0. Dans les journaux, cela ressemble à 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": ""
}


La lecture de la documentation et la recherche sur Google sur ce sujet n'ont absolument rien donné - parce que... Il est précisé que ce comportement se produit lorsque le client ferme la connexion sans transmettre les en-têtes. Eh bien, et diverses choses exotiques avec la taille du tampon pour wsgi_, qui dans notre cas ne correspondaient pas au mot « de quelque manière que ce soit ».

En général, nous avons décidé que le problème n'était pas un problème, étant donné qu'à nos volumes, ce n'est pas du tout critique.

Exactement jusqu'à ce que je sois intrigué par le problème suivant : dans certains cas, les liens s'ouvrent sans problème via http, mais refusent complètement de fonctionner via https, produisant le merveilleux : Connexion n°0 à l'hébergeur example.com laissée intacte
curl : (52) Réponse vide du serveur

Dans les journaux, nous n'avons pu suivre cette chose que par IP - il n'y a eu aucune demande ni aucune autre donnée, comme le montre l'exemple ci-dessus. Seul le statut notoire est 0, mais je sais que je n'ai pas interrompu la demande ! J'ai commencé à comprendre ce qui pourrait mal se passer. Et tout s'est avéré très simple :

écouter 443 ssl http2 arriéré = 8192 XNUMX ;

Eh bien, si vous utilisez http2 pour les connexions SSL, alors il ne suffit pas de configurer les tampons de requêtes, ils doivent également être configurés dans ngx_http_v2_module, à savoir :

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

Limite la taille maximale d'un en-tête de requête compressé à l'aide de HPACK. La contrainte s'applique également au nom et à la valeur. Si le codage Huffman est utilisé, la taille réelle des chaînes de nom et de valeur décompressées peut être plus grande. La limite par défaut convient à la plupart des requêtes.

En général, c'est ça. Et pourquoi tout ? Parce que la longueur du lien était longue – plus longue que ces mêmes 4k.

En le définissant, par exemple, sur 8 Ko (ou autant que ce sera probablement suffisant), nous résolvons le problème.
De telles choses.

Source: habr.com

Ajouter un commentaire