Nginx負(fù)載均衡通用方案詳解
Nginx 負(fù)載均衡通用方案:一次配置覆蓋視頻會(huì)議、商城等場(chǎng)景
很多人會(huì)問(wèn):“為什么不能用一套策略搞定所有場(chǎng)景?難道要每天改配置?” 其實(shí)不是 “不想通用”,而是不同業(yè)務(wù)的核心需求存在本質(zhì)差異 —— 就像給運(yùn)動(dòng)員選裝備,跑步要輕量跑鞋,游泳要防水泳衣,“通用裝備” 只會(huì)讓所有場(chǎng)景都達(dá)不到最優(yōu)。
但好在場(chǎng)景(視頻會(huì)議、商城)有共通的 “穩(wěn)定需求”,我們可以通過(guò) “核心組件組合” 形成 “趨近通用” 的最優(yōu)方案:無(wú)需頻繁更新策略,新增節(jié)點(diǎn)僅需加一行配置,既能滿足視頻會(huì)議的低延遲、也能適配商城的會(huì)話保持均衡。
一、先搞懂:為什么沒有 “絕對(duì)通用” 的策略?
兩個(gè)場(chǎng)景需求存在 “天然矛盾”,單一策略無(wú)法兼顧,舉兩個(gè)關(guān)鍵例子:
| 需求矛盾點(diǎn) | 視頻會(huì)議的要求 | 商城的要求 | 單一策略的缺陷 |
|---|---|---|---|
| 連接超時(shí)時(shí)間 | 300s+(避免視頻斷流) | 60s(避免支付等待過(guò)久) | 設(shè) 300s 會(huì)導(dǎo)致商城支付超時(shí),設(shè) 60s 會(huì)斷視頻流 |
| 會(huì)話保持方式 | 同一用戶連同一節(jié)點(diǎn)即可 | 登錄后絕對(duì)不能換節(jié)點(diǎn) | 用 ip_hash會(huì)讓 NAT 環(huán)境的視頻用戶擠一塊,用 Cookie 粘滯多余,暫不談 |
通用方案的邏輯:不追求 “單一策略通吃”,而是用 “模塊化配置”—— 把 “流量分配、會(huì)話保持、容錯(cuò)、緩存” 拆成獨(dú)立組件,按場(chǎng)景需求 “按需啟用”,核心策略(如最少連接 + 權(quán)重)固定不變,僅對(duì)差異化需求(如超時(shí)時(shí)間)做局部適配。
二、趨近通用的最優(yōu)方案:核心組件組合
這套方案的核心是 “4個(gè)固定組件 + 2個(gè)場(chǎng)景適配點(diǎn)”,配置一次后,后續(xù)僅需新增 / 調(diào)整后端節(jié)點(diǎn),無(wú)需改策略邏輯:
| 核心組件 | 作用(覆蓋所有場(chǎng)景) | 為什么選它? |
|---|---|---|
| 最少連接(least_conn)+ 權(quán)重(weight) | 動(dòng)態(tài)分配流量:連接少、性能強(qiáng)的節(jié)點(diǎn)多承接請(qǐng)求 | 視頻會(huì)議怕單節(jié)點(diǎn)過(guò)載,怕 CPU 堆積,商城怕流量不均,這組組合能全解決 |
| 后端會(huì)話共享(Redis) | 商城登錄不丟會(huì)話,視頻會(huì)話穩(wěn)定 | 不用糾結(jié) ip_hash/Cookie 粘滯,所有場(chǎng)景共用一套會(huì)話邏輯,后端改一次就行 |
| 健康檢查(max_fails/fail_timeout) | 自動(dòng)剔除故障節(jié)點(diǎn),避免服務(wù)中斷 | 不管哪個(gè)場(chǎng)景,節(jié)點(diǎn)宕機(jī)都能自動(dòng)切流量,不用人工干預(yù) |
| 靜態(tài)緩存(proxy_cache) | 緩存圖標(biāo)、JS、報(bào)告模板等靜態(tài)資源 | 減輕所有場(chǎng)景的后端壓力,商城靜態(tài)資源加載更快 |
| 場(chǎng)景適配點(diǎn) | 適配邏輯(僅需配置一次,后續(xù)不變) |
|---|---|
| 超時(shí)時(shí)間 | 用 location 區(qū)分:視頻會(huì)議 300s,商城 60s |
| 靜態(tài)資源路徑 | 統(tǒng)一緩存后綴(.jpg/.js 等) |
| 支付接口保護(hù) | 支付接口關(guān)閉重試(避免重復(fù)支付) |
三、完整通用配置(拿來(lái)即用,含后端適配)
3.1. 前置準(zhǔn)備(僅需做一次)
先確保服務(wù)器安裝以下環(huán)境(后續(xù)不用改):
- Nginx 1.20+(需內(nèi)置
ngx_http_upstream_module/ngx_http_proxy_module,默認(rèn)已裝) - Redis 6.0+(用于會(huì)話共享,建議主從架構(gòu),保障高可用)
- 后端框架:Java(Spring Boot)/PHP/Python(需支持 Redis 會(huì)話,示例用 Spring Boot)
3.2. Nginx 完整配置(覆蓋兩大場(chǎng)景)
# --------------------------
# 1. 定義后端集群(所有場(chǎng)景共用一個(gè)upstream,新增節(jié)點(diǎn)僅需加server行)
# --------------------------
upstream universal_servers {
# 后端節(jié)點(diǎn)配置:weight=性能權(quán)重(8核16G設(shè)3,4核8G設(shè)2,2核4G設(shè)1)
# max_fails=2:2次請(qǐng)求失敗標(biāo)記故障;fail_timeout=30s:故障后隔離30秒
server 192.168.1.101:8080 weight=3 max_fails=2 fail_timeout=30s; # 高性能節(jié)點(diǎn)(視頻優(yōu)先用)
server 192.168.1.102:8080 weight=2 max_fails=2 fail_timeout=30s; # 中性能節(jié)點(diǎn)(商城用)
server 192.168.1.103:8080 weight=2 max_fails=2 fail_timeout=30s; # 中性能節(jié)點(diǎn)(通用)
# 固定核心策略:最少連接(動(dòng)態(tài)分配,避免單節(jié)點(diǎn)過(guò)載)+權(quán)重(按性能分配)
least_conn;
# 健康檢查:所有場(chǎng)景共用,無(wú)需修改
}
# --------------------------
# 2. 靜態(tài)緩存配置(所有場(chǎng)景共用,減輕后端壓力)
# --------------------------
# 緩存目錄:/var/nginx/cache,10G上限,7天未訪問(wèn)自動(dòng)清理
proxy_cache_path /var/nginx/cache levels=1:2 keys_zone=universal_cache:100m;
inactive=7d max_size=10g;
# --------------------------
# 3. 前端訪問(wèn)配置(按域名區(qū)分場(chǎng)景,適配差異化需求)
# --------------------------
# 場(chǎng)景1:視頻會(huì)議(meet.yourdomain.com)
server {
listen 80;
listen 443 ssl;
server_name meet.yourdomain.com;
# HTTPS證書(所有場(chǎng)景共用,替換成你的證書路徑)
ssl_certificate /etc/nginx/ssl/your_cert.crt;
ssl_certificate_key /etc/nginx/ssl/your_cert.key;
ssl_protocols TLSv1.2 TLSv1.3; # 安全協(xié)議固定
# 視頻會(huì)議專屬適配:長(zhǎng)連接超時(shí)(300s避免斷流)
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
# 視頻流緩沖區(qū)(適配大流量)
proxy_buffer_size 32k;
proxy_buffers 4 64k;
# 傳遞真實(shí)IP和會(huì)話信息(所有場(chǎng)景共用)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme; # 傳遞HTTPS標(biāo)識(shí)
# 視頻會(huì)議請(qǐng)求轉(zhuǎn)發(fā)(無(wú)靜態(tài)緩存,全走動(dòng)態(tài))
location / {
proxy_pass http://universal_servers;
# 故障重試:視頻流斷連后自動(dòng)切節(jié)點(diǎn)(最多2次)
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_next_upstream_tries 2;
}
}
# 場(chǎng)景2:商城(mall.yourdomain.com)
server {
listen 80;
listen 443 ssl;
server_name mall.yourdomain.com;
# 復(fù)用HTTPS證書(不用重復(fù)配置)
ssl_certificate /etc/nginx/ssl/your_cert.crt;
ssl_certificate_key /etc/nginx/ssl/your_cert.key;
ssl_protocols TLSv1.2 TLSv1.3;
# 商城專屬適配:普通超時(shí)(60s避免支付等待)
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
# 傳遞真實(shí)IP和會(huì)話信息(復(fù)用)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
# 商城靜態(tài)資源緩存(圖標(biāo)、JS、CSS,減輕后端壓力)
location ~* \.(jpg|jpeg|png|gif|js|css|ico)$ {
proxy_cache universal_cache; # 復(fù)用全局緩存
proxy_cache_valid 200 304 7d; # 正常響應(yīng)緩存7天
proxy_cache_valid any 1m; # 異常響應(yīng)緩存1分鐘
proxy_cache_key $host$uri$is_args$args; # 避免重復(fù)緩存
proxy_pass http://universal_servers;
expires 7d; # 瀏覽器本地也緩存
}
# 商城支付接口專屬配置:關(guān)閉重試(避免重復(fù)支付)
location ~ /api/pay/ {
proxy_pass http://universal_servers;
proxy_next_upstream off; # 禁止重試,防止多扣費(fèi)
}
# 商城其他請(qǐng)求轉(zhuǎn)發(fā)
location / {
proxy_pass http://universal_servers;
}
}3.3. 后端適配(僅需做一次,所有場(chǎng)景共用)
核心是Redis 會(huì)話共享(解決商城會(huì)話不丟,同時(shí)讓視頻會(huì)話穩(wěn)定),以 Spring Boot 為例(其他框架邏輯類似):
步驟 1:引入依賴(pom.xml)
<!-- Redis會(huì)話共享核心依賴 --> <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <!-- Redis客戶端 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </dependency> <!-- Web依賴(確保已引入) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
步驟 2:配置 Redis(application.yml)
spring: # Redis會(huì)話配置(所有場(chǎng)景共用) session: store-type: redis # 會(huì)話存到Redis redis: namespace: universal:session # 會(huì)話key前綴(避免和其他業(yè)務(wù)沖突) host: 192.168.1.301 # 你的Redis地址 port: 6379 password: your_redis_password # 你的Redis密碼(無(wú)密碼可刪) timeout: 2000ms # Redis連接超時(shí) # Redis基礎(chǔ)配置 redis: host: 192.168.1.301 port: 6379 password: your_redis_password jedis: pool: max-active: 100 # 最大連接數(shù)(適配高并發(fā)) max-idle: 20 # 最大空閑連接
步驟 3:?jiǎn)?dòng)類加注解(開啟會(huì)話共享)
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@SpringBootApplication
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400) // 會(huì)話有效期1天(所有場(chǎng)景通用)
public class UniversalApplication {
public static void main(String[] args) {
SpringApplication.run(UniversalApplication.class, args);
}
}四、分場(chǎng)景驗(yàn)證:方案是否真的通用?
不用你手動(dòng)判斷,按以下步驟驗(yàn)證,確保每個(gè)場(chǎng)景都能正常運(yùn)行:
4.1. 視頻會(huì)議場(chǎng)景(驗(yàn)證 “不卡頓 + 負(fù)載均衡”)
- 操作:用 10 臺(tái)設(shè)備(同一 NAT 網(wǎng)絡(luò),如公司 WiFi)訪問(wèn)
meet.yourdomain.com,加入不同會(huì)議; - 驗(yàn)證 1(負(fù)載均衡):在后端節(jié)點(diǎn)執(zhí)行
netstat -an | grep 8080 | grep ESTABLISHED | wc -l,101 節(jié)點(diǎn)(weight=3)連接數(shù)≈102+103 節(jié)點(diǎn)之和(符合權(quán)重比例); - 驗(yàn)證 2(不卡頓):持續(xù)視頻30 分鐘,無(wú)斷流;手動(dòng)停掉 101 節(jié)點(diǎn),設(shè)備自動(dòng)切換到 102/103,視頻不中斷。
4.2. 商城場(chǎng)景(驗(yàn)證 “會(huì)話不丟 + 支付安全”)
- 操作:用瀏覽器訪問(wèn)
mall.yourdomain.com,登錄后加購(gòu)物車、下單; - 驗(yàn)證 1(會(huì)話不丟):手動(dòng)停掉當(dāng)前連接的節(jié)點(diǎn)(如 102),刷新頁(yè)面,購(gòu)物車、登錄狀態(tài)仍在(Redis 讀取會(huì)話);
- 驗(yàn)證 2(支付安全):發(fā)起支付請(qǐng)求,故意停掉后端節(jié)點(diǎn),Nginx 不重試(
proxy_next_upstream off),無(wú)重復(fù)支付。
五、落地與維護(hù):不用頻繁更新策略
這套方案的核心優(yōu)勢(shì)是 “維護(hù)簡(jiǎn)單”,你后續(xù)僅需做 3 件事,不用改策略邏輯:
5.1. 新增后端節(jié)點(diǎn)(僅需 1 行配置)
當(dāng)用戶變多,要加新節(jié)點(diǎn)時(shí),只需在upstream universal_servers里加一行:
server 192.168.1.104:8080 weight=2 max_fails=2 fail_timeout=30s; # 新節(jié)點(diǎn)
然后執(zhí)行nginx -t(驗(yàn)證語(yǔ)法)→nginx -s reload(生效配置),流量會(huì)自動(dòng)按 “最少連接 + 權(quán)重” 分配,不用改其他配置。
5.2. 調(diào)整節(jié)點(diǎn)權(quán)重(僅改數(shù)字)
若某節(jié)點(diǎn)性能升級(jí)(如 102 節(jié)點(diǎn)從 4 核升到 8 核),只需把weight=2改成weight=3,重啟 Nginx 即可,策略邏輯不變。
5.3. 監(jiān)控(確保穩(wěn)定,不用手動(dòng)盯)
裝一套Prometheus+Grafana(有現(xiàn)成腳本一鍵部署),監(jiān)控 3 個(gè)指標(biāo):
- Nginx 連接數(shù):訪問(wèn)
/nginx_status(需在 Nginx 配置里啟用stub_status模塊); - 后端節(jié)點(diǎn) CPU / 內(nèi)存:監(jiān)控
192.168.1.101等節(jié)點(diǎn)的資源; - Redis 會(huì)話數(shù):執(zhí)行
redis-cli keys "universal:session:*" | wc -l,避免會(huì)話堆積。
六、總結(jié):為什么這是最優(yōu)方案?
| 對(duì)比維度 | 這套通用方案 | 市面零散方案 |
|---|---|---|
| 策略挑選 | 不用選,一次配置覆蓋多個(gè)場(chǎng)景 | 需按場(chǎng)景選 ip_hash/least_conn/sticky,易出錯(cuò) |
| 維護(hù)成本 | 新增節(jié)點(diǎn)僅加 1 行,不用改策略 | 加節(jié)點(diǎn)要重新評(píng)估策略,可能改多處配置 |
| 場(chǎng)景適配 | 內(nèi)置視頻 / 商城的差異化適配 | 需手動(dòng)改超時(shí)、緩存等參數(shù),易遺漏 |
| 穩(wěn)定性 | Redis 會(huì)話 + 健康檢查,容錯(cuò)性強(qiáng) | 單策略容錯(cuò)弱(如 ip_hash 在 NAT 下過(guò)載) |
簡(jiǎn)單說(shuō):你把這份配置復(fù)制到服務(wù)器,按步驟適配后端,后續(xù)只需加節(jié)點(diǎn)、調(diào)權(quán)重,不用再糾結(jié) “選什么策略”—— 這套方案已經(jīng)幫你把最優(yōu)邏輯固定好了。
附:必備工具與腳本(直接用)
- Nginx 狀態(tài)模塊啟用(監(jiān)控連接數(shù)):
location /nginx_status {
stub_status on;
allow 192.168.1.0/24; # 僅允許內(nèi)網(wǎng)訪問(wèn)
deny all;
}- Redis 會(huì)話清理腳本(避免過(guò)期會(huì)話堆積,加進(jìn)定時(shí)任務(wù)):
#!/bin/bash redis-cli -h 192.168.1.301 -a your_redis_password KEYS "universal:session:*" | xargs redis-cli DEL
- Nginx 配置備份腳本(改配置前執(zhí)行):
#!/bin/bash cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf_$(date +%Y%m%d)
到此這篇關(guān)于Nginx 負(fù)載均衡通用方案的文章就介紹到這了,更多相關(guān)nginx 負(fù)載均衡內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Nginx HTTP反向代理負(fù)載均衡實(shí)驗(yàn)教程
- Nginx搭建負(fù)載均衡及常見問(wèn)題處理
- Nginx幾種負(fù)載均衡模式的實(shí)現(xiàn)示例
- Nginx負(fù)載均衡與健康檢查使用詳解
- 詳解Nginx中常見負(fù)載均衡策略配置與使用場(chǎng)景
- Nginx 負(fù)載均衡和緩存配置最佳實(shí)踐
- Nginx+Tomcat負(fù)載均衡群集全過(guò)程
- Nginx部署負(fù)載均衡服務(wù)的步驟全解析
- nginx負(fù)載均衡配置方式
- Nginx 4層轉(zhuǎn)發(fā)TCP流量實(shí)現(xiàn)負(fù)載代理
相關(guān)文章
使用nginx同域名下部署多個(gè)vue項(xiàng)目并使用反向代理的方法
這篇文章主要介紹了使用nginx同域名下部署多個(gè)vue項(xiàng)目并使用反向代理的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
Nginx中配置使用非默認(rèn)80端口進(jìn)行服務(wù)的完整指南
在實(shí)際生產(chǎn)環(huán)境中,我們經(jīng)常需要將Nginx配置在其他端口上運(yùn)行,本文將詳細(xì)介紹如何在Nginx中配置使用非默認(rèn)端口進(jìn)行服務(wù),希望對(duì)大家有所幫助2025-08-08
Nginx+Tomcat集群環(huán)境的實(shí)現(xiàn)
本文主要介紹了配置Nginx和Tomcat集群環(huán)境,包括負(fù)載均衡、故障轉(zhuǎn)移以及配置單機(jī)應(yīng)用和Tomcat集群的具體步驟, 感興趣的可以了解一下2024-11-11
Nginx路由匹配規(guī)則及優(yōu)先級(jí)詳解
Nginx作為一個(gè)高性能的Web服務(wù)器和反向代理服務(wù)器,廣泛用于負(fù)載均衡、請(qǐng)求轉(zhuǎn)發(fā)等場(chǎng)景,在配置Nginx時(shí),路由匹配規(guī)則是非常重要的概念,本文將詳細(xì)介紹Nginx的路由匹配規(guī)則及其優(yōu)先級(jí),需要的朋友可以參考下2025-05-05
使用Nginx限制IP請(qǐng)求和并發(fā)連接數(shù)的實(shí)現(xiàn)方法
本文主要介紹了使用Nginx限制IP請(qǐng)求和并發(fā)連接數(shù)的實(shí)現(xiàn)方法,通過(guò)使用Nginx的限制模塊,我們可以輕松地實(shí)現(xiàn)對(duì)IP請(qǐng)求和并發(fā)連接數(shù)的限制,具體就跟小編一起來(lái)了解一下2024-03-03

