nginx反向代理(proxy_pass)tomcat導致session失效的問題解決

學習nginx http://www.nginx.cn/nginx-how-to

 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丟失現象.

<div fc05="" fc11="" nbw-blog="" ztag"="" style="margin: 15px 0px; padding: 5px 0px; word-wrap: break-word; overflow: hidden;">
之前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;
    }

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章