Windows與Linux環(huán)境下的高性能負(fù)載均衡教程
1. NGINX 架構(gòu) & 工作原理
1.Master/Worker 進(jìn)程模型
Master
:僅負(fù)責(zé)加載配置、管理 Worker(平滑重載、信號(hào)處理)。Worker
:事件驅(qū)動(dòng),一般與 CPU 核心數(shù)相同或略多,通過(guò)epoll
/kqueue
高效處理海量并發(fā)連接。
2.無(wú)阻塞 I/O & 異步事件
- 每個(gè) Worker 在一個(gè)線程內(nèi)即可管理上萬(wàn)連接,極大降低上下文切換。
3.模塊化設(shè)計(jì)
HTTP、Stream、Mail 等子系統(tǒng)均可按需編譯模塊:
ngx_http_upstream_module
(負(fù)載均衡)ngx_http_stub_status_module
(狀態(tài)監(jiān)控)- 第三方健康檢查模塊、Lua 腳本擴(kuò)展等。
2. Windows 平臺(tái)部署
適用場(chǎng)景:企業(yè)內(nèi)部測(cè)試、與 IIS 協(xié)同(通過(guò) ARR
/ AJP
協(xié)議等)或方便 Windows 環(huán)境下快速部署。
2.1 下載與解壓
- 訪問 nginx.org(en) 下載頁(yè)
- 獲取 Stable version 的 ZIP 包,例如
nginx-1.24.0.zip
。 - 解壓到
C:\nginx\
目錄。
2.2 注冊(cè)為 Windows 服務(wù)(可選)
使用 NSSM(Non-Sucking Service Manager):
# 假設(shè) nssm.exe 已放在 C:\tools\nssm\nssm.exe C:\tools\nssm\nssm install nginx "C:\nginx\nginx.exe" # 啟動(dòng)服務(wù) net start nginx
2.3 配置文件位置
- 主配置:
C:\nginx\conf\nginx.conf
- 日志:
C:\nginx\logs\access.log
/error.log
2.4 常用命令
# 啟動(dòng) C:\nginx\nginx.exe # 平滑重載(重讀配置) C:\nginx\nginx.exe -s reload # 停止 C:\nginx\nginx.exe -s quit
小貼士:在 Windows 下,-s reload
可能不如 Linux 穩(wěn)定,可結(jié)合 NSSM 服務(wù)的重啟實(shí)現(xiàn)零 Downtime。
3. Linux 平臺(tái)部署
適用場(chǎng)景:生產(chǎn)環(huán)境首選。本文以 Ubuntu 為例,CentOS / RHEL 同理。
3.1 安裝(包管理/編譯安裝)
- 3.1.1 包管理安裝
# Ubuntu / Debian sudo apt update sudo apt install -y nginx # CentOS / RHEL sudo yum install -y epel-release sudo yum install -y nginx
- 3.1.2 源碼編譯(自定義模塊)
# 安裝依賴 sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev \ libssl-dev # 下載源碼并編譯 wget http://nginx.org/download/nginx-1.24.0.tar.gz tar zxvf nginx-1.24.0.tar.gz && cd nginx-1.24.0 ./configure \ --prefix=/usr/local/nginx \ --with-http_ssl_module \ --with-http_v2_module \ --with-http_stub_status_module \ --with-stream \ --with-stream_ssl_module make && sudo make install
3.2 服務(wù)管理
Systemd
sudo systemctl enable nginx sudo systemctl start nginx sudo systemctl reload nginx sudo systemctl status nginx
配置目錄
/etc/nginx/nginx.conf
:主配置/etc/nginx/conf.d/*.conf
:虛擬主機(jī)/負(fù)載均衡片段/usr/share/nginx/html/
:默認(rèn)靜態(tài)服務(wù)根
4. 核心負(fù)載均衡配置
以下示例均放在 http { … }
段內(nèi)。
4.1 基礎(chǔ) Round-Robin(輪詢)
upstream backend { server srv1.example.com:80; server srv2.example.com:80; server srv3.example.com:80; } server { listen 80; location / { proxy_pass http://backend; } }
- 特性:默認(rèn)輪詢,新連接依序分發(fā);對(duì)等服務(wù)器無(wú)需額外指令。
4.2 Least-Connected(最少連接)
upstream backend { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
- 場(chǎng)景:請(qǐng)求耗時(shí)差異大,或部分節(jié)點(diǎn)性能不同,動(dòng)態(tài)均衡更公平。
4.3 IP-Hash(基于客戶端 IP)
upstream backend { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
- 會(huì)話保持:同一客戶端 IP 始終打到同一后端,適用于有狀態(tài)應(yīng)用(Session、購(gòu)物車等)。
4.4 加權(quán)(Weight)
upstream backend { server srv1.example.com weight=4; server srv2.example.com weight=1; server srv3.example.com weight=1; }
- 意義:每 6 個(gè)請(qǐng)求中,srv1 將承擔(dān) 4 個(gè),其他各 1 個(gè)??膳c任意調(diào)度算法(輪詢、least_conn、ip_hash)聯(lián)合使用。
4.5 備用節(jié)點(diǎn) & 強(qiáng)制下線
upstream backend { server srv1.example.com; server srv2.example.com backup; # 僅在主組不可用時(shí)才使用 server srv3.example.com down; # 永久下線(手動(dòng)維護(hù)) }
5. 健康檢查與故障恢復(fù)
5.1 被動(dòng)健康檢查(開箱即用)
max_fails
:連續(xù)失敗次數(shù)fail_timeout
:失敗后多長(zhǎng)時(shí)間內(nèi)禁用
upstream backend { server srv1.example.com max_fails=2 fail_timeout=15s; server srv2.example.com; }
流程:
- 若 2 次請(qǐng)求超時(shí)/斷開,srv1 標(biāo)記為 Unhealthy;
- 禁用 15s;
- 15s 后首次新請(qǐng)求探活,成功即恢復(fù)。
5.2 主動(dòng)健康檢查(NGINX Plus / 第三方模塊)
- NGINX Plus:內(nèi)置
health_check
與可視化 API。 - Open Source:可編譯
nginx-upstream-check-module
,或使用 Lua 腳本按固定間隔http
探測(cè)。
6. 性能調(diào)優(yōu)
6.1 連接與緩沖
# 在 http{} 頂層設(shè)置 worker_connections 10240; # 每 Worker 最大連接數(shù) keepalive_timeout 65s; # 客戶端長(zhǎng)連接超時(shí) keepalive_requests 100; # 單連接最大請(qǐng)求數(shù)
- proxy_buffers:調(diào)整上游響應(yīng)緩沖區(qū)
- proxy_busy_buffers_size:大響應(yīng)場(chǎng)景優(yōu)化
6.2 超時(shí)配置
server { proxy_connect_timeout 3s; # 建立 TCP 連接超時(shí) proxy_send_timeout 10s; # 發(fā)送請(qǐng)求到后端超時(shí) proxy_read_timeout 30s; # 接收后端響應(yīng)超時(shí) }
6.3 內(nèi)核 & 網(wǎng)絡(luò)調(diào)優(yōu)
- somaxconn
sysctl -w net.core.somaxconn=65535
- tcp_tw_reuse/tcp_fin_timeout:加速 TIME_WAIT 回收
- ulimit -n:提升文件描述符上限
7. 監(jiān)控 & 日志
7.1 Stub Status
在 server{}
段開啟:
location /nginx_status { stub_status on; allow 127.0.0.1; deny all; }
輸出示例:
Active connections: 291 server accepts handled requests 15394 15394 54123 Reading: 0 Writing: 1 Waiting: 290
7.2 日志格式自定義
log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" ' 'rt=$request_time ua="$upstream_addr" us="$upstream_response_time"'; access_log /var/log/nginx/access.log main;
rt
/us
可用于請(qǐng)求耗時(shí)分析、后端性能監(jiān)控。
7.3 Prometheus 集成
- 使用 nginx-prometheus-exporter;
- 結(jié)合 Grafana 構(gòu)建實(shí)時(shí)大屏。
8. 常見故障排查
場(chǎng)景 | 錯(cuò)誤表現(xiàn) | 排查思路 |
---|---|---|
后端 502 Bad Gateway | 502 頁(yè)面 | 檢查后端服務(wù)是否啟動(dòng);error.log 中定位 upstream prematurely closed |
超時(shí) 504 Gateway | 請(qǐng)求超時(shí) | 調(diào)大 proxy_read_timeout;后端性能分析 |
配置重載失敗 | invalid number… | 語(yǔ)法檢查:nginx -t;注意分號(hào)、括號(hào) |
連接數(shù)耗盡 | 500 / 卡頓 | 提升 worker_connections;監(jiān)控 Active connections |
9. 進(jìn)階 & 拓展
- 動(dòng)態(tài) DNS 解析:
server backend.example.com resolve; + resolver
- gRPC & HTTP/2:
http2 on; grpc_pass grpc://backend;
- 緩存:
proxy_cache_path
+proxy_cache
- 安全:IP 白名單、WAF(ModSecurity)、TLS 卸載與硬件加速
總結(jié)
本文系統(tǒng)地覆蓋了:
- NGINX 架構(gòu)與事件模型
- Windows 與 Linux 雙平臺(tái)安裝、服務(wù)化
- 核心調(diào)度算法:輪詢、最少連接、IP 哈希、加權(quán)、備用/下線
- 健康檢查(被動(dòng) & 主動(dòng))
- 性能與內(nèi)核調(diào)優(yōu)
- 監(jiān)控、日志采集與可視化
- 常見故障排查與進(jìn)階功能
通過(guò)以上實(shí)踐,您可在自研環(huán)境或生產(chǎn)集群中,快速搭建一個(gè)高可用、可擴(kuò)展的 HTTP 負(fù)載均衡層。后續(xù)可結(jié)合微服務(wù)網(wǎng)關(guān)(Service Mesh)、WAF、安全審計(jì)與灰度發(fā)布,實(shí)現(xiàn)更高級(jí)的流量控制與運(yùn)維自動(dòng)化。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決Debian系統(tǒng)自動(dòng)更新軟件包的問題的方法
這篇文章主要介紹了解決Debian系統(tǒng)自動(dòng)更新軟件包的問題的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12Linux的文件存取權(quán)限和0644權(quán)限問題
這篇文章主要介紹了Linux的文件存取權(quán)限和0644權(quán)限問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09詳解ubuntu14.04如何設(shè)置靜態(tài)IP的方法
本篇文章主要介紹了ubuntu14.04如何設(shè)置靜態(tài)IP的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Linux之路由轉(zhuǎn)發(fā)和SNAT的應(yīng)用方式
這篇文章主要介紹了Linux之路由轉(zhuǎn)發(fā)和SNAT的應(yīng)用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05Ubuntu 16.04 LTS下安裝MATLAB 2014B的方法教程
這篇文章主要介紹了Ubuntu 16.04 LTS下安裝MATLAB 2014B的方法教程,文中介紹的很詳細(xì),相信對(duì)大家具有一定的參考價(jià)值,有需要的朋友們下面來(lái)一起看看吧。2017-02-02linux 下 g++編譯程序時(shí)-I(大寫i) 與-L(大寫l)-l(小寫l) 的作用詳解
這篇文章主要介紹了linux 下 g++編譯程序時(shí)-I(大寫i) 與-L(大寫l)-l(小寫l) 的作用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03linux實(shí)現(xiàn)對(duì)上傳文件的定時(shí)備份、增量備份的方法
這篇文章主要介紹了linux實(shí)現(xiàn)對(duì)上傳文件的定時(shí)備份、增量備份的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04