[Nginx] Bagaimana cara mengalahkan response_status = 0

Artikel dari kategori "catatan marginal."

TL: DR:
http2_max_field_size 8k; #  ! 


Pada salah satu proyek, setelah mengubah beberapa logika backend internal, saya mulai mengamati response_code aneh di log, yaitu 0. Dalam log terlihat seperti ini:

 { "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": "" } 

Membaca dokumentasi dan googling tentang topik ini sama sekali tidak memberikan apa - karena dikatakan bahwa perilaku ini terjadi ketika klien menutup koneksi tanpa melewati header. Nah, eksotik berbeda dengan ukuran buffer untuk wsgi_, yang dalam kasus kami tidak cocok dengan kata "tidak mungkin."

Secara umum, mereka memutuskan bahwa masalahnya bukan masalah, mengingat fakta bahwa pada volume kami itu sama sekali tidak kritis.

Tepat sampai saya bingung dengan masalah berikut: dalam beberapa kasus, tautan terbuka tanpa masalah melalui http, tetapi sepenuhnya menolak untuk bekerja melalui https, memberikan yang luar biasa: Koneksi # 0 ke host example.com dibiarkan utuh
curl: (52) Balasan kosong dari server

Dimungkinkan untuk melacak hal ini di log hanya dengan IP - tidak ada permintaan atau data lain, seperti dapat dilihat dari contoh di atas. Hanya status terkenal 0, tetapi saya tahu bahwa saya tidak mengganggu permintaan! Saya mulai memilih apa yang bisa salah. Dan semuanya ternyata sangat sederhana:

dengarkan 443 ssl http2 backlog = 8192;

Nah, jika Anda menggunakan http2 untuk koneksi ssl, itu tidak cukup hanya dengan mengkonfigurasi buffer permintaan, Anda juga harus mengkonfigurasinya di ngx_http_v2_module, yaitu:

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

Membatasi ukuran maksimum header permintaan yang dikompres dengan HPACK. Pembatasan berlaku sama untuk nama dan nilai. Jika pengkodean Huffman digunakan, ukuran sebenarnya dari string yang dibongkar nama dan nilai mungkin lebih besar. Pembatasan default cocok untuk sebagian besar kueri.

Secara umum, ini dia. Dan mengapa? Karena panjang tautannya panjang - lebih dari 4k yang sama.

Meletakkannya, misalnya, 8kb (atau sebanyak mungkin sudah cukup) - kami memecahkan masalah.
Hal-hal seperti itu.

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


All Articles