Articol din categoria „note de margine”.
TL:DR:
http2_max_field_size 8k; # te va salva!Pe unul dintre proiecte, după ce am schimbat o parte din logica internă a backend-ului, am început să observ un cod de răspuns ciudat în loguri, și anume — 0. În loguri arată aproximativ așa:
{
"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": ""
}
Citirea documentației și căutarea pe Google despre acest subiect nu a adus nimic — se afirmă că un astfel de comportament apare atunci când clientul a închis conexiunea fără a transmite anteturile. De asemenea, au fost diverse excentricități cu dimensiunea buffer-ului pentru wsgi_, ceea ce în cazul nostru nu se potrivea deloc.
În general, am decis că problema nu este o problemă, având în vedere că pentru volumele noastre, nu este critică.
Exact până la momentul în care am fost provocat de următoarea problemă: în unele cazuri, linkurile se deschid fără probleme pe http, dar refuză complet să funcționeze pe https, oferind o minunată: Connection #0 to host example.com left intact
curl: (52) Răspuns gol de la server
În loguri, am reușit să urmăresc această problemă doar după IP — niciun request, nici alte date, așa cum se vede din exemplul de mai sus — nu există. Doar binecunoscutul status 0, dar eu știu că nu am întrerupt cererea! Am început să cercetez ce ar putea merge prost. Și totul s-a dovedit a fi foarte simplu:
listen 443 ssl http2 backlog=8192;
Așadar, dacă folosești http2 pentru conexiuni ssl, nu este suficient să configurezi doar buffer-ele cererii, trebuie să le configurezi și în ngx_http_v2_module, și anume:
Sintaxa: http2_max_field_size dimensiune;
Valoare implicită: http2_max_field_size 4k;
Context: http, server
Restricționează dimensiunea maximă a antetului cererii, comprimat folosind HPACK. Restricția se aplică atât numelui, cât și valorii. Dacă se aplică codificarea Huffman, dimensiunea efectivă a șirurilor despachetate ale numelui și valorii poate fi mai mare. Restricția implicită este potrivită pentru majoritatea cererilor.
În general, aceasta este totul. Și de ce? Pentru că lungimea linkului era mare — mai mare decât cele 4k.
Setând-o la, de exemplu, 8kb (sau cât ai nevoie cu siguranță) — rezolvăm problema.
Cam așa stau lucrurile.
Sursa: habr.com
