[Nginx] Bagaimana untuk mengalahkan status_respons = 0

Sebuah artikel daripada kategori "nota tepi".

TL: DR:

http2_max_field_size 8k; # всСх спасСт!

Pada salah satu projek, selepas menukar beberapa logik dalaman bahagian belakang, saya mula melihat respons_code yang pelik dalam log, iaitu 0. Dalam log ia kelihatan 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 mengenai topik ini langsung tidak membuahkan hasil - kerana... Dinyatakan bahawa tingkah laku ini berlaku apabila klien menutup sambungan tanpa melepasi pengepala. Nah, dan pelbagai perkara eksotik dengan saiz penampan untuk wsgi_, yang dalam kes kami tidak sesuai dengan perkataan "dalam apa jua cara".

Secara umum, kami memutuskan bahawa masalah itu bukan masalah, dengan mengambil kira hakikat bahawa pada jumlah kami ia tidak sama sekali kritikal.

Tepat sehingga saya hairan dengan masalah berikut: dalam beberapa kes, pautan dibuka tanpa masalah melalui http, tetapi enggan sepenuhnya berfungsi melalui https, menghasilkan yang indah: Sambungan #0 ke hos example.com dibiarkan utuh
curl: (52) Balasan kosong dari pelayan

Dalam log, kami dapat menjejaki perkara ini hanya melalui IP - tidak ada permintaan atau data lain, seperti yang dapat dilihat dari contoh di atas. Hanya status yang terkenal ialah 0, tetapi saya tahu bahawa saya tidak mengganggu permintaan itu! Saya mula memikirkan apa yang boleh berlaku. Dan semuanya ternyata sangat mudah:

dengarkan 443 ssl http2 tunggakan=8192;

Nah, jika anda menggunakan http2 untuk sambungan ssl, maka tidak cukup hanya untuk mengkonfigurasi penampan permintaan, mereka juga mesti dikonfigurasikan dalam ngx_http_v2_module, iaitu:

Бинтаксис:	http2_max_field_size Ρ€Π°Π·ΠΌΠ΅Ρ€;
Π£ΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΠ΅:	http2_max_field_size 4k;
ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚:	http, server

Mengehadkan saiz maksimum pengepala permintaan yang dimampatkan menggunakan HPACK. Kekangan digunakan sama rata pada kedua-dua nama dan nilai. Jika pengekodan Huffman digunakan, saiz sebenar rentetan nama dan nilai yang dibongkar mungkin lebih besar. Had lalai sesuai untuk kebanyakan pertanyaan.

Secara umum, ini dia. Dan kenapa semua? Kerana panjang pautan itu panjang - lebih panjang daripada 4k yang sama.

Dengan menetapkannya kepada, sebagai contoh, 8kb (atau seberapa banyak yang mungkin mencukupi), kami menyelesaikan masalah itu.
Perkara sedemikian.

Sumber: www.habr.com

Tambah komen