← 返回首页
🔧

Nginx 负载均衡配置

📂 devops ⏱ 3 min 513 words

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

负载不均衡

# 检查权重配置
# 检查是否使用了正确的算法
# 查看访问日志分析

最佳实践

总结

Nginx 负载均衡是构建高可用 Web 架构的关键。通过合理配置负载均衡算法、健康检查和会话保持,可以实现高性能、高可用的服务架构。