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
