Nginx反向代理tomcat,很是方便,但是也有些细节的问题需要注意;今天遇到了这样一个问题,tomcat中路径“host/web1”,nginx中直接“host/”代理,这时候session就无法正常进行了。
问题描述: 登录后. 跳转http://127.0.0.1:8080/api/index.do 可以正常访问
nginx 反向代理 proxy_pass http:
//192
.168.1.12:8080
/api/ 登录之后跳转 http://api.tomas.com/index.do 没有带过去cookie 导致拦截跳转登录页
原因分析: 关键在于tomcat 中的应用context 路径是 /api , 而nginx代理后访问 context 路径是 / , JSESSIONID 的值从浏览器经过反向代理到达tomcat时, 由于cookie时内外路径不一致, 使tomcat每次重写设置 JSESSIONID 的值,导致session丢失现象.
之前nginx.conf 配置如下:
server{
listen 80;
server_name api.tommas.com;
location / {
proxy_pass http://192.168.1.12:8080/api/;
proxy_set_header Host $host;
proxy_set_header Remote_Addr $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
而后检查是由于cookies path问题导致,阅读官方资料中显示proxy_cookie_path,遂调整
server{
listen 80;
server_name api.tommas.com;
location / {
proxy_pass http://192.168.1.12:8080/api/;
#proxy_pass 代理 (包含项目名)的url时 注意cookie的Path
proxy_cookie_path /api/ /;
proxy_set_header Host $host;
proxy_set_header Remote_Addr $remote_addr;
proxy_set_header X-Real-IP $remote_addr;
#proxy反向代理header 有可能经过了多级nginx代理 想取原始IP(多个取第一个是原始IP 其余的为代理ip)
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
测试 解决问题。
参考资料:
http://nginx.org/en/docs/http/ngx_http_proxy_module.html?&_ga=1.161910972.1696054694.1422417685#proxy_cookie_path
nginx 配置写法方式二:
加上路径转换:proxy_cookie_path /project /proxy_path;
则可以将project的cookie输出到proxy_path上。正确的配置是:
location /proxy_path {
proxy_pass http://127.0.0.1:8080/project;
proxy_cookie_path /project /proxy_path;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性