nginx 反向代理服務(wù)器資源偶爾(大概20%)會出現(xiàn)404問題
- 這個問題在不同的環(huán)境不容易復(fù)現(xiàn),只是在這個環(huán)境發(fā)現(xiàn)了這個問題。
通過不帶請求頭循環(huán)請求資源時發(fā)現(xiàn)不會出現(xiàn)這個問題;
通過帶原始請求頭信息循環(huán)請求資源時發(fā)現(xiàn)了這個問題出現(xiàn)的概率是20%;
通過改變請求頭原始信息發(fā)現(xiàn),一般信息不影響,當(dāng)添加Cookie后會出現(xiàn)這個問題;
通過修改Cookie內(nèi)容長短發(fā)現(xiàn),Cookie太長的時候100%會出現(xiàn)400錯誤,Cookie太短的時候不會出現(xiàn)問題,Cookie為原始信息時會出現(xiàn)這個問題,因此定位到問題是Cookie太長導(dǎo)致,減少不必要的Cookie傳遞后,現(xiàn)在Cookie里面?zhèn)?455個字符,這個問題明顯改善,出現(xiàn)404問題概率由20%降到了0.5%;
部分資源不需要Cookie,可以將Cookie置為空字符串,這些資源就會正常返回了;
部分資源需要Cookie,否則會導(dǎo)致頁面跳轉(zhuǎn)到登錄頁,這部分如果需要在進(jìn)一步優(yōu)化的話,需要將Cookie進(jìn)一步調(diào)小。
- 涉及到的NGINX配置如下:
nginx.conf
http {
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
#client_body_buffer_size 1000M;
#client_max_body_size 1000M;
proxy_buffer_size 256k;
proxy_buffers 40 256k;
proxy_busy_buffers_size 256k;
proxy_connect_timeout 12000;
proxy_send_timeout 12000;
proxy_read_timeout 12000;
server {
# 日志前端資源
location /ywjk/powerlogweb/ {
set $altered_cookie $http_cookie;
set $token ""
# 獲取cookie某個key的值
set $sessionid $cookie_sessionid;
set $csrftoken $cookie_csrftoken;
# 獲取cookie某個key的值
if ( $http_cookie ~* "Admin-Token=(.+?)(?=;|$)" ) {
set $token $1;
}
set $altered_cookie "Admin-Token=$token; sessionid=$sessionid; csrftoken=$csrftoken; "
# 更新 proxy_cookie_path
proxy_cookie_path / /;
# 更新 Cookie 只傳需要用到的 Cookie 多余的不傳 ,盡量減小 Cookie 大小,減小404出現(xiàn)的概率。
proxy_hide_header Cookie;
proxy_set_header Cookie $altered_cookie;
# 添加 response header 進(jìn)行調(diào)試
# add_header X-altered_cookie $altered_cookie;
# 可以將下面的代碼塊復(fù)制稍微改一下 不需要 Cookie 的請求將 Cookie置為空,即可正常返回,不在出現(xiàn)404問題
# eg: css 替換為 documents|lib|images|fonts
location /ywjk/powerlogweb/resource/css/ {
# 不需要 Cookie 的請求將 Cookie置為空,即可正常返回,不在出現(xiàn)404問題
proxy_hide_header Cookie;
proxy_set_header Cookie "";
proxy_pass http://log-web/resource/css/;
client_max_body_size 500M;
client_body_buffer_size 500M;
}
proxy_pass http://log-web/;
client_max_body_size 500M;
client_body_buffer_size 500M;
}
}
}
測試出錯率腳本
testCurl.sh
Cookie="Admin-Token=JBY2NvdW50IjoiY"
echo $Cookie
for i in $(seq 1000) ; do
curl 'http://192.168.140.70/resource/css/base.css' \
-H 'Accept: text/css,*/*;q=0.1' \
-H 'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6' \
-H 'Cache-Control: no-cache' \
-H 'Connection: keep-alive' \
-H "Cookie: $Cookie" \
-H 'Host: 192.168.140.70' \
-H 'Pragma: no-cache' \
-H 'Referer: http://192.168.140.70/powerlog/inner/%2Fdesk%2Fevent' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0' \
--compressed \
-sL -w "code:%{http_code}" \
-o ./dev/dev$i \
--insecure
echo ''
done
參考:
Nginx獲取cookie值的兩種方法 https://www.edoou.com/articles/1651545531542634
Nginx反向代理丟失cookie問題處理 https://www.cnblogs.com/tiancai/p/17261923.html
刪除 nginx 反向代理中的特定 cookie https://qa.1r1g.com/sf/ask/4728422051/
刪除nginx反向代理中的特定cookie https://www.saoniuhuo.com/question/detail-2802774.html
解決nginx報頭部或者cookie過大的400錯誤 https://jingyan.baidu.com/article/4f34706ed4f80fe387b56dca.html
Nginx報錯104:Connection reset by peer問題的解決及分析 https://pythonjishu.com/rsiaasuyrkvnyzw/