Nginx作為一款專業的反向代理伺服器,由於其效能突出,現在一般中大型網站架構模式中,都會將它作為前置的反向代理伺服器。但在部署反向代理之後,有個問題就來了,那就是如何實現會話保持?
我們知道,HTTP協議本身是無狀態的。什麼意思呢?就是使用者向瀏覽器發出請求後,伺服器預設是無法直接識別使用者的,無法將使用者進行區分,這就會存在很多問題,於是就有了會話機制。
具體如何實現會話的呢?主要有兩種會話:Cookie會話、Session會話。Session會話是儲存在伺服器端的,然後將SessionID存入Cookie中,使用者下次請求伺服器時,伺服器能夠識別Cookie中的SessionID然後找到對應的Session,這樣伺服器就能識別使用者了。
上面說到了,Session是儲存在伺服器端的,當使用了反向代理後,同一使用者的多次請求不能保證都落在同一臺後端伺服器上,這樣使用者瀏覽器中的Cookie即使傳遞到後端伺服器,伺服器也未必能找到對應的Session,於是,會話丟失了!
其實會話保持有很多種解決方案,下面結合我的實際經驗總結一下供大家參考:
1、Nginx會話保持機制
Nginx自帶有會話保持機制,常見的有:
ip_hash:使用源地址雜湊演算法,這樣同一客戶端的請求都會到達同一個後端伺服器;
sticky_cookie_insert:此演算法基於Cookie來實現的,此模組需要編譯安裝。
2、會話共享機制
如果我們讓多個後端節點伺服器的Session保持一致,不就可以解決落地伺服器的會話保持了麼?說得通俗點,我們把Session集中管理,然後各個節點伺服器從這裡取Session,就能保持會話了。
實現方案很多,比如說:
Session入庫;
Session存入NoSQL(Memcache、Redis)中。
Nginx作為一款專業的反向代理伺服器,由於其效能突出,現在一般中大型網站架構模式中,都會將它作為前置的反向代理伺服器。但在部署反向代理之後,有個問題就來了,那就是如何實現會話保持?
什麼是會話保持?我們知道,HTTP協議本身是無狀態的。什麼意思呢?就是使用者向瀏覽器發出請求後,伺服器預設是無法直接識別使用者的,無法將使用者進行區分,這就會存在很多問題,於是就有了會話機制。
具體如何實現會話的呢?主要有兩種會話:Cookie會話、Session會話。Session會話是儲存在伺服器端的,然後將SessionID存入Cookie中,使用者下次請求伺服器時,伺服器能夠識別Cookie中的SessionID然後找到對應的Session,這樣伺服器就能識別使用者了。
反向代理為什麼會導致會話丟失?上面說到了,Session是儲存在伺服器端的,當使用了反向代理後,同一使用者的多次請求不能保證都落在同一臺後端伺服器上,這樣使用者瀏覽器中的Cookie即使傳遞到後端伺服器,伺服器也未必能找到對應的Session,於是,會話丟失了!
使用了反向代理後如何保持會話?其實會話保持有很多種解決方案,下面結合我的實際經驗總結一下供大家參考:
1、Nginx會話保持機制
Nginx自帶有會話保持機制,常見的有:
ip_hash:使用源地址雜湊演算法,這樣同一客戶端的請求都會到達同一個後端伺服器;
sticky_cookie_insert:此演算法基於Cookie來實現的,此模組需要編譯安裝。
2、會話共享機制
如果我們讓多個後端節點伺服器的Session保持一致,不就可以解決落地伺服器的會話保持了麼?說得通俗點,我們把Session集中管理,然後各個節點伺服器從這裡取Session,就能保持會話了。
實現方案很多,比如說:
Session入庫;
Session存入NoSQL(Memcache、Redis)中。