怎樣在多臺Web服務器上共享Session

在多臺web服務器上共享session的問題,咱們能夠舉一些案例來講明。好比:如今有三臺php服務器,且實現了負載均衡,如何讓這三臺web服務器共享session數據?
session數據默認是以文件的形式保存在web服務器的磁盤上,通常都是用戶登陸成功的時候,保存session數據。
同一個用戶登陸後,就會將session保存在某個web服務器上,假設是保存在服務器A上,該用戶訪問網站的其餘頁面時,可能請求的就是服務器B或服務器C,但服務器B或服務器C上並無該用戶的session文件,這樣,就會致使網站誤認爲該用戶未登陸,用戶的登陸狀態丟失的問題。
歸根結底,就是要解決多臺web服務器共享session的問題,尚學堂陳老師爲咱們簡要總結了三種方法:php

1、將本該保存在web服務器磁盤上的session數據保存到cookie中
即用cookie會話機制替代session會話機制,將session數據保存到客戶端瀏覽器的cookie中,這樣同一個用戶訪問同一網站時,不管負載均衡到哪臺web服務器,都不用再去服務器請求session數據,而直接獲取客戶端cookie中的session數據。如此,同一個用戶的登陸狀態就不會丟失了。
但這樣作,有三大弊端:
把session數據放到客戶端的cookie中,通常都是重要數據(如用戶id、暱稱等),會存在安全問題,但能夠將session數據加密後,再存放到cookie中,來下降安全風險。
瀏覽器對單個cookie的數據量大小限制爲4K左右,所以會存在數據量的限制問題。
影響帶寬性能,下降了頁面的訪問速度。在高訪問量的狀況下,用戶每次請求時,都要將客戶端cookie中的session數據發送到服務器,要佔用較多的帶寬,進而影響訪問速度,服務器帶寬成本增高。web

2、將本該保存在web服務器磁盤上的session數據保存到MySQL數據庫中
sessionid仍是利用cookie機制存儲到客戶端,但session數據卻存放在MySQL服務器上。(須要創建sessionid和session數據行的對應關係)
但這樣作,只適合訪問量比較小的網站。若是網站的訪問量比較大,對MySQL服務器會形成很大壓力。由於每次用戶請求頁面(即便是刷新頁面)都要查詢MySQL數據庫中的session數據表,進而判斷用戶的登陸狀態和讀取用戶相關信息,勢必會對數據庫服務器形成很大壓力,這樣就會下降服務器的響應速度,影響用戶體驗。redis

3、將本該保存在web服務器磁盤上的session數據保存到內存數據庫(memcache或redis)中
memcache或redis是基於內存存儲數據的,性能很高,尤爲是高併發的狀況下尤其合適。主要是由於從內存中讀取數據要比從磁盤讀取數據快不少。
內存數據庫還支持數據過時失效的機制,正好與session的過時機制對應,推薦使用redis內存數據庫,由於它比memcache支持更多的
數據類型,且支持內存數據備份到磁盤。數據庫

這裏簡單說一下,後面兩種方法的注意要點:
若是多臺web服務器對應的是不一樣的域名,爲了保證cookie的惟一(同一個cookie在各個域名有效),須要修改php.ini文件中的session.cookie_domain
因爲後面兩種方法,屬於用戶自定義的方式管理session,而非默認的文件處理方式,故需修改php.ini中的session.save_handler=user
在開啓session以前(即調用session_start()以前),須要先調用session_set_save_handler,關於session_set_save_handler的具體用法,請參考php手冊。
 瀏覽器

相關文章
相關標籤/搜索