1. 程式人生 > >Nginx反向代理實現會話(session)保持的兩種方式

Nginx反向代理實現會話(session)保持的兩種方式

最近在搭建nginx反向代理tomcat服務部署專案時發現,雖然代理成功了,但是無法登陸系統,系統一登入就重新整理,無法跳轉至系統主介面,後來多方查詢是因為沒有實現反省代理會話,雖然使用者名稱和密碼輸對了但是系統不知反饋給那個代理的服務,然後在nginx配置檔案里加入ip_hash就可以成功登入了。

1. ip_hash

upstream backend {
    ip_hash;#加在這裡就可以
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com
down; server backend4.example.com; }

ip_hash簡單易用,但有如下問題:
1. 當後端伺服器宕機後,session會丟失;
2. 來自同一區域網的客戶端會被轉發到同一個後端伺服器,可能導致負載失衡;
3. 不適用於CDN網路,不適用於前段還有代理的情況。

2. sticky_cookie_insert
使用sticky_cookie_insert啟用會話親緣關係,這會導致來自同一客戶端的請求被傳遞到一組伺服器在同一臺伺服器。與ip_hash不同之處在於,它不是基於IP來判斷客戶端的,而是基於cookie來判斷。因此可以避免上述ip_hash中來自同一區域網的客戶端和前段代理導致負載失衡的情況。

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
    sticky_cookie_insert srv_id expires=1h domain=toxingwang.com path=/;#加在這裡即可
}

說明:
1. expires:設定瀏覽器中保持cookie的時間。
2. domain:定義cookie的域 。
3. path:為cookie定義路徑。