一篇來自「旁注」類別的文章。
TL:DR:
http2_max_field_size 8k; # всех спасет!
在其中一個專案中,在更改了後端的一些內部邏輯後,我開始在日誌中觀察到一個奇怪的response_code,即0。在日誌中它看起來像這樣:
{
"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": ""
}
閱讀文件並在谷歌上搜尋這個主題絕對沒有任何結果 - 因為...... 據稱,當客戶端關閉連線而不傳遞標頭時,會發生此行為。 好吧,還有 wsgi_ 緩衝區大小的各種奇特事物,在我們的例子中,它不適合「以任何方式」這個詞。
總的來說,我們認為這個問題不是問題,因為考慮到我們的數量,這個問題根本不重要。
直到我對以下問題感到困惑:在某些情況下,連結可以透過 http 打開,沒有任何問題,但完全拒絕透過 https 工作,產生奇妙的效果: 連接 #0 到主機 example.com 保持不變
捲曲:(52)伺服器的空回复
在日誌中,我們只能透過 IP 來追蹤這個東西 - 沒有請求或任何其他數據,如上面的範例所示。 只是臭名昭著的狀態是0,但我知道我沒有中斷請求! 我開始思考可能出什麼問題。 一切都變得非常簡單:
聽443 ssl http2 積壓=8192;
好吧,如果你使用 http2 進行 ssl 連接,那麼僅僅配置請求緩衝區是不夠的,還必須在 ngx_http_v2_module 中配置它們,即:
Синтаксис: http2_max_field_size размер;
Умолчание: http2_max_field_size 4k;
Контекст: http, server
限制使用 HPACK 壓縮的請求標頭的最大大小。 此約束同樣適用於名稱和值。 如果使用霍夫曼編碼,解壓縮後的名稱和值字串的實際大小可能會更大。 預設限制適用於大多數查詢。
一般來說,就是這樣。 為什麼全部? 因為連結的長度很長——比那些相同的 4k 還要長。
例如,透過將其設為 8kb(或可能足夠的大小),我們可以解決問題。
這樣的情況。
來源: www.habr.com