當(dāng)nginx做了負(fù)載均衡之后,同一個ip的url請求服務(wù)器的時候,負(fù)載均衡會根據(jù)每臺服務(wù)器的權(quán)重等一些設(shè)置將請求轉(zhuǎn)發(fā)到不同的服務(wù)器上去進(jìn)行處理,這樣的話針對一些帶有狀態(tài)請求的情況來說就是個很大的問題,Session會無法共享,那么該如何解決呢?
session存在數(shù)據(jù)庫mysql
session保存在數(shù)據(jù)庫中,是把session表和其他的數(shù)據(jù)表存放在一起,那么當(dāng)用戶只要登錄后隨便操作了些什么就要去數(shù)據(jù)庫驗(yàn)證一下session的狀態(tài),這樣無疑加重了mysql數(shù)據(jù)庫的壓力;如果數(shù)據(jù)庫也做了集群的話,那么也就是說每個數(shù)據(jù)庫集群的節(jié)點(diǎn)都得保存這個session表,而且要保證每個集群的節(jié)點(diǎn)中數(shù)據(jù)庫的session表的數(shù)據(jù)保持一致,實(shí)時同步
說明:session保持在數(shù)據(jù)庫,加重了數(shù)據(jù)庫的IO,增大數(shù)據(jù)庫的壓力和負(fù)擔(dān),從而影響數(shù)據(jù)庫的讀寫性能,而且mysql集群的話也不利于session的實(shí)時同步
memcache可以做分布式,php配置文件中設(shè)置存儲方式為memcache,這樣php自己會建立一個session集群,將session數(shù)據(jù)存儲在memcache中。
說明:這種方式來同步session,不會加大數(shù)據(jù)庫的負(fù)擔(dān),而且安全性比用Cookie保存session大大的提高,把session放到內(nèi)存里面,比從文件中讀取要快很多。但是memcache把內(nèi)存分成很多種規(guī)格的存儲塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內(nèi)存,會產(chǎn)生內(nèi)存碎片,如果存儲塊不足,還會產(chǎn)生內(nèi)存溢出。
ip_hash技術(shù)
nginx中可以配置,當(dāng)某個ip下的客戶端請求指定(固定,因?yàn)楦鶕?jù)IP地址計(jì)算出一個hash值,根據(jù)hash值來判斷分配給那臺服務(wù)器,從而每次該ip請求都分配到指定的服務(wù)器)的服務(wù)器,這樣就可以保證有狀態(tài)請求的狀態(tài)的完整性,不至于出現(xiàn)狀態(tài)丟失的情況,以下是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這個方案確實(shí)可以保證帶有狀態(tài)的請求的完整性,但是它有一個很大的缺陷,那就是ip_hash方案必須保證Nginx是最前端的服務(wù)器(接受真實(shí)的ip),如果nginx不是最前端的服務(wù)器,還存在中間件(中間服務(wù)器什么的),那么nginx獲取的ip地址就不是真實(shí)的ip地址,那么這個ip_hash就沒有任何意義
更多Nginx相關(guān)技術(shù)文章,請?jiān)L問Nginx使用教程欄目進(jìn)行學(xué)習(xí)!?