Nginx使用sticky模塊完成對(duì)Nginx的負(fù)載均衡(最佳實(shí)踐)
一、引言:為什么需要 sticky 模塊?
在使用 Nginx 作為反向代理進(jìn)行負(fù)載均衡時(shí),一個(gè)經(jīng)典難題是 會(huì)話(huà)保持(Session Persistence)。用戶(hù)的請(qǐng)求可能會(huì)被分發(fā)到不同的后端應(yīng)用服務(wù)器(如 Tomcat, Node.js),而這些服務(wù)器之間通常不共享 Session 數(shù)據(jù),導(dǎo)致用戶(hù)頻繁“掉線”。
Nginx 自帶的 ip_hash 策略雖然能解決部分問(wèn)題,但它存在致命缺陷:
- 受代理/CDN 影響:Nginx 看到的是代理服務(wù)器的 IP,而非真實(shí)用戶(hù) IP,導(dǎo)致大量用戶(hù)被錯(cuò)誤地路由到同一臺(tái)服務(wù)器,造成嚴(yán)重負(fù)載不均。
- 無(wú)法應(yīng)對(duì)動(dòng)態(tài)擴(kuò)縮容。
為了解決這個(gè)問(wèn)題,社區(qū)開(kāi)發(fā)了 nginx-sticky-module 這個(gè)強(qiáng)大的第三方模塊。它通過(guò) 植入 Cookie 的方式,精準(zhǔn)地將同一用戶(hù)的請(qǐng)求始終路由到同一臺(tái)后端服務(wù)器,完美實(shí)現(xiàn)了會(huì)話(huà)保持。
?? 核心價(jià)值:
sticky模塊提供了一種比ip_hash更精準(zhǔn)、更可靠的會(huì)話(huà)保持機(jī)制,是開(kāi)源 Nginx 實(shí)現(xiàn)粘性會(huì)話(huà)的最佳實(shí)踐!
二、準(zhǔn)備工作:環(huán)境與依賴(lài)
由于 sticky 是一個(gè)第三方模塊,我們需要從源碼重新編譯 Nginx 來(lái)集成它。
1. 系統(tǒng)環(huán)境
本文以 CentOS 7 / Rocky Linux 8 為例。
2. 安裝編譯依賴(lài)
sudo yum install -y gcc gcc-c++ make libtool pcre pcre-devel openssl openssl-devel zlib zlib-devel
3. 下載 Nginx 源碼
請(qǐng)務(wù)必下載與你當(dāng)前生產(chǎn)環(huán)境相同版本的 Nginx 源碼,以避免兼容性問(wèn)題。
# 例如,下載 Nginx 1.24.0 cd /usr/local/src wget http://nginx.org/download/nginx-1.24.0.tar.gz tar -zxvf nginx-1.24.0.tar.gz
4. 下載 sticky 模塊源碼
nginx-sticky-module 有多個(gè)分支,推薦使用維護(hù)較好的 nginx-sticky-module-ng。
cd /usr/local/src wget https://bitbucket.org/nginx-goodies/nginx-sticky-module-ng/get/08a395c66e42.zip unzip 08a395c66e42.zip # 解壓后會(huì)得到一個(gè)類(lèi)似 "nginx-goodies-nginx-sticky-module-ng-08a395c66e42" 的目錄 mv nginx-goodies-nginx-sticky-module-ng-08a395c66e42 nginx-sticky-module-ng
三、核心步驟:編譯并集成 sticky 模塊
1. 查看現(xiàn)有 Nginx 的編譯參數(shù)(重要?。?/h3>
為了保證新編譯的 Nginx 功能完全一致,我們需要先獲取當(dāng)前 Nginx 的編譯參數(shù)。
nginx -V
你會(huì)看到類(lèi)似如下的輸出:
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx ... --with-http_ssl_module ...
復(fù)制 configure arguments 后面的所有內(nèi)容。
2. 進(jìn)入 Nginx 源碼目錄并配置
cd nginx-1.24.0 # 在原有參數(shù)的基礎(chǔ)上,加上 --add-module 指向 sticky 模塊的路徑 ./configure \ --prefix=/etc/nginx \ --sbin-path=/usr/sbin/nginx \ ... # 這里是你之前復(fù)制的所有原有參數(shù) --add-module=/usr/local/src/nginx-sticky-module-ng
3. 編譯(但不要安裝!)
執(zhí)行 make 命令進(jìn)行編譯。這一步不會(huì)覆蓋你現(xiàn)有的 Nginx 安裝,只會(huì)生成一個(gè)新的可執(zhí)行文件。
make
編譯成功后,新的 Nginx 可執(zhí)行文件位于 objs/nginx。
4. 備份并替換原 Nginx 二進(jìn)制文件
# 備份原文件 sudo cp /usr/sbin/nginx /usr/sbin/nginx.bak # 替換為新編譯的文件 sudo cp objs/nginx /usr/sbin/nginx
5. 驗(yàn)證模塊是否加載成功
nginx -V 2>&1 | grep -o with-http_sticky_module
如果輸出 with-http_sticky_module,則說(shuō)明模塊已成功集成。
四、配置與實(shí)戰(zhàn):?jiǎn)⒂?sticky 負(fù)載均衡
現(xiàn)在,我們可以在 Nginx 配置文件中使用 sticky 指令了。
1. 基本配置示例
編輯你的 nginx.conf 文件,在 upstream 塊中添加 sticky 指令。
upstream backend {
# 啟用 sticky 模塊
# name: Cookie 名稱(chēng)
# expires: Cookie 過(guò)期時(shí)間
# path: Cookie 作用路徑
sticky cookie srv_id expires=1h domain=.yourdomain.com path=/;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}2. 關(guān)鍵參數(shù)詳解
name: 客戶(hù)端 Cookie 的名稱(chēng)。默認(rèn)為route。expires: Cookie 的過(guò)期時(shí)間??梢允?nbsp;1h(1小時(shí)),30m(30分鐘), 或max(永不過(guò)期)。domain: Cookie 的作用域。設(shè)置為你的主域名(如.yourdomain.com)可以讓子域名也共享此 Cookie。path: Cookie 的作用路徑。通常設(shè)為/。hash=md5|sha1: 用于生成后端服務(wù)器標(biāo)識(shí)的哈希算法。默認(rèn)是md5。
3. 工作原理
- 首次訪問(wèn):客戶(hù)端請(qǐng)求頭中沒(méi)有
srv_idCookie。Nginx 根據(jù)負(fù)載均衡策略(如輪詢(xún))選擇一臺(tái)后端服務(wù)器,并在響應(yīng)頭中植入Set-Cookie: srv_id=xxx; ...。 - 后續(xù)訪問(wèn):客戶(hù)端在請(qǐng)求頭中攜帶
Cookie: srv_id=xxx。Nginx 解析此 Cookie,直接將請(qǐng)求轉(zhuǎn)發(fā)給上次分配的那臺(tái)服務(wù)器。
五、驗(yàn)證與排錯(cuò)
1. 驗(yàn)證會(huì)話(huà)保持
- 使用瀏覽器開(kāi)發(fā)者工具,觀察首次響應(yīng)是否包含
Set-Cookie。 - 刷新頁(yè)面,檢查后續(xù)請(qǐng)求的
Cookie頭是否包含srv_id。 - 在后端應(yīng)用服務(wù)器上打印請(qǐng)求日志,確認(rèn)同一用戶(hù)的請(qǐng)求始終落在同一臺(tái)服務(wù)器上。
2. 常見(jiàn)問(wèn)題與解決
- 問(wèn)題1:編譯報(bào)錯(cuò)。
- 原因:
sticky模塊版本與 Nginx 版本不兼容。 - 解決:嘗試尋找與你 Nginx 版本匹配的
sticky模塊分支,或修改模塊源碼中的兼容性代碼(通常涉及ngx_http_upstream_srv_conf_t結(jié)構(gòu)體)。
- 原因:
- 問(wèn)題2:Cookie 未生效。
- 原因:客戶(hù)端禁用了 Cookie,或者
domain/path配置不正確。 - 解決:檢查瀏覽器設(shè)置,并確保
domain配置與你的訪問(wèn)域名匹配。
- 原因:客戶(hù)端禁用了 Cookie,或者
- 問(wèn)題3:后端服務(wù)器宕機(jī)。
- 注意:
sticky模塊本身不包含健康檢查功能。你需要配合max_fails和fail_timeout參數(shù),或使用外部健康檢查腳本,才能自動(dòng)剔除故障節(jié)點(diǎn)。
- 注意:
六、結(jié)語(yǔ)
到此這篇關(guān)于Nginx使用sticky模塊完成對(duì)Nginx的負(fù)載均衡(最佳實(shí)踐)的文章就介紹到這了,更多相關(guān)Nginx sticky負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx動(dòng)態(tài)IP黑名單的實(shí)現(xiàn)步驟
為了封禁某些爬蟲(chóng)或者惡意用戶(hù)對(duì)服務(wù)器的請(qǐng)求,我們需要建立一個(gè)動(dòng)態(tài)的?IP?黑名單,本文主要介紹了Nginx動(dòng)態(tài)IP黑名單的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2025-02-02
Nginx實(shí)現(xiàn)動(dòng)態(tài)封禁IP的設(shè)計(jì)方案
為了封禁某些爬蟲(chóng)或者惡意用戶(hù)對(duì)服務(wù)器的請(qǐng)求,我們需要建立一個(gè)動(dòng)態(tài)的 IP 黑名單,對(duì)于黑名單中的 IP ,我們將拒絕提供服務(wù),并且可以設(shè)置封禁失效時(shí)間,所以本文給大家介紹了Nginx實(shí)現(xiàn)動(dòng)態(tài)封禁IP的設(shè)計(jì)方案,需要的朋友可以參考下2024-12-12
Nginx代理接口訪問(wèn)返回404的實(shí)現(xiàn)示例
因?yàn)椴煌瑯I(yè)務(wù)系統(tǒng)間有接口調(diào)用,存在跨域問(wèn)題,為了解決同源策略,需要將接口通過(guò)nginx去轉(zhuǎn)發(fā),本文主要介紹了Nginx代理接口訪問(wèn)返回404的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-06-06
Nginx配置二級(jí)域名的方法實(shí)現(xiàn)
本文主要介紹了Nginx配置二級(jí)域名的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
云服務(wù)器用nginx配置域名訪問(wèn)前后端分離項(xiàng)目
本文介紹通過(guò)Nginx反向代理實(shí)現(xiàn)多服務(wù)端口隱藏,統(tǒng)一域名入口訪問(wèn),支持HTTPS自動(dòng)跳轉(zhuǎn),用戶(hù)只需輸入域名即可訪問(wèn)前端、后端及其它服務(wù),具有一定的參考價(jià)值,感興趣的可以了解一下2025-09-09
Nginx反向代理在Web應(yīng)用中的實(shí)戰(zhàn)分享
本文將介紹Nginx反向代理的基本原理和配置,以及如何利用Nginx實(shí)現(xiàn)高可用性和故障轉(zhuǎn)移,最后,我們將探討如何監(jiān)控Nginx反向代理的性能并進(jìn)行日志分析,需要的朋友可以參考下2024-08-08

