nginx 反向代理服务器资源偶尔(大概20%)会出现404问题
- 这个问题在不同的环境不容易复现,只是在这个环境发现了这个问题。
通过不带请求头循环请求资源时发现不会出现这个问题;
通过带原始请求头信息循环请求资源时发现了这个问题出现的概率是20%;
通过改变请求头原始信息发现,一般信息不影响,当添加Cookie后会出现这个问题;
通过修改Cookie内容长短发现,Cookie太长的时候100%会出现400错误,Cookie太短的时候不会出现问题,Cookie为原始信息时会出现这个问题,因此定位到问题是Cookie太长导致,减少不必要的Cookie传递后,现在Cookie里面传2455个字符,这个问题明显改善,出现404问题概率由20%降到了0.5%;
部分资源不需要Cookie,可以将Cookie置为空字符串,这些资源就会正常返回了;
部分资源需要Cookie,否则会导致页面跳转到登录页,这部分如果需要在进一步优化的话,需要将Cookie进一步调小。
- 涉及到的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出现的概率。
proxy_hide_header Cookie;
proxy_set_header Cookie $altered_cookie;
# 添加 response header 进行调试
# add_header X-altered_cookie $altered_cookie;
# 可以将下面的代码块复制稍微改一下 不需要 Cookie 的请求将 Cookie置为空,即可正常返回,不在出现404问题
# eg: css 替换为 documents|lib|images|fonts
location /ywjk/powerlogweb/resource/css/ {
# 不需要 Cookie 的请求将 Cookie置为空,即可正常返回,不在出现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 变量打印(输出)-通过 response headers 发送环境变量进行调试https://www.jianshu.com/p/183d4408c5d7
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/