使用nginx做負載均衡的session共享問題

2022-07-18 04:42:15 字數 1853 閱讀 2299

查了一些資料,看了一些別人寫的文件,總結如下,實現nginx session的共享

php伺服器有多台,用nginx做負載均衡,這樣同乙個ip訪問同乙個頁面會被分配到不同的伺服器上,如果session不同步的話,就會出現很多問題,比如說最常見的登入狀態,下面提供了幾種方式來解決session共享的問題:

1、不使用session,換用cookie

session是存放在伺服器端的,cookie是存放在客戶端的,我們可以把使用者訪問頁面產生的session放到cookie裡面,就是以cookie為中轉站。你訪問web伺服器a,產生了session然後把它放到cookie裡面,當你的請求被分配到b伺服器時,伺服器b先判斷伺服器有沒有這個session,如果沒有,再去看看客戶端的cookie裡面有沒有這個session,如果也沒有,說明session真的不存,如果cookie裡面有,就把cookie裡面的sessoin同步到伺服器b,這樣就可以實現session的同步了。

說明:這種方法實現起來簡單,方便,也不會加大資料庫的負擔,但是如果客戶端把cookie禁掉了的話,那麼session就無從同步了,這樣會給**帶來損失;cookie的安全性不高,雖然它已經加了密,但是還是可以偽造的。

2、session存在資料庫(mysql等)中

php可以配置將session儲存在資料庫中,這種方法是把存放session的表和其他資料庫表放在一起,如果mysql也做了集群了話,每個mysql節點都要有這張表,並且這張session表的資料表要實時同步。

說明:用資料庫來同步session,會加大資料庫的io,增加資料庫的負擔。而且資料庫讀寫速度較慢,不利於session的適時同步。

3、session存在memcache或者redis中

memcache可以做分布式,php配置檔案中設定儲存方式為memcache,這樣php自己會建立乙個session集群,將session資料儲存在memcache中。

說明:以這種方式來同步session,不會加大資料庫的負擔,並且安全性比用cookie大大的提高,把session放到記憶體裡面,比從檔案中讀取要快很多。但是memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用記憶體,會產生記憶體碎片,如果儲存塊不足,還會產生記憶體溢位。

4、nginx中的ip_hash技術能夠將某個ip的請求定向到同一台後端,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的:

[html] view plaincopy在code上檢視**片派生到我的**片

upstream nginx.example.com

server

} ip_hash是容易理解的,但是因為僅僅能用ip這個因子來分配後端,因此ip_hash是有缺陷的,不能在一些情況下使用:

1.nginx不是最前端的伺服器。

ip_hash要求nginx一定是最前端的伺服器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用的是squid為最前端,那麼nginx取ip時只能得到squid的伺服器ip位址,用這個位址來作分流是肯定錯亂的。

2.nginx的後端還有其它方式的負載均衡。

假如nginx後端又有其它負載均衡,將請求又通過另外的方式分流了,那麼某個客戶端的請求肯定不能定位到同一臺session應用伺服器上。這麼算起來,nginx後端只能直接指向應用伺服器,或者再搭乙個squid,然後指向應用伺服器。最好的辦法是用 location作一次分流,將需要session的部分請求通過ip_hash分流,剩下的走其它後端去。

5、upstream_hash

為了解決ip_hash的一些問題,可以使用upstream_hash這個第三方模組,這個模組多數情況下是用作url_hash的,但是並不妨礙將它用來做session共享。沒試過真心的不明白

使用nginx做負載均衡

負載均衡,單從字面上的意思來理解就可以解釋n臺伺服器平均分擔負載,不會因為某台伺服器負載高宕機而某台伺服器閒置的情況。那麼負載均衡的前提就是要有多台伺服器才能實現,也就是兩台以上即可。首先,選擇乙個 伺服器,此處用的nginx伺服器,在 伺服器的nginx.conf 此處是在nignx.conf中i...

UDP協議使用nginx做負載均衡

nginx支援位於傳輸層的udp協議進行負載均衡,nginx的udp 功能依賴與stream模組,linux支援stream模組,windows版目前是不支援的所以windows不能進行udp stream 模組不會預設安裝,需要在安裝nginx時啟用此模組 進入nginx安裝包解壓目錄中 conf...

利用Nginx做負載均衡

最近正在研究nginx,nginx作為反向 伺服器,可以對web伺服器提供加速,並且具有負載均衡的功能。在windows版本中,將壓縮包進行解壓,執行命令 1 start nginx 這樣就可以啟動nginx服務了。而執行命令 1 nginx s stop 可以停止服務。這是我在192.168.3....