Nginx 基於nginx-sticky-module模組進行會話保持
sticky介紹
sticky模組與Ip_hash都是與負載均衡演算法相關,但又有差別,差別是
- ip hash,根據客戶端的IP,將請求分配到不同的伺服器上
- sticky,根據伺服器給客戶端的cookie,客戶端再次請求時會帶上此cookie,nginx會把有此cookie的請求轉發到頒發cookie的伺服器上
sticky原理
Sticky是基於cookie的一種負載均衡解決方案,通過分發和識別cookie,使來自同一個客戶端的請求落在同一臺伺服器上,預設cookie標識名為route :
- 客戶端首次發起訪問請求,nginx接收後,發現請求頭沒有cookie,則以輪詢方式將請求分發給後端伺服器。
- 後端伺服器處理完請求,將響應資料返回給nginx。
- 此時nginx生成帶route的cookie,返回給客戶端。route的值與後端伺服器對應,可能是明文,也可能是md5、sha1等Hash值。
- 客戶端接收請求,並儲存帶route的cookie。
- 當客戶端下一次傳送請求時,會帶上route,nginx根據接收到的cookie中的route值,轉發給對應的後端伺服器。
sticky官網
官方地址:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/src
下載地址:https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz
注意點
- 同一客戶端,如果啟動時同時發起多個請求,有可能落在不同的後端伺服器上。
- 由於cookie最初由伺服器端下發,如果客戶端禁用cookie,則cookie不會生效。
- 客戶端可能不帶cookie,Android客戶端傳送請求時,一般不會帶上所有的cookie,需要明確指定哪些cookie會帶上。如果希望用sticky做負載均衡,請對Android開發說加上cookie。
- cookie名稱不要和業務使用的cookie重名。Sticky預設的cookie名稱是route,可以改成任何值
- 客戶端發的第一個請求是不帶cookie的。伺服器下發的cookie,在客戶端下一次請求時才能生效。
- Nginx sticky模組不能與ip_hash同時使用
Nginx安裝Sticky模組
如果你還沒有部署Nginx,那麼就在部署Nginx的時候進行 --add-module 新增上此模組就行了,我這裡是Nginx已經安裝過了,需要再把此模組載入進NGINX
1.下載sticky
wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/master.tar.gz
tar xf master.tar.gz
#把此模組放進nginx/module目錄下,名稱太長,重新命名一下
mkdir /usr/local/nginx/module
mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 /usr/local/nginx/module/nginx-sticky-module
2.重新編譯NGINX
下載一個NGINX後重新解壓,然後看之前NGINX編譯了那些模組,這裡都給加上,在最後加上 --add-module載入sticky模組
tar xf nginx-1.16.1.tar.gz
cd nginx-1.16.1
./configure --prefix=/usr/local/nginx \
--sbin-path=/usr/local/nginx/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--pid-path=/usr/local/nginx/run/nginx.pid \
--error-log-path=/usr/local/nginx/logs/error.log \
--http-log-path=/usr/local/nginx/logs/access.log \
--with-pcre \
--user=nginx \
--group=nginx \
--with-stream \
--with-threads \
--with-file-aio \
--with-http_v2_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_gzip_static_module \
--with-http_stub_status_module \
--add-module=/usr/local/nginx/module/nginx-sticky-module #在此載入sticky模組
#./configure完後進行編譯,然後更換 nginx 程式
make
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old
cp -rf objs/nginx /usr/local/nginx/sbin/
#最後再 make upgrade 進行更新檢測
[root@nginx_proxy02 nginx-1.16.1]# make upgrade
/usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
kill -USR2 `cat /usr/local/nginx/run/nginx.pid`
sleep 1
test -f /usr/local/nginx/run/nginx.pid.oldbin
kill -QUIT `cat /usr/local/nginx/run/nginx.pid.oldbin`
以上就完成了Nginx載入第三方模組,使用 nginx -V 來檢視是否載入成功
3.修改NGINX配置檔案
修改NGINX配置檔案來啟用sticky
upstream backend {
sticky name=ngx_cookie expires=6h;
server 192.168.31.240:8080 weight=3 max_fails=3 fail_timeout=10s;
server 192.168.31.241:8080 weight=3 max_fails=3 fail_timeout=10s;
server 192.168.31.242:8080 weight=6 max_fails=3 fail_timeout=10s;
server 192.168.31.243:8080;
server 192.168.31.244:8080 down;
}
mkdir /usr/local/nginx/ngx_cookie
4.sticky語法解析
指令 | 描述 |
---|---|
name | 設定記錄cookie的名稱(可自定義),預設為route |
domain | 設定cookie要使用的域名 |
path | 設定cookie作用的URL路徑,預設根目錄 |
expires | 設定cookie的生存期 |
hash | 值為 index、md5、sha1,對應明文、md5、和sha1,預設md5,測試sha1後端伺服器會變 |
no_fallback | 當sticky的後端機器掛了以後,nginx返回502,而不轉發到其他伺服器,不建議設定 |
secure | 設定啟用安全的cookie,需要HTTPS支援 |
httponly | 允許cookie不通過JS洩漏 |
5.重啟NGINX
/usr/local/nginx/sbin/nginx -s reload
測試訪問NGINX
第一次訪問的時候是沒有Cookie的,訪問完成後NGINX才會把Cookie包含在返回的資料中,在下次請求資料的時候就會出現Cookie。
所以重新整理一下後才能看到Cookie。
※更多文章和資料|點選後方文字直達 ↓↓↓
100GPython自學資料包
阿里雲K8s實戰手冊
[阿里雲CDN排坑指南]CDN
ECS運維指南
DevOps實踐手冊
Hadoop大資料實戰手冊
Knative雲原生應用開發指南
OSS 運維實戰手冊
雲原生架構白皮書
Zabbix企業級分散式監控系統原始碼文件
雲原生基礎入門手冊
10G大廠面試題戳領