溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Nginx會(huì)話(huà)保持的方法是什么

發(fā)布時(shí)間:2021-12-10 17:31:41 來(lái)源:億速云 閱讀:496 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“Nginx會(huì)話(huà)保持的方法是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

在使用負(fù)載均衡的時(shí)候會(huì)遇到會(huì)話(huà)保持的問(wèn)題,常用的方法有:

1.ip hash,根據(jù)客戶(hù)端的IP,將請(qǐng)求分配到不同的服務(wù)器

2.cookie,服務(wù)器給客戶(hù)端下發(fā)一個(gè)cookie,具有特定cookie的請(qǐng)求會(huì)分配給它的發(fā)布者

注意:cookie需要瀏覽器支持,且有時(shí)候會(huì)泄露數(shù)據(jù)

1.Sticky工作原理:

Sticky是nginx的一個(gè)模塊,它是基于cookie的一種nginx的負(fù)載均衡解決方案,通過(guò)分發(fā)和識(shí)別cookie,來(lái)使同一個(gè)客戶(hù)端的請(qǐng)求落在同一臺(tái)服務(wù)器上,默認(rèn)標(biāo)識(shí)名為route

(a)客戶(hù)端首次發(fā)起訪(fǎng)問(wèn)請(qǐng)求,nginx接收后,發(fā)現(xiàn)請(qǐng)求頭沒(méi)有cookie,則以輪詢(xún)方式將請(qǐng)求分發(fā)給后端服務(wù)器。

(b)后端服務(wù)器處理完請(qǐng)求,將響應(yīng)數(shù)據(jù)返回給nginx。

(c)此時(shí)nginx生成帶route的cookie,返回給客戶(hù)端。route的值與后端服務(wù)器對(duì)應(yīng),可能是明文,也可能是md5、sha1等Hash值

(d)客戶(hù)端接收請(qǐng)求,并保存帶route的cookie。

(e)當(dāng)客戶(hù)端下一次發(fā)送請(qǐng)求時(shí),會(huì)帶上route,nginx根據(jù)接收到的cookie中的route值,轉(zhuǎn)發(fā)給對(duì)應(yīng)的后端服務(wù)器。

2.重新編譯nginx增加nginx-sticky-module模塊

查詢(xún)bitbucket.org上的該模塊相關(guān)文檔

https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/overview

#查詢(xún)當(dāng)前的nginx編譯參數(shù)可以使用以下命令:

/usr/local/nginx/sbin/nginx -V

[root@nginx ~]# mkdir -p /server/tools

[root@nginx ~]# cd /server/tools

[root@nginx tools]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.8.0

built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) 

built with OpenSSL 1.0.1e-fips 11 Feb 2013

TLS SNI support enabled

configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module 

#下載該模塊的軟件包()

#其他平臺(tái)上的nginx-sticky-module模塊包多是國(guó)外的資源的不方便下載,找到GITHUB上面的該軟件包

[root@nginx tools]# wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip

#解壓

[root@nginx tools]# unzip -D nginx-goodies-nginx-sticky-module-ng-08a395c66e42.zip 

[root@nginx tools]# mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 nginx-sticky-module-ng

#備份之前的nginx目錄(注意:nginx日志可能很大)

[root@nginx tools]# cp -rf /usr/local/nginx/ /server/backup/

#進(jìn)入到之前編譯好的nginx目錄下,重新進(jìn)行編譯安裝

# 注意:是覆蓋安裝

[root@nginx tools]# cd nginx-1.8.0

[root@nginx nginx-1.8.0]# ./configure --prefix=/usr/local/nginx  --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/server/tools/nginx-sticky-module-ng

[root@nginx nginx-1.8.0]# make

[root@nginx nginx-1.8.0]# make install

#安裝完再次查看nginx編譯參數(shù)

[root@nginx tools]# /usr/local/nginx/sbin/nginx -V

nginx version: nginx/1.8.0

built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) 

built with OpenSSL 1.0.1e-fips 11 Feb 2013

TLS SNI support enabled

configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --add-module=/server/tools/nginx-sticky-module-ng

#需要重新啟動(dòng)nginx才可以使用sticky模塊

[root@nginx tools]# service nginx restart

#編輯配置文件,實(shí)例:

upstream www_web_com {

   #ip_hash;

   sticky expires=1h domain=web.com path=/;

   server 10.0.0.16:8080;

   server 10.0.0.17:8080;

}

#具體的配置根據(jù)公司的相關(guān)業(yè)務(wù)配置即可

#之后打開(kāi)網(wǎng)站進(jìn)行測(cè)試,使用sticky的情況下,不管怎么刷新都是如下結(jié)果

#不使用Nginx sticky模塊時(shí),刷幾次就變了(有時(shí)候刷一次,有時(shí)候多刷幾次)

Nginx會(huì)話(huà)保持的方法是什么

備注:每臺(tái)后端真實(shí)服務(wù)器都會(huì)有一個(gè)唯一的route值,所以不管你真實(shí)服務(wù)器前端有幾個(gè)裝了sticky的nginx代理,他都是不會(huì)變化的.

3.sticky模塊的使用

#位置:upstream標(biāo)簽內(nèi)

upstream {

 sticky;

 server 127.0.0.1:9000;

 server 127.0.0.1:9001;

 server 127.0.0.1:9002;

}

#參數(shù),解析

sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] 

[hash=index|md5|sha1] [no_fallback] [secure] [httponly];

[name=route]       設(shè)置用來(lái)記錄會(huì)話(huà)的cookie名稱(chēng)

[domain=.foo.bar]    設(shè)置cookie作用的域名

[path=/]          設(shè)置cookie作用的URL路徑,默認(rèn)根目錄

[expires=1h]        設(shè)置cookie的生存期,默認(rèn)不設(shè)置,瀏覽器關(guān)閉即失效,需要是大于1秒的值

[hash=index|md5|sha1]   設(shè)置cookie中服務(wù)器的標(biāo)識(shí)是用明文還是使用md5值,默認(rèn)使用md5

[no_fallback]       設(shè)置該項(xiàng),當(dāng)sticky的后端機(jī)器掛了以后,nginx返回502 (Bad Gateway or Proxy Error) ,而不轉(zhuǎn)發(fā)到其他服務(wù)器,不建議設(shè)置

[secure]          設(shè)置啟用安全的cookie,需要HTTPS支持

[httponly]         允許cookie不通過(guò)JS泄漏,沒(méi)用過(guò)

4.其他的參數(shù):語(yǔ)法:

以下內(nèi)容摘錄于:http://blog.csdn.net/yu870646595/article/details/52056340

session_sticky [cookie=name] [domain=your_domain] [path=your_path] [maxage=time][mode=insert|rewrite|prefix] 

  [option=indirect] [maxidle=time] [maxlife=time] [fallback=on|off] [hash=plain|md5]

mode設(shè)置cookie的模式:

  insert:在回復(fù)中本模塊通過(guò)Set-Cookie頭直接插入相應(yīng)名稱(chēng)的cookie。

  prefix:不會(huì)生成新的cookie,但會(huì)在響應(yīng)的cookie值前面加上特定的前綴,當(dāng)瀏覽器帶著這個(gè)有特定標(biāo)識(shí)的cookie再次請(qǐng)求時(shí),模塊在傳給后端服務(wù)前先刪除加入的前綴,后端服務(wù)拿到的還是原來(lái)的cookie值,這些動(dòng)作對(duì)后端透明。如:”Cookie: NAME=SRV~VALUE”。

  rewrite: 使用服務(wù)端標(biāo)識(shí)覆蓋后端設(shè)置的用于session sticky的cookie。如果后端服務(wù)在響應(yīng)頭中沒(méi)有設(shè)置該cookie,則認(rèn)為該請(qǐng)求不需要進(jìn)行session sticky,使用這種模式,后端服務(wù)可以控制哪些請(qǐng)求需要sesstion sticky,哪些請(qǐng)求不需要。

option設(shè)置用于session sticky的cookie的選項(xiàng),可設(shè)置成indirect或direct。indirect不會(huì)將session sticky的cookie傳送給后端服務(wù),該cookie對(duì)后端應(yīng)用完全透明。direct則與indirect相反。

maxidle設(shè)置session cookie的最長(zhǎng)空閑的超時(shí)時(shí)間

maxlife設(shè)置session cookie的最長(zhǎng)生存期

maxage是cookie的生存期。不設(shè)置時(shí),瀏覽器或App關(guān)閉后就失效。下次啟動(dòng)時(shí),又會(huì)隨機(jī)分配后端服務(wù)器。所以如果希望該客戶(hù)端的請(qǐng)求長(zhǎng)期落在同一臺(tái)后端服務(wù)器上,可以設(shè)置maxage。

hash不論是明文還是hash值,都有固定的數(shù)目。因?yàn)閔ash是server的標(biāo)識(shí),所以有多少個(gè)server,就有等同數(shù)量的hash值。 

5.其他需要注意的

(a)同一客戶(hù)端的請(qǐng)求,有可能落在不同的后端服務(wù)器上

如果客戶(hù)端啟動(dòng)時(shí)同時(shí)發(fā)起多個(gè)請(qǐng)求。由于這些請(qǐng)求都沒(méi)帶cookie,所以服務(wù)器會(huì)隨機(jī)選擇后端服務(wù)器,返回不同的cookie。當(dāng)這些請(qǐng)求中的最后一個(gè)請(qǐng)求返回時(shí),客戶(hù)端的cookie才會(huì)穩(wěn)定下來(lái),值以最后返回的cookie為準(zhǔn)。

(b)cookie不一定生效

由于cookie最初由服務(wù)器端下發(fā),如果客戶(hù)端禁用cookie,則cookie不會(huì)生效。

(c)客戶(hù)端可能不帶cookie

Android客戶(hù)端發(fā)送請(qǐng)求時(shí),一般不會(huì)帶上所有的cookie,需要明確指定哪些cookie會(huì)帶上。如果希望用sticky做負(fù)載均衡,請(qǐng)對(duì)Android開(kāi)發(fā)說(shuō)加上cookie。

(d)cookie名稱(chēng)不要和業(yè)務(wù)使用的cookie重名。Sticky默認(rèn)的cookie名稱(chēng)是route,可以改成任何值。

(e)客戶(hù)端發(fā)的第一個(gè)請(qǐng)求是不帶cookie的。服務(wù)器下發(fā)的cookie,在客戶(hù)端下一次請(qǐng)求時(shí)才能生效。

(f)Nginx sticky模塊不能與ip_hash同時(shí)使用

“Nginx會(huì)話(huà)保持的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI