nginx?sticky實(shí)現(xiàn)基于cookie負(fù)載均衡示例詳解
前言
sticky 是一個(gè)nginx的第三方模塊 它不在nginx發(fā)行版中 需要額外編譯這個(gè)模塊的, 它的思想就是不依靠后端生成cookie , 而是sticky在nginx這里生成cookie ,然后下發(fā)到客戶端, 客戶端收到cookie后 以后的請(qǐng)求帶著這個(gè)cookie 就會(huì)通過這個(gè)cookie 進(jìn)行hash 被一直定位到后端的某一臺(tái)服務(wù)器了
優(yōu)點(diǎn):
- 它比純
ip hash負(fù)載有個(gè)優(yōu)點(diǎn)就是 純 ip hash 像局域網(wǎng)內(nèi)的訪問ip 訪問會(huì)導(dǎo)致ip傾斜 - 它比 hash
$cookie_jsessionid的優(yōu)點(diǎn)就是 它不依賴后端 不用后端生成 session 從而減少后端的 資源
思考
想想為什么要用這個(gè) sticky 來把用戶盡量一直定位到一臺(tái)服務(wù)器呢? 在多臺(tái)后臺(tái)服務(wù)器的環(huán)境下,我們?yōu)榱舜_保一個(gè)客戶只和一臺(tái)服務(wù)器通信,我們勢(shì)必使用長(zhǎng)連接。使用什么方式來實(shí)現(xiàn)這種連接呢,常見的有使用nginx自帶的ip_hash來做,我想這絕對(duì)不是一個(gè)好的辦法,如果前端是CDN,或者說一個(gè)局域網(wǎng)的客戶同時(shí)訪問服務(wù)器,導(dǎo)致出現(xiàn)服務(wù)器分配不均衡,以及不能保證每次訪問都粘滯在同一臺(tái)服務(wù)器。
如果基于cookie會(huì)是一種什么情形,想想看, 每臺(tái)電腦都會(huì)有不同的cookie,在保持長(zhǎng)連接的同時(shí)還保證了服務(wù)器的壓力均衡,nginx sticky值得推薦。
如果瀏覽器不支持cookie,那么sticky不生效,畢竟整個(gè)模塊是給予cookie實(shí)現(xiàn)的.
1.cookie_jsessionid 負(fù)載均衡
在說sticky 之前先來看看 nginx 通過 cookie_jessionid 的負(fù)載均衡方式
1.1 后端準(zhǔn)備
@Autowired
lateinit var env: Environment
@GetMapping("/server")
fun server(request:HttpServletRequest):String {
//獲取當(dāng)前服務(wù)的端口
val port = env.getProperty("local.server.port")
println("now port: $port")
//調(diào)用了request.getSession(true) 則會(huì)沒有session的時(shí)候創(chuàng)建session
val session = request.getSession(true)
val name = session.getAttribute("name")
println("name: $name")
if (name == null){
session.setAttribute("name","johnny")
}
return "success"
}
1.2 hash $cookie_jsessionid;配置
在upstream 里面配置 hash 的方式 使用 cookie_jsessionid 去做hash
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
upstream backend {
# 指定hash 方式是 cookie_jessionid nginx自帶的方式
hash $cookie_jsessionid;
server 172.16.225.1:8081;
server 172.16.225.1:8080;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
# 指定負(fù)載到后端upstream
proxy_pass http://backend;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
可以看到 服務(wù)器下發(fā)了 cookie JSESSIONID 并且多次請(qǐng)求這個(gè) 都不會(huì)改變 因?yàn)閚ginx 根據(jù) JSESSIONID 它進(jìn)行hash 每次都負(fù)載到同一臺(tái)后端服務(wù)器, 因?yàn)檫@個(gè)后端服務(wù)器已經(jīng)存在了 這個(gè)session 所以不會(huì)再次創(chuàng)建

可以看到 多次請(qǐng)求 都打到這個(gè) 8081 的后端服務(wù)了

2.nginx sticky 負(fù)載均衡
2.1 下載 sticky
Bitbucket

2.2 重新編譯升級(jí)nginx
1)下載完成,放入服務(wù)器解壓,記住解壓的位置,后面要用
2)進(jìn)入到nginx的安裝文件
3)配置nginx
tar -xvf nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d.tar.gz mv nginx-goodies-nginx-sticky-module-ng-c78b7dd79d0d nginx-sticky # 添加sticky 模塊 ./configure \ --prefix=/usr/local/nginx \ --add-module=/opt/nginx-sticky
make 編譯的時(shí)候有可能會(huì)報(bào)錯(cuò)
找到sticky剛剛的解壓目錄,進(jìn)入修改文件 vim ngx_http_sticky_misc.c ,加入下面的頭文件
#include <openssl/sha.h> #include <openssl/md5.h>

再次make , 當(dāng)然后面如果還報(bào)錯(cuò)的話,openssl檢查是否安裝
apt-get install -y openssl
2.3 upstream 配置 sticky
配置好后重啟nginx
upstream backend {
#hash $cookie_jsessionid;
sticky; #指定使用 sticky 進(jìn)行負(fù)載均衡
server 172.16.225.1:8081;
server 172.16.225.1:8080;
}

2.4 修改后端不再創(chuàng)建session
此時(shí)后端不會(huì)創(chuàng)建session 也不會(huì)下發(fā)cookie jsessionid 了
@Autowired
lateinit var env: Environment
@GetMapping("/server")
fun server(request:HttpServletRequest):String {
val port = env.getProperty("local.server.port")
println("now port: $port")
return "success"
}
2.5 再次 多次請(qǐng)求
可以看到stick 幫我們下發(fā)了 route 這個(gè)cookie , 并且這個(gè)不會(huì)變 默認(rèn)關(guān)閉瀏覽器就會(huì)失效

可以看到請(qǐng)求還是只會(huì)落在一臺(tái)服務(wù)器上

3.sticky 其他用法
sticky [name=route] [domain=.foo.bar] [path=/] [expires=1h] [hash=index|md5|sha1] [no_fallback];
name: 可以為任何的string字符,默認(rèn)是route
domain:哪些域名下可以使用這個(gè)cookie
path:哪些路徑對(duì)啟用sticky,例如path/test,那么只有test這個(gè)目錄才會(huì)使用sticky做負(fù)載均衡
expires:cookie過期時(shí)間,默認(rèn)瀏覽器關(guān)閉就過期,也就是會(huì)話方式。
no_fallbackup:如果設(shè)置了這個(gè),cookie對(duì)應(yīng)的服務(wù)器宕機(jī)了,那么將會(huì)返回502(bad gateway 或者 proxy error),建議不啟用
總結(jié)
本篇主要介紹了 nginx sticky 負(fù)載均衡,它不需要后端去生成session 下發(fā)jsessionid 而是nginx的sticky模塊幫我們?nèi)ハ掳l(fā)一個(gè) route 的 cookie , nginx 使用這個(gè)cookie 進(jìn)行hash 負(fù)載, 從而實(shí)現(xiàn)了 客戶每次訪問都粘滯在同一臺(tái)服務(wù)器
以上就是nginx sticky實(shí)現(xiàn)基于cookie負(fù)載均衡示例詳解的詳細(xì)內(nèi)容,更多關(guān)于nginx sticky cookie負(fù)載均衡的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 利用nginx解決cookie跨域訪問的方法
- 關(guān)于nginx日志增加cookie信息
- Nginx設(shè)置HttpOnly Secure SameSite參數(shù)解決Cookie信息丟失
- nginx cookie有效期討論小結(jié)
- Nginx轉(zhuǎn)發(fā)丟失cookie表現(xiàn)形式及解決方案
- nginx使用sticky基于cookie的會(huì)話保持方式
- nginx配置客戶端保存cookie的實(shí)現(xiàn)
- NGINX基于cookie針對(duì)同一域名進(jìn)行分流轉(zhuǎn)發(fā)
- Nginx 處理超長(zhǎng) Cookie 導(dǎo)致的 400 錯(cuò)誤
相關(guān)文章
升級(jí)nginx支持HTTP/2服務(wù)端推送的方法
這篇文章主要介紹了升級(jí)nginx支持HTTP/2服務(wù)端推送的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
nginx配置多個(gè)虛擬主機(jī)vhost的方法示例
這篇文章主要介紹了nginx配置多個(gè)虛擬主機(jī)vhost的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-10-10
Nginx實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容緩存的示例代碼
在Nginx中實(shí)現(xiàn)動(dòng)態(tài)內(nèi)容的緩存可以顯著提高性能,減少后端服務(wù)器的負(fù)載,本文就來介紹一下Nginx動(dòng)態(tài)內(nèi)容緩存實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-11-11
NGINX 配置內(nèi)網(wǎng)訪問的實(shí)現(xiàn)步驟
本文主要介紹了NGINX 配置內(nèi)網(wǎng)訪問的實(shí)現(xiàn)步驟,Nginx的geo模塊限制域名訪問權(quán)限,僅允許內(nèi)網(wǎng)/辦公室IP訪問,具有一定的參考價(jià)值,感興趣的可以了解一下2025-05-05
linux安裝nginx和前端部署vue項(xiàng)目全過程(實(shí)測(cè)react項(xiàng)目也可)
這篇文章主要介紹了如何將前端項(xiàng)目打包并部署到服務(wù)器上,包括使用nginx進(jìn)行配置和啟動(dòng)等步驟,文中通過代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
詳解Nginx 動(dòng)態(tài) DNS 反向代理的幾種寫法
這篇文章主要介紹了詳解Nginx 動(dòng)態(tài) DNS 反向代理的幾種寫法,詳細(xì)的介紹了Nginx 動(dòng)態(tài) DNS 反向代理的4種方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-05-05
Linux系統(tǒng)下nginx日志每天定時(shí)切割的腳本寫法
本篇文章給大家分享使用Linux系統(tǒng)自帶的命令logrotate對(duì)Nginx日志進(jìn)行切割的方法,對(duì)nginx日志切割腳本感興趣的朋友一起學(xué)習(xí)吧2016-11-11
nginx安裝時(shí),make編譯可能會(huì)出現(xiàn)的錯(cuò)誤問題
這篇文章主要介紹了nginx安裝時(shí),make編譯可能會(huì)出現(xiàn)的錯(cuò)誤問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06

