日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

解决nginx负载均衡的session共享问题

發(fā)布時(shí)間:2023/11/28 生活经验 59 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解决nginx负载均衡的session共享问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

之前有寫(xiě)過(guò)ubuntu環(huán)境下搭建nginx環(huán)境,今天來(lái)談一下nginx session共享問(wèn)題,查了一些資料,看了一些別人寫(xiě)的文檔,總結(jié)如下,實(shí)現(xiàn)nginx session的共享服務(wù)器有多臺(tái),用nginx做負(fù)載均衡,這樣同一個(gè)IP訪問(wèn)同一個(gè)頁(yè)面會(huì)被分配到不同的服務(wù)器上,如果session不同步的話,就會(huì)出現(xiàn)很多問(wèn)題,比如說(shuō)最常見(jiàn)的登錄狀態(tài),下面提供了幾種方式來(lái)解決session共享的問(wèn)題:

1、不使用session,換用cookie

session是存放在服務(wù)器端的,cookie是存放在客戶端的,我們可以把用戶訪問(wèn)頁(yè)面產(chǎn)生的session放到cookie里面,就是以cookie為中轉(zhuǎn)站。你訪問(wèn)web服務(wù)器A,產(chǎn)生了session然后把它放到cookie里面,當(dāng)你的請(qǐng)求被分配到B服務(wù)器時(shí),服務(wù)器B先判斷服務(wù)器有沒(méi)有這個(gè)session,如果沒(méi)有,再去看看客戶端的cookie里面有沒(méi)有這個(gè)session,如果也沒(méi)有,說(shuō)明session真的不存,如果cookie里面有,就把cookie里面的sessoin同步到服務(wù)器B,這樣就可以實(shí)現(xiàn)session的同步了。

說(shuō)明:這種方法實(shí)現(xiàn)起來(lái)簡(jiǎn)單,方便,也不會(huì)加大數(shù)據(jù)庫(kù)的負(fù)擔(dān),但是如果客戶端把cookie禁掉了的話,那么session就無(wú)從同步了,這樣會(huì)給網(wǎng)站帶來(lái)?yè)p失;cookie的安全性不高,雖然它已經(jīng)加了密,但是還是可以偽造的。

2、session存在數(shù)據(jù)庫(kù)(MySQL等)中

可以配置將session保存在數(shù)據(jù)庫(kù)中,這種方法是把存放session的表和其他數(shù)據(jù)庫(kù)表放在一起,如果mysql也做了集群了話,每個(gè)mysql節(jié)點(diǎn)都要有這張表,并且這張session表的數(shù)據(jù)表要實(shí)時(shí)同步。

說(shuō)明:用數(shù)據(jù)庫(kù)來(lái)同步session,會(huì)加大數(shù)據(jù)庫(kù)的IO,增加數(shù)據(jù)庫(kù)的負(fù)擔(dān)。而且數(shù)據(jù)庫(kù)讀寫(xiě)速度較慢,不利于session的適時(shí)同步。

3、session存在memcache或者redis中

memcache可以做分布式,程序配置文件中設(shè)置存儲(chǔ)方式為memcache,這樣程序自己會(huì)建立一個(gè)session集群,將session數(shù)據(jù)存儲(chǔ)在memcache中。

說(shuō)明:以這種方式來(lái)同步session,不會(huì)加大數(shù)據(jù)庫(kù)的負(fù)擔(dān),并且安全性比用cookie大大的提高,把session放到內(nèi)存里面,比從文件中讀取要快很多。但是memcache把內(nèi)存分成很多種規(guī)格的存儲(chǔ)塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用內(nèi)存,會(huì)產(chǎn)生內(nèi)存碎片,如果存儲(chǔ)塊不足,還會(huì)產(chǎn)生內(nèi)存溢出。

4、nginx中的ip_hash技術(shù)能夠?qū)⒛硞€(gè)ip的請(qǐng)求定向到同一臺(tái)后端,這樣一來(lái)這個(gè)ip下的某個(gè)客戶端和某個(gè)后端就能建立起穩(wěn)固的session,ip_hash是在upstream配置中定義的:

upstream nginx.example.com
{server 127.0.0.1:8080;server 127.0.0.1:808;ip_hash;
}
server
{listen 80;location /{proxy_passhttp://nginx.example.com;}
}

ip_hash是容易理解的,但是因?yàn)閮H僅能用ip這個(gè)因子來(lái)分配后端,因此ip_hash是有缺陷的,不能在一些情況下使用:

<1>nginx不是最前端的服務(wù)器。

ip_hash要求nginx一定是最前端的服務(wù)器,否則nginx得不到正確ip,就不能根據(jù)ip作hash。譬如使用的是squid為最前端,那么nginx取ip時(shí)只能得到squid的服務(wù)器ip地址,用這個(gè)地址來(lái)作分流是肯定錯(cuò)亂的。

<2>nginx的后端還有其它方式的負(fù)載均衡。

假如nginx后端又有其它負(fù)載均衡,將請(qǐng)求又通過(guò)另外的方式分流了,那么某個(gè)客戶端的請(qǐng)求肯定不能定位到同一臺(tái)session應(yīng)用服務(wù)器上。這么算起來(lái),nginx后端只能直接指向應(yīng)用服務(wù)器,或者再搭一個(gè)squid,然后指向應(yīng)用服務(wù)器。最好的辦法是用 location作一次分流,將需要session的部分請(qǐng)求通過(guò)ip_hash分流,剩下的走其它后端去。

5、upstream_hash

為了解決ip_hash的一些問(wèn)題,可以使用upstream_hash這個(gè)第三方模塊,這個(gè)模塊多數(shù)情況下是用作url_hash的,但是并不妨礙將它用來(lái)做session共享。
<1>fair(第三方)
按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。

upstream resinserver{server server1;server server2;fair;
}

<2>url_hash(第三方)
按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。
例:在upstream中加入hash語(yǔ)句,server語(yǔ)句中不能寫(xiě)入weight等其他的參數(shù),hash_method是使用的hash算法

upstream resinserver{
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
tips:upstream resinserver{#定義負(fù)載均衡設(shè)備的Ip及設(shè)備狀態(tài)
ip_hash;
server 127.0.0.1:8000 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6801;
server 127.0.0.1:6802 backup;
}

在需要使用負(fù)載均衡的server中增加
proxy_pass http://resinserver/;

總結(jié)

以上是生活随笔為你收集整理的解决nginx负载均衡的session共享问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。