當nginx做了負載平衡之後,同一個ip的url請求伺服器的時候,負載平衡會根據每台伺服器的權重等一些設定將請求轉發到不同的伺服器上去進行處理,這樣的話針對一些帶有狀態請求的情況來說就是個很大的問題,session會無法共享,那麼該如何解決呢?
#session存在資料庫mysql
session儲存在資料庫中,是把session表和其他的資料表存放在一起,那麼當使用者只要登入後隨便操作了些什麼就要去資料庫驗證一下session的狀態,這樣無疑加重了mysql資料庫的壓力;如果資料庫也做了叢集的話,那麼也就是說每個資料庫叢集的節點都得保存這個session表,而且要確保每個叢集的節點中資料庫的session表的資料保持一致,即時同步
說明:session維持在資料庫,加重了資料庫的IO,增大資料庫的壓力和負擔,進而影響資料庫的讀寫效能,而且mysql叢集的話也不利於session的即時同步
session存在緩存memcache或者redis中
memcache可以做分佈式,php設定檔中設定儲存方式為memcache,這樣php自己就會建立一個session集群,將session資料儲存在memcache中。
說明:這種方式來同步session,不會加大資料庫的負擔,而且安全性比用cookie保存session大大的提高,把session放到記憶體裡面,比從文件中讀取快很多。但是memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內存,會產生內存碎片,如果存儲塊不足,還會產生內存溢出。
ip_hash技術
nginx中可以配置,當某個ip下的客戶端請求指定(固定,因為根據IP位址計算出一個hash值,根據hash值來判斷分配給那台伺服器,從而每次該ip請求都分配到指定的伺服器)的伺服器,這樣就可以保證有狀態請求的狀態的完整性,不至於出現狀態遺失的情況,以下是nginx的配置,可以參考一下:
upstream nginx.example.com { server 192.168.1.2:80; server 192.168.1.3:80; ip_hash; } server { listen 80; location / { proxy_pass http://nginx.example.com; } }
注意:ip_hash這個方案確實可以保證帶有狀態的請求的完整性,但是它有一個很大的缺陷,那就是ip_hash方案必須保證Nginx是最前端的伺服器(接受真實的ip),如果nginx不是最前端的伺服器,還存在中間件(中間伺服器什麼的),那麼nginx取得的ip位址就不是真實的ip位址,那麼這個ip_hash就沒有任何意義
更多Nginx相關技術文章,請造訪Nginx使用教學欄位學習!
以上是nginx如何共享session的詳細內容。更多資訊請關注PHP中文網其他相關文章!