目录
- 1. NGINX 架构 & 工作原理
- 2. Windows 平台部署
- 2.1 下载与解压
- 2.2 注册为 Windows 服务(可选)
- 2.3 配置文件位置
- 2.4 常用命令
- 3. linux 平台部署
- 3.1 安装(包管理/编译安装)
- 3.2 服务管理
- 4. 核心负载均衡配置
- 4.1 基础 Round-Robin(轮询)
- 4.2 Least-Connected(最少连接)
- 4.3 IP-Hash(基于客户端 IP)
- 4.4 加权(Weight)
- 4.5 备用节点 & 强制下线
- 5. 健康检查与故障恢复
- 5.1 被动健康检查(开箱即用)
- 5.2 主动健康检查(NGINX Plus / 第三方模块)
- 6. 性能调优
- 6.1 连接与缓冲
- 6.2 超时配置
- 6.3 内核 & 网络调优
- 7. 监控 & 日志
- 7.1 Stub Status
- 7.2 日志格式自定义
- 7.3 Prometheus 集成
- 8. 常见故障排查
- 9. 进阶 & 拓展
- 总结
1. NGINX 架构 & 工作原理
1.Master/Worker 进程模型
Master
:仅负责加载配置、管理 Worker(平滑重载、信号处理)。Worker
:事件驱动,一般与 CPU 核心数相同或略多,通过epoll
/kqueue
高效处理海量并发连接。
2.无阻塞 I/O & 异步事件
- 每个 Worker 在一个线程内即可管理上万连接,极大降低上下文切换。
3.模块化设计
HTTP、Stream、Mail 等子系统均可按需编译模块:
ngx_http_upstream_module
(负载均衡)ngx_http_stub_status_module
(状态监控)- 第三方健康检查模块、Lua 脚本扩展等。
2. Windows 平台部署
适用场景:企业内部测试、与 IIS 协同(通过 ARR
/ AJP
协议等)或方便 Windows 环境下快速部署。
2.1 下载与解压
- 访问 nginx.org(en) 下载页
- 获取 Stable version 的 ZIP 包,例如
nginx-1.24.0.zip
。 - 解压到
C:\nginx\
目录。
2.2 注册为 Windows 服务(可选)
使用 NSSM(Non-Sucking Service Manager):
# 假设 nssm.exe 已放在 C:\tools\nssm\nssm.exe C:\tools\nssm\nssm install nginx "C:\nginx\nginx.exe" # 启动服务 net start nginx
2.3 配置文件位置
- 主配置:
C:\nginx\conf\nginx.conf
- 日志:
C:\nginx\logs\Access.log
/error.log
2.4 常用命令
# 启动 C:\nginx\nginx.exe # 平滑重载(重读配置)js C:\nginx\nginx.exe -s reload # 停止 C:\nginx\nginx.exe -s quit
小贴士:在 Windows 下,-s reload
可能不如 Linux 稳定,可结合 NSSM 服务的重启实现零 Downtime。
3. Linux 平台部署
适用场景:生产环境首选。本文以 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 \ liwww.devze.combssl-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_moduleBiNRdwy \ --with-http_v2_module \ --with-http_stub_status_module \ --with-stream \ --with-stream_ssl_module make && sudo make install
3.2 服务管理
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
:虚拟主机/负载均衡片段/usr/share/nginx/html/
:默认静态服务根
4. 核心负载均衡配置
以下示例均放在 http { … }
段内。
4.1 基础 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; } }
- 特性:默认轮询,新连接依序分发;对等服务器无需额外指令。
4.2 Least-Connected(最少连接)
upstream backend { least_conn; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
- 场景:请求耗时差异大,或部分节点性能不同,动态均衡更公平。
4.3 IP-Hash(基于客户端 IP)
upstream backend { ip_hash; server srv1.example.com; server srv2.example.com; server srv3.example.com; }
- 会话保持:同一客户端 IP 始终打到同一后端,适用于有状态应用(Session、购物车等)。
4.4 加权(Weight)
upstream backend { server srv1.example.com weight=4; server srv2.example.com weight=1; server srv3.example.com weight=1; }
- 意义:每 6 个请求中,srv1 将承担 4 个,其他各 1 个。可与任意调度算法(轮询、least_conn、ip_hash)联合使用。
4.5 备用节点 & 强制下线
upstream backend { server srv1.example.com; server srv2.example.com backup; # 仅在主组不可用时才使用 server srv3.example.com down; # 永久下线(手动维护) }
5. 健康检查与故障恢复
5.1 被动健康检查(开箱即用)
max_fails
:连续失败次数fail_timeout
:失败后多长时间内禁用
upstream backend { server srv1.example.com max_fails=2 fail_timeout=15s; server srv2.example.com; }
流程:
- 若 2 次请求超时/断开,srv1 标记为 Unhealthy;
- 禁用 15s;
- 15s 后首次新请求探活,成功即恢复。
5.2 主动健康检查(NGINX Plus / 第三方模块)
- NGINX Plus:内置
health_check
与可视化 API。 - Open Source:可编译
nginx-upstream-check-module
,或使用 Lua 脚本按固定间隔http
探测。
6. 性能调优
6.1 连接与缓冲
# 在 http{} 顶层设置 worker_connections 10240; # 每 Worker 最大连接数 keepalive_timeout 65s; # 客户端长连接超时 keepalive_requests 100; # 单连接最大请求数
- proxy_buffers:调整上游响应缓冲区
- proxy_busy_buffers_size:大响应场景优化
6.2 超时配置
server { proxy_connect_timeout 3s; # 建立 TCP 连接超时 proxy_send_timeout 10s; # 发送请求到后端超时 proxy_read_timeout 30s; # 接收后端响应超时 }
6.3 内核 & 网络调优
- somaxconn
sysctl -w net.core.somaxconn=65535
- tcp_tw_reuse/tcp_fin_timeout:加速 TIME_WAIT 回收
- ulimit -n:提升文件描述符上限
7. 监控 & 日志
7.1 Stub Status
在 server{}
段开启:
location /nginx_status { stub_stjsatus 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
可用于请求耗时分析、后端性能监控。
7.3 Prometheus 集成
- 使用 nginx-prometheus-exporter;
- 结合 Grafana 构建实时大屏。
8. 常见故障排查
场景 | 错误表现 | 排查思路 |
---|---|---|
后端 502 Bad Gateway | 502 页面 | 检查后端服务是否启动;error.log 中定位 upstream prematurely closed |
超时 504 Gateway | 请求超时 | 调大 proxy_read_timeout;后端性能分析 |
配置重载失败 | invalid number… | 语法检查:nginx -http://www.devze.comt;注意分号、括号 |
连接数耗尽 | 500 / 卡顿 | 提升 worker_connections;监控 Active connections |
9. 进阶 & 拓展
- 动态 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 卸载与硬件加速
总结
本文系统地覆盖了:
- NGINX 架构与事件模型
- Windows 与 Linux 双平台安装、服务化
- 核心调度算法:轮询、最少连接、IP 哈希、加权、备用/下线
- 健康检查(被动 & 主动)
- 性能与内核调优
- 监控、日志采集与可视化
- 常见故障排查与进阶功能
通过以上实践,您可在自研环境或生产集群中,快速搭建一个高可用、可扩展的 HTTP 负载均衡层。后续可结合微服务网关(Service Mesh)、WAF、安全审计与灰度发布,实现更高级的流量控制与运维自动化。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论