1. 程式人生 > 實用技巧 >由於請求頭過大導致訪問報錯502

由於請求頭過大導致訪問報錯502

nginx錯誤日誌內容
[error] 12917#0: *62380774 upstream sent too big header while reading response header from upstream.

使用者瀏覽器請求到 Nginx 的請求頭帶的資訊太多,超過了 Nginx 設定的大小。有可能是前端設定的Cookie過大、

解決辦法

1、前端儘量使用少量的 Cookie 儲存資料。
2、後臺 Nginx 的 header 大小配置改大。

第一種解決方法需要調整前端程式碼

第二種方法需要在nginx配置檔案的http段新增如下內容:

proxy_buffer_size 128k;

proxy_buffers 
32 32k; proxy_busy_buffers_size 128k;

補充知識

Nginx 預設的 header 長度上限是4k,如果超過了這個值,就會報錯。

如果header頭資訊請求超過了,Nginx 會直接返回400錯誤

可以通過以下2個引數來調整 Nginx 的 header 上限

client_header_buffer_size 16k;
large_client_header_buffers 4 16k;

下面講講這兩個引數以及他們之間的關聯關係:

對nginx處理header時的方法:

  1. 先處理請求的request_line,之後才是request_header
  2. 這兩者的buffer
    分配策略相同。
  3. 先根據client_header_buffer_size配置的值分配一個buffer,如果分配的buffer無法容納request_line/request_header,那麼就會再次根據large_client_header_buffers配置的引數分配large_buffer,如果large_buffer還是無法容納,那麼就會返回414(處理request_line)/400(處理request_header)錯誤。
  4. 如果你的請求中的header都很大,那麼應該使用client_header_buffer_size,這樣能減少一次記憶體分配。
  5. 如果你的請求中只有少量請求header很大,那麼應該使用large_client_header_buffers,因為這樣就僅需在處理大header時才會分配更多的空間,從而減少無謂的記憶體空間浪費。

針對get請求,解決請求串過長的問題:

針對get請求,我們可以通過修改另外兩個配置來解決請求串超長的問題:

client_header_buffer_size語法:

client_header_buffer_size size

預設值:1k使用欄位:http, server這個指令指定客戶端請求的http頭部緩衝區大小絕大多數情況下一個頭部請求的大小不會大於1k不過如果有來自於wap客戶端的較大的cookie它可能會大於1k,Nginx將分配給它一個更大的緩衝區,這個值可以在large_client_header_buffers裡面設定。

large_client_header_buffers語法:

large_client_header_buffers number size

預設值:large_client_header_buffers4 4k/8k使用欄位:http, server指令指定客戶端請求的一些比較大的標頭檔案到緩衝區的最大值,如果一個請求的URI大小超過這個值,伺服器將返回一個"Request URI too large" (414),同樣,如果一個請求的頭部欄位大於這個值,伺服器將返回"Bad request" (400)。緩衝區根據需求的不同是分開的。預設一個緩衝區大小為作業系統中分頁檔案大小,通常是4k或8k,如果一個連線請求將狀態轉換為keep-alive,這個緩衝區將被釋放。

那麼有人就會覺得奇怪了,為什麼修改http header的大小就能解決GET請求串過長的問題呢,這就要從HTTP協議的GET請求說起了,其實GET提交,請求的資料會附在URL之後(就是把資料放置在HTTP協議頭中)。