Artikel af typen "noter i margenerne".
TL:DR:
http2_max_field_size 8k; # redder alle!På et af projekterne, efter ændring af noget intern backend-logik, begyndte jeg at observere en mærkelig response_code i loggene, nemlig — 0. I loggene ser det cirka sådan her ud:
{
"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": ""
}
At læse dokumentation og google om emnet gav ingenting — da det hævdes, at sådan adfærd opstår, når klienten har lukket forbindelsen uden at sende overskrifter. Og så var der forskellig eksotisme med størrelsen på bufferen for wsgi_, hvilket i vores tilfælde ikke passede på nogen måde.
Generelt besluttede vi, at problemet ikke var et problem, da det under vores volumen slet ikke var kritisk.
Lige indtil jeg blev konfronteret med det næste problem: i nogle tilfælde åbnes links uden problemer via http, men nægter fuldstændigt at fungere via https, hvilket giver en fantastisk besked: Connection #0 to host example.com left intact
curl: (52) Tomt svar fra serveren
I loggene kunne denne ting kun spores via IP — hverken request eller nogen andre data, som det kan ses fra eksemplet ovenfor — er der. Kun den berygtede status 0, men jeg ved jo, at jeg ikke afbrød forespørgslen! Begyndte at kigge på, hvad der kunne gå galt. Og alt viste sig at være meget simpelt:
listen 443 ssl http2 backlog=8192;
Nå, sådan er det — hvis man bruger http2 til ssl-forbindelser, så er det ikke nok bare at konfigurere buffere for requesten, de skal også konfigureres i ngx_http_v2_module, nemlig:
Syntax: http2_max_field_size størrelse;
Standard: http2_max_field_size 4k;
Kontext: http, server
Begrænser den maksimale størrelse af headers i en anmodning, der er komprimeret ved hjælp af HPACK. Begrænsningen gælder ligeligt både for navnet og værdien. Hvis Huffman-kodning anvendes, kan den faktiske størrelse af de udpakkede navn- og værdi-strenge være større. Standardbegrænsningen passer til de fleste anmodninger.
I det hele taget, det er det. Og hvorfor? Fordi længden på linket var stor — mere end de der 4k.
Ved at indstille det til, for eksempel, 8kb (eller så meget som sandsynligvis er tilstrækkeligt) — løser vi problemet.
Sådan er det.
Kilde: habr.com
