Nginx 负载均衡配置
Nginx 负载均衡配置
什么是负载均衡
负载均衡是将网络流量分发到多个后端服务器的技术,用于提高应用的可用性、可靠性和性能。Nginx 支持多种负载均衡算法。
负载均衡算法
轮询(Round Robin)
默认算法,按顺序依次分配请求:
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
加权轮询
根据服务器性能分配不同权重:
upstream backend {
server 192.168.1.10:8080 weight=5; # 高性能服务器
server 192.168.1.11:8080 weight=3; # 中等性能
server 192.168.1.12:8080 weight=2; # 低性能
}
IP 哈希
根据客户端 IP 地址分配,同一 IP 始终访问同一服务器:
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
最少连接
将请求分配给当前连接数最少的服务器:
upstream backend {
least_conn;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
健康检查
被动健康检查
upstream backend {
server 192.168.1.10:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.11:8080 max_fails=3 fail_timeout=30s;
server 192.168.1.12:8080 max_fails=3 fail_timeout=30s;
}
主动健康检查(Nginx Plus)
upstream backend {
zone backend 64k;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
match healthy {
status 200;
header Content-Type = text/html;
body ~ "OK";
}
server {
listen 80;
location / {
proxy_pass http://backend;
health_check interval=10 passes=2 fails=3 match=healthy;
}
}
健康检查脚本
#!/bin/bash
# health_check.sh
for server in 192.168.1.10 192.168.1.11 192.168.1.12; do
response=$(curl -s -o /dev/null -w "%{http_code}" http://$server:8080/health)
if [ "$response" -eq 200 ]; then
echo "Server $server is healthy"
else
echo "Server $server is unhealthy"
fi
done
会话保持
基于 IP 的会话保持
upstream backend {
ip_hash;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
}
基于 Cookie 的会话保持(Nginx Plus)
upstream backend {
server 192.168.1.10:8080;
server 192.168.1.11:8080;
server 192.168.1.12:8080;
sticky cookie srv_id expires=1h domain=.example.com path=/;
}
负载均衡配置
基本配置
upstream backend {
least_conn;
server 192.168.1.10:8080 weight=5;
server 192.168.1.11:8080 weight=3;
server 192.168.1.12:8080 backup;
keepalive 32;
}
server {
listen 80;
server_name app.example.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;
proxy_set_header X-Forwarded-Proto $scheme;
# 保持连接
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超时设置
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
proxy_send_timeout 30s;
}
}
实践案例
部署 Web 应用集群
# 定义上游服务器
upstream web_cluster {
# 主服务器
server 192.168.1.10:8080 weight=5;
server 192.168.1.11:8080 weight=3;
# 备用服务器
server 192.168.1.12:8080 backup;
# 保持连接
keepalive 32;
}
# 定义 API 服务器
upstream api_cluster {
server 192.168.1.20:8081 weight=3;
server 192.168.1.21:8081 weight=3;
least_conn;
keepalive 16;
}
# Web 应用
server {
listen 80;
server_name www.example.com;
location / {
proxy_pass http://web_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;
}
}
# API 服务
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://api_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;
}
}
多后端服务
upstream frontend {
server 192.168.1.10:80;
server 192.168.1.11:80;
}
upstream backend_api {
server 192.168.1.20:8080;
server 192.168.1.21:8080;
}
upstream static {
server 192.168.1.30:80;
server 192.168.1.31:80;
}
server {
listen 80;
server_name example.com;
# 前端
location / {
proxy_pass http://frontend;
}
# 后端 API
location /api/ {
proxy_pass http://backend_api;
}
# 静态资源
location /static/ {
proxy_pass http://static;
}
}
性能优化
upstream backend {
# 启用 keepalive
keepalive 64;
keepalive_requests 1000;
keepalive_timeout 60s;
server 192.168.1.10:8080;
server 192.168.1.11:8080;
}
server {
listen 80;
location / {
proxy_pass http://backend;
# 保持连接
proxy_http_version 1.1;
proxy_set_header Connection "";
# 缓冲
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# 超时
proxy_connect_timeout 10s;
proxy_read_timeout 30s;
}
}
监控和调试
# 检查 Nginx 状态
sudo nginx -t
# 查看访问日志
sudo tail -f /var/log/nginx/access.log
# 查看错误日志
sudo tail -f /var/log/nginx/error.log
# 检查后端服务器
curl -v http://192.168.1.10:8080/health
常见问题
502 Bad Gateway
# 检查后端服务是否运行
systemctl status app.service
# 检查端口监听
netstat -tlnp | grep 8080
负载不均衡
# 检查权重配置
# 检查是否使用了正确的算法
# 查看访问日志分析
最佳实践
- 使用合适的负载均衡算法
- 配置健康检查
- 启用 keepalive 保持连接
- 设置合理的超时时间
- 监控后端服务器状态
总结
Nginx 负载均衡是构建高可用 Web 架构的关键。通过合理配置负载均衡算法、健康检查和会话保持,可以实现高性能、高可用的服务架构。