[Nginx] 如何打敗response_status = 0

一篇來自「旁注」類別的文章。

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

添加評論