由於請求頭過大導致訪問報錯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_buffers 4 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協議頭中)。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM