nginx反向代理(proxy_pass)tomcat導致session失效的問題解決
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丟失現象.
server{
listen 80; server_name api.tommas.com; location / { proxy_pass http://192.168.1.12:8080/api/; proxy_set_header Host $host;而後檢查是由於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_pathnginx 配置寫法方式二:
加上路徑轉換: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;
}