nginx高并发高可用
Nginx负载均衡是一种将客户端请求分发到多个后端服务器的技术,以提升系统性能、可用性和稳定性。
它通过智能分配流量,避免单台服务器过载,广泛应用于高并发Web服务架构中。
核心负载均衡策略
轮询(Round Robin)
默认策略,按顺序将请求依次分配给后端服务器。若某服务器宕机,Nginx会自动将其剔除。
适用场景:后端服务器性能相近、负载均衡需求简单。
配置示例:
nginx
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
}
加权轮询(Weighted Round Robin)
为服务器设置权重(weight),权重越高,接收请求越多。适合服务器性能不均的环境。
例如:weight=3 的服务器接收约75%的流量。
配置示例:
nginx
upstream backend {
server 192.168.1.101 weight=3;
server 192.168.1.102 weight=1;
}
IP哈希(IP Hash)
根据客户端IP的哈希值分配请求,确保同一用户始终访问同一台后端服务器,解决会话保持问题。
配置示例:
nginx
upstream backend {
ip_hash;
server 192.168.1.101;
server 192.168.1.102;
}
最少连接(Least Connections)
动态将新请求分配给当前连接数最少的服务器,适合长连接或处理时间差异大的场景。
配置示例:
nginx
upstream backend {
least_conn;
server 192.168.1.101;
server 192.168.1.102;
}
响应时间(Least Time,Nginx Plus专属)
基于后端服务器的平均响应时间进行调度,优先选择响应最快的服务器,需使用商业版Nginx Plus。
四层与七层负载均衡
七层负载均衡(HTTP/HTTPS):工作在应用层,可基于URL、Header等信息进行精细路由。常用于Web服务分发。
四层负载均衡(TCP/UDP):工作在传输层,直接转发数据包,延迟更低,适合数据库集群、游戏服务器等对性能敏感的场景。
高可用与健康检查
使用 max_fails 和 fail_timeout 参数实现故障自动隔离:
nginx
server 192.168.1.101 max_fails=3 fail_timeout=30s;
连续3次失败后,该服务器将被标记为不可用30秒。
支持动态DNS解析和backup备用节点配置,提升系统容错能力。
# user nginx; # 运行用户,根据实际系统调整
worker_processes auto; # 自动根据CPU核心数设置工作进程
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024; # 每个工作进程的最大连接数
use epoll; # Linux下高性能事件驱动模型
multi_accept on; # 允许一个工作进程同时接受多个新连接
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# ==========================================
# 1. 定义后端服务器集群 (Upstream)
# ==========================================
# 示例1:加权轮询 + 健康检查(最常用生产环境配置)
upstream backend_weighted {
# weight: 权重,值越大分配请求越多
# max_fails: 最大失败次数,超过此次数标记为不可用
# fail_timeout: 失败后的暂停时间,也是重试间隔
server 192.168.1.101:8080 weight=3 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=1 max_fails=3 fail_timeout=30s;
# backup: 备用服务器,仅当主服务器全部不可用时启用
# server 192.168.1.103:8080 backup;
}
# 示例2:IP哈希(用于会话保持,无需后端共享Session)
upstream backend_ip_hash {
ip_hash;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
}
# 示例3:最少连接(适合长连接或处理时间差异大的场景)
upstream backend_least_conn {
least_conn;
server 192.168.1.101:8080;
server 192.168.1.102:8080;
# keepalive: 启用上游长连接池,提升性能
# 注意:配合 proxy_http_version 1.1 和 proxy_set_header Connection ""使用
keepalive 32;
}
# ==========================================
# 2. 配置虚拟主机 (Server)
# ==========================================
server {
listen 80;
server_name example.com www.example.com;
# 可选:强制跳转 HTTPS
# return 301 https://$server_name$request_uri;
location / {
# 指向定义的 upstream 组
proxy_pass http://backend_weighted;
# --- 关键代理头设置 ---
# 传递真实主机名
proxy_set_header Host $host;
# 传递客户端真实IP
proxy_set_header X-Real-IP $remote_addr;
# 传递代理链IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 传递协议(http/https)
proxy_set_header X-Forwarded-Proto $scheme;
# --- 超时设置 ---
proxy_connect_timeout 5s; # 连接后端超时
proxy_send_timeout 10s; # 发送数据给后端超时
proxy_read_timeout 10s; # 等待后端响应超时
# --- 缓冲设置 ---
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
# --- 错误处理 ---
# 如果后端返回502/503/504,尝试下一台服务器(需upstream支持)
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
# 健康检查状态页(可选,需ngx_http_stub_status_module)
location /nginx_status {
stub_status;
allow 127.0.0.1; # 仅允许本地访问
deny all;
}
}
# 示例:HTTPS 配置模板
# server {
# listen 443 ssl http2;
# server_name example.com;
#
# ssl_certificate /etc/nginx/ssl/cert.pem;
# ssl_certificate_key /etc/nginx/ssl/key.pem;
# ssl_session_cache shared:SSL:10m;
# ssl_session_timeout 10m;
#
# location / {
# proxy_pass http://backend_weighted;
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# }
# }
}
nginx_负载均衡配置
已完成
查看
配置说明与最佳实践
Upstream 策略选择:
加权轮询(Weighted Round Robin):默认且最通用的策略,适合大多数无状态服务。通过 weight 调整不同性能服务器的负载比例。
IP Hash:适用于需要会话保持(Session Sticky)但后端未实现共享 Session 的场景。注意:后端服务器增减会导致哈希重分布,可能引起部分用户会话丢失。
最少连接(Least Conn):适合请求处理时间长短不一的场景(如文件上传、复杂查询),能避免慢请求堆积在某台服务器。
健康检查机制:
使用 max_fails 和 fail_timeout 实现被动健康检查。Nginx 会在请求失败时计数,达到阈值后暂时剔除该节点,fail_timeout 过后再次尝试探测。
若使用 Nginx Plus,可配置主动健康检查(health_check 指令),定期发送探测请求。
性能优化:
Keepalive:在 upstream 中配置 keepalive 并在 location 中设置 proxy_http_version 1.1 和 proxy_set_header Connection "",可复用与后端的 TCP 连接,显著降低延迟和端口消耗。
Buffering:合理设置 proxy_buffer_size 和 proxy_buffers,避免大响应头或响应体导致内存溢出或频繁磁盘 IO。
真实 IP 传递:
务必配置 X-Real-IP 和 X-Forwarded-For,否则后端应用获取的客户端 IP 将是 Nginx 服务器的 IP,影响日志统计和安全策略。
高可用建议:
生产环境中通常部署双机 Nginx,结合 Keepalived 实现 VIP(虚拟 IP)漂移,确保 Nginx 自身的高可用。
在 Nginx 负载均衡配置中,备份服务器(Backup Server) 是一种高可用机制。它指的是在 upstream 模块中标记为 backup 的后端服务器。
核心作用
平时闲置:当主服务器(非 backup 节点)正常工作时,Nginx 不会将任何请求转发给标记为 backup 的服务器。
故障接管:只有当所有非 backup 的主服务器都不可用(宕机、超时或达到最大失败次数 max_fails)时,Nginx 才会将流量自动切换到 backup 服务器。
恢复切换:一旦主服务器恢复健康,Nginx 会自动将流量切回主服务器,backup 服务器重新回到闲置状态。
适用场景
容灾备份:提供一台性能较低但稳定的服务器作为“最后一道防线”,防止主集群全部崩溃导致服务完全不可用。
维护期间:在主服务器进行维护升级时,确保服务不中断。
冷备资源:节省资源,备用服务器在平时可以处理其他低优先级任务或处于低功耗状态。
配置示例
以下是一个标准的 Nginx 配置片段,展示了如何使用 backup 参数:
nginx
http {
upstream backend_cluster {
# 主服务器:权重高,承担主要流量
server 192.168.1.101:8080 weight=5;
server 192.168.1.102:8080 weight=5;
# 备份服务器:仅当上面两台都不可用时才启用
server 192.168.1.103:8080 backup;
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend_cluster;
# 可选:设置健康检查参数,更快触发切换
# proxy_next_upstream error timeout http_502 http_503;
}
}
}
注意事项
不能与 ip_hash 或 least_conn 混用限制:
在开源版 Nginx 中,backup 参数可以与 weight 一起使用,但不能与 ip_hash 指令直接共存于同一个 upstream 块中(如果使用了 ip_hash,通常建议所有节点都参与哈希计算,或者使用商业版 Nginx Plus 的高级会话保持功能)。
不过,在某些版本中,如果仅有一台 backup,配置可能生效,但行为可能不符合预期(因为 hash 算法可能仍然尝试映射到已宕机的主节点)。最佳实践是:如果使用 ip_hash,请谨慎使用 backup,或确保所有节点都在线参与哈希。
least_conn 可以与 backup 配合使用。
健康检查依赖:
Nginx 开源版依赖被动健康检查(即通过用户请求失败来判断)。如果主服务器宕机,第一个访问的用户可能会经历超时或错误,直到 Nginx 标记该服务器为不可用并切换到 backup。
为了更快的故障切换,可以调整 proxy_connect_timeout、proxy_read_timeout 以及 max_fails 和 fail_timeout 参数。
多组备份:
你可以配置多台 backup 服务器。当主服务器全部失效时,Nginx 会在这些 backup 服务器之间按照轮询(或加权轮询)分配流量。
总结
backup 参数是实现 Nginx 负载均衡高可用的简单而有效的手段,特别适用于对成本敏感但要求基本可用性的场景。它确保了即使主集群完全失效,服务仍能由备用节点继续提供。
Nginx 实现高并发与高可用主要依赖于其异步非阻塞的事件驱动架构、合理的系统参数调优、负载均衡策略以及故障转移机制。以下是从架构原理到具体配置的最佳实践指南。
一、 高并发核心优化策略
高并发的关键在于最大化利用硬件资源,减少上下文切换和 I/O 等待。
1. 工作进程与连接数调优
Nginx 采用 Master-Worker 模式。Master 负责管理,Worker 负责处理请求。
worker_processes: 建议设置为 auto,自动匹配 CPU 核心数,充分利用多核性能。
worker_connections: 每个 Worker 进程能同时处理的最大连接数。需结合系统文件描述符限制 (ulimit -n) 设置。
multi_accept: 开启后,一个 Worker 可以一次性接受多个新连接,减少系统调用次数。
use epoll: 在 Linux 下使用 epoll 事件模型,相比 select/poll 在处理大量空闲连接时效率更高。
2. 网络与传输优化
sendfile: 开启零拷贝技术,数据直接在内核空间传输,避免用户态与内核态的频繁切换。
tcp_nopush & tcp_nodelay: 配合 sendfile 使用,优化数据包发送策略,减少网络报文数量。
keepalive_timeout: 保持长连接,减少 TCP 三次握手和四次挥手的开销。但需平衡内存占用,避免空闲连接过多。
gzip: 开启压缩,减少传输带宽,提升页面加载速度。
3. 缓冲与缓存
proxy_buffering: 开启代理缓冲,后端响应先写入 Nginx 缓冲区,再发送给客户端,释放后端连接。
静态资源缓存: 对图片、CSS、JS 等静态文件设置 expires,利用浏览器缓存,减轻服务器压力。
二、 高可用架构设计
高可用旨在确保当部分组件故障时,服务仍能正常运行。
1. 负载均衡与故障转移
通过 upstream 模块将请求分发到多台后端服务器。
健康检查: 利用 max_fails 和 fail_timeout 实现被动健康检查。当某台后端服务器连续失败达到指定次数,Nginx 会在指定时间内不再向其转发请求。
备份服务器 (backup): 配置备用节点,仅当主节点全部不可用时启用,提供最后一道防线。
负载均衡算法:
round_robin (默认): 轮询,适合大多数场景。
least_conn: 最少连接,适合请求处理时间差异大的场景。
ip_hash: 会话保持,确保同一 IP 请求固定后端。
2. 限流保护
防止突发流量或恶意攻击压垮服务。
limit_req: 基于漏桶算法限制请求速率,配合 burst 允许一定程度的突发流量。
limit_conn: 限制单个 IP 或虚拟主机的并发连接数。
3. 集群高可用 (Keepalived + VIP)
单点 Nginx 仍存在风险。生产环境通常部署双机 Nginx,结合 Keepalived 实现虚拟 IP (VIP) 漂移。当主 Nginx 宕机,VIP 自动漂移到备机,实现秒级故障切换。
三、 完整配置示例
以下是一个集成了高并发优化、负载均衡、故障转移和限流的 Nginx 配置文件模板。
user nginx;
worker_processes auto; # 自动根据CPU核心数设置工作进程
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
# 优化系统资源限制
worker_rlimit_nofile 65535;
events {
worker_connections 65535; # 每个工作进程的最大连接数,需配合ulimit
use epoll; # Linux下高性能事件驱动模型
multi_accept on; # 允许一个工作进程同时接受多个新连接
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
# 核心性能优化
sendfile on; # 开启零拷贝
tcp_nopush on; # 优化数据包发送
tcp_nodelay on; # 禁用Nagle算法,降低延迟
keepalive_timeout 65; # 长连接超时时间
keepalive_requests 100; # 单个长连接最大请求数
gzip on; # 开启Gzip压缩
gzip_types text/plain application/json application/javascript text/css;
# 隐藏版本号,安全优化
server_tokens off;
# ==========================================
# 1. 限流配置 (Zone定义)
# ==========================================
# 按IP限流:每秒10个请求,共享内存10m
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
# 按IP限制并发连接数
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
# ==========================================
# 2. 上游服务器集群 (Upstream)
# ==========================================
upstream backend_cluster {
# 加权轮询
server 192.168.1.101:8080 weight=5 max_fails=3 fail_timeout=30s;
server 192.168.1.102:8080 weight=5 max_fails=3 fail_timeout=30s;
# 备份服务器:仅当主服务器全部不可用时启用
server 192.168.1.103:8080 backup;
# 长连接池优化:与后端保持长连接,减少握手开销
keepalive 32;
}
server {
listen 80;
server_name example.com;
# 字符集
charset utf-8;
# 全局限流应用
limit_conn conn_limit 20; # 每个IP最大20个并发连接
location / {
# 应用请求速率限流:burst=20允许突发,nodelay立即处理
limit_req zone=req_limit burst=20 nodelay;
# 限流拒绝返回429状态码
limit_req_status 429;
limit_conn_status 429;
proxy_pass http://backend_cluster;
# --- 关键代理头设置 ---
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# --- 长连接支持 ---
proxy_http_version 1.1;
proxy_set_header Connection ""; # 清除Connection头以复用后端连接
# --- 超时设置 ---
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# --- 错误处理与故障转移 ---
# 遇到以下错误时,尝试下一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
}
# 静态资源优化
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
root /var/www/html;
expires 30d; # 浏览器缓存30天
add_header Cache-Control "public";
access_log off; # 关闭静态资源日志,减少IO
}
# 健康检查状态页
location /nginx_status {
stub_status;
allow 127.0.0.1;
deny all;
}
}
}
nginx_high_concurrency_ha
已完成
查看
配置要点解析
高并发支撑:
worker_processes auto 和 worker_connections 65535 确保了 Nginx 能利用多核 CPU 并处理大量并发连接。
epoll 和 multi_accept 提升了事件处理效率。
sendfile、tcp_nopush 和 gzip 优化了数据传输效率,降低带宽消耗。
keepalive 在 upstream 和 client 侧均进行了优化,减少了 TCP 握手开销。
高可用保障:
upstream 中配置了 max_fails 和 fail_timeout,实现了自动故障隔离。
backup 服务器提供了灾备能力。
proxy_next_upstream 确保在请求失败时自动重试其他节点,对用户透明。
稳定性防护:
limit_req 和 limit_conn 防止了突发流量和恶意 CC 攻击导致的服务雪崩。
server_tokens off 隐藏了版本信息,提升了安全性。
部署建议:
此配置文件需配合操作系统层面的优化(如 /etc/security/limits.conf 中设置 nofile)才能发挥最大效能。
生产环境建议部署双机 Nginx + Keepalived,避免单点故障。
浙公网安备 33010602011771号