[Nginx] Comment battre response_status = 0

Un article de la catégorie des "notes marginales".

TL: DR:
http2_max_field_size 8k; #  ! 


Sur l'un des projets, après avoir changé une logique de backend interne, j'ai commencé à observer un étrange response_code 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 ce sujet n'ont absolument rien donné - car il est avancé que ce problème se produit lorsque le client a fermé la connexion sans passer les en-têtes. Eh bien, différentes espèces exotiques avec la taille du tampon pour wsgi_, qui dans notre cas ne correspondaient pas au mot "no way".

En général, ils ont décidé que le problème n'est pas un problème, étant donné que sur nos volumes, il n'est absolument pas 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, ce qui donne une merveilleuse: Connexion # 0 à l'hôte example.com laissée intacte
curl: (52) Réponse vide du serveur

Il était possible de suivre cette chose dans les journaux uniquement par IP - il n'y avait aucune demande ni aucune autre donnée, comme le montre l'exemple ci-dessus. Seul le statut notoire 0, mais je sais que je n'ai pas interrompu la demande! J'ai commencé à choisir ce qui pouvait mal tourner. Et tout s'est avéré très simple:

écouter 443 ssl http2 backlog = 8192;

Eh bien, si vous utilisez http2 pour les connexions SSL, il ne suffit pas de configurer les tampons de demande, vous devez également les configurer dans ngx_http_v2_module, à savoir:

 : http2_max_field_size ; : http2_max_field_size 4k; : http, server 

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

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

Le mettre, par exemple, 8 Ko (ou autant que cela suffit probablement) - nous résolvons le problème.
De telles choses.

Source: https://habr.com/ru/post/fr484330/


All Articles