nginx?sticky實現(xiàn)基于cookie負(fù)載均衡示例詳解
前言
sticky 是一個nginx的第三方模塊 它不在nginx發(fā)行版中 需要額外編譯這個模塊的, 它的思想就是不依靠后端生成cookie , 而是sticky在nginx這里生成cookie ,然后下發(fā)到客戶端, 客戶端收到cookie后 以后的請求帶著這個cookie 就會通過這個cookie 進行hash 被一直定位到后端的某一臺服務(wù)器了
優(yōu)點:
- 它比純
ip hash負(fù)載有個優(yōu)點就是 純 ip hash 像局域網(wǎng)內(nèi)的訪問ip 訪問會導(dǎo)致ip傾斜 - 它比 hash
$cookie_jsessionid的優(yōu)點就是 它不依賴后端 不用后端生成 session 從而減少后端的 資源
思考
想想為什么要用這個 sticky 來把用戶盡量一直定位到一臺服務(wù)器呢? 在多臺后臺服務(wù)器的環(huán)境下,我們?yōu)榱舜_保一個客戶只和一臺服務(wù)器通信,我們勢必使用長連接。使用什么方式來實現(xiàn)這種連接呢,常見的有使用nginx自帶的ip_hash來做,我想這絕對不是一個好的辦法,如果前端是CDN,或者說一個局域網(wǎng)的客戶同時訪問服務(wù)器,導(dǎo)致出現(xiàn)服務(wù)器分配不均衡,以及不能保證每次訪問都粘滯在同一臺服務(wù)器。
如果基于cookie會是一種什么情形,想想看, 每臺電腦都會有不同的cookie,在保持長連接的同時還保證了服務(wù)器的壓力均衡,nginx sticky值得推薦。
如果瀏覽器不支持cookie,那么sticky不生效,畢竟整個模塊是給予cookie實現(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) 則會沒有session的時候創(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 并且多次請求這個 都不會改變 因為nginx 根據(jù) JSESSIONID 它進行hash 每次都負(fù)載到同一臺后端服務(wù)器, 因為這個后端服務(wù)器已經(jīng)存在了 這個session 所以不會再次創(chuàng)建

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

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

2.2 重新編譯升級nginx
1)下載完成,放入服務(wù)器解壓,記住解壓的位置,后面要用
2)進入到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 編譯的時候有可能會報錯
找到sticky剛剛的解壓目錄,進入修改文件 vim ngx_http_sticky_misc.c ,加入下面的頭文件
#include <openssl/sha.h> #include <openssl/md5.h>

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

2.4 修改后端不再創(chuàng)建session
此時后端不會創(chuàng)建session 也不會下發(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 再次 多次請求
可以看到stick 幫我們下發(fā)了 route 這個cookie , 并且這個不會變 默認(rèn)關(guān)閉瀏覽器就會失效

可以看到請求還是只會落在一臺服務(wù)器上

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

