Článok z kategórie „poznámky na okraji“.
TL:DR:
http2_max_field_size 8k; # všetkých zachráni!Na jednom z projektov, po zmene určitej vnútornej logiky backendu, som začal pozorovať zvláštny response_code v logoch, a to konkrétne — 0. V logoch to vyzerá približne takto:
{
"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": ""
}
Čítanie dokumentácie a googlenie na túto tému dalo presne nič — pretože sa uvádza, že takéto správanie nastáva, keď klient uzavrie spojenie a neodošle hlavičky. No a rôzne exotiky s veľkosťou buffera pre wsgi_, čo v našom prípade vôbec nesedelo.
Celkově jsme sa rozhodli, že problém nie je problém, s ohľadom na to, že pri našich objemoch to vôbec nie je kritické.
Presne do okamihu, kým ma neznepokojila ďalšia otázka: v niektorých prípadoch sa odkazy bez problémov otvárajú cez http, ale úplne odmietajú fungovať cez https, vydávajúce zázračné: Connection #0 to host example.com left intact
curl: (52) Prázdna odpoveď zo servera
V logoch sa mi podarilo vystopovať túto vec len podľa IP — ani požiadavka, ani žiadne iné údaje, ako je vidieť z vyššie uvedeného príkladu — nie sú. Iba preslávený status 0, ale ja viem, že som požiadavku neprerušil! Začal som skúmať, čo sa môže pokaziť. A všetko sa ukázalo byť veľmi jednoduché:
listen 443 ssl http2 backlog=8192;
No tak — ak sa používa http2 pre ssl-pripojenia, nestačí len konfigurovať buffery požiadavky, treba ich konfigurovať aj v ngx_http_v2_module, a to konkrétne:
Syntax: http2_max_field_size veľkosť;
Predvolené: http2_max_field_size 4k;
Kontext: http, server
Obmedzuje maximálnu veľkosť hlavičky požiadavky, komprimovanej pomocou HPACK. Obmedzenie sa uplatňuje rovnako na názov, ako aj na hodnotu. Ak sa používa Huffmanovo kódovanie, skutočná veľkosť dekomprimovaných reťazcov názvu a hodnoty môže byť väčšia. Predvolené obmedzenie vyhovuje väčšine požiadaviek.
V podstate to je ono. A prečo? Pretože dĺžka odkazu bola veľká — väčšia, ako tých preslávených 4k.
Nastavením na napríklad 8kb (alebo toľko, koľko určite stačí) — vyriešime problém.
Tak to je.
Zdroj: habr.com
