1. 程式人生 > >nginx會話保持之sticky模組

nginx會話保持之sticky模組

1.在使用負載均衡的時候會遇到會話保持的問題,常用的方法有:
1.1.ip hash,根據客戶端的IP,將請求分配到不同的伺服器上;
1.2.cookie,伺服器給客戶端下發一個cookie,具有特定cookie的請求會分配給它的釋出者;
注意:cookie需要瀏覽器支援,且有時候會洩露資料
2.Sticky工作原理 :
Sticky是nginx的一個模組,它是基於cookie的一種nginx的負載均衡解決方案,通過分發和識別cookie,來使同一個客戶端的請求落在同一臺伺服器上,預設標識名為route。
2.1.客戶端首次發起訪問請求,nginx接收後,發現請求頭沒有cookie,則以輪詢方式將請求分發給後端伺服器。
2.2.後端伺服器處理完請求,將響應資料返回給nginx。
2.3.此時nginx生成帶route的cookie,返回給客戶端。route的值與後端伺服器對應,可能是明文,也可能是md5(預設md5)、sha1等Hash值。
2.4.客戶端接收請求,並儲存帶route的cookie。
2.5.當客戶端下一次傳送請求時,會帶上route,nginx根據接收到的cookie中的route值,轉發給對應的後端伺服器。
3.重新編譯nginx增加nginx-sticky-module模組(第三方)
3.1.下載並解壓
下載地址:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/downloads/
解壓檔案到/data/server/這個目錄並重命名資料夾為nginx-sticky-module
備份/data/server/nginx/conf目錄下的配置檔案
3.2.查詢當前的nginx編譯引數可以使用以下命令:
使用./nginx -V命令檢視編譯時引數

[[email protected] ~]# /data/server/nginx/sbin/nginx -V
nginx version: nginx/1.14.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-4) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/data/server/nginx --with-http_ssl_module --add-module=/data/server/nginx-sticky-module

3.3.編譯與安裝

cd /data/server/nginx-1.14.0/
./configure --prefix=/data/server/nginx --with-http_ssl_module --add-module=/data/server/nginx-sticky-module
make
make install

3.4.配置檔案
將之前備份的nginx配置檔案覆蓋/data/server/nginx/conf下的預設配置檔案,並編輯:

upstream www.abc.com {
   sticky;
   server 10.0.0.11:8080;
   server 10.0.0.12:8080;
}

3.5.測試驗證
開啟網站進行測試,使用sticky的情況下,不管怎麼重新整理同一個會話會負載到同一個後端伺服器。
每臺後端真實伺服器都會有一個唯一的route值,所以不管你真實伺服器前端有幾個裝了sticky的nginx代理,它都是不會變化的。
3.6.sticky模組的使用
# 引數,解析
sticky [name=route] [domain=.foo.com] [path=/] [expires=1h]
       [hash=index|md5|sha1] [no_fallback] [secure] [httponly];
[name=route] 設定用來記錄會話的cookie名稱
[domain=.foo.com] 設定cookie作用的域名
[path=/]   設定cookie作用的URL路徑,預設根目錄
[expires=1h] 設定cookie的生存期,預設不設定,瀏覽器關閉即失效,需要是大於1秒的值
[hash=index|md5|sha1]   設定cookie中伺服器的標識是用明文還是使用md5值,預設使用md5
[no_fallback] 設定該項,當sticky的後端機器掛了以後,nginx返回502 (Bad Gateway or Proxy Error) ,而不轉發到其他伺服器,不建議設定
[secure]   設定啟用安全的cookie,需要HTTPS支援
[httponly]   允許cookie不通過JS洩漏
3.7.其他需要注意的
3.7.1.同一客戶端的請求,有可能落在不同的後端伺服器上
如果客戶端啟動時同時發起多個請求。由於這些請求都沒帶cookie,所以伺服器會隨機選擇後端伺服器,返回不同的cookie。當這些請求中的最後一個請求返回時,客戶端的cookie才會穩定下來,值以最後返回的cookie為準。
3.7.2.cookie不一定生效
由於cookie最初由伺服器端下發,如果客戶端禁用cookie,則cookie不會生效。
3.7.3.客戶端可能不帶cookie
Android客戶端傳送請求時,一般不會帶上所有的cookie,需要明確指定哪些cookie會帶上。如果希望用sticky做負載均衡,請對Android開發說加上cookie。
3.7.4.cookie名稱不要和業務使用的cookie重名,Sticky預設的cookie名稱是route,可以改成任何值。
3.7.5.客戶端發的第一個請求是不帶cookie的,伺服器下發的cookie,在客戶端下一次請求時才能生效。
3.7.6.Nginx sticky模組不能與ip_hash同時使用。