Nginx 反向代理与负载均衡:从配置到生产级部署

Nginx 是大多数 Web 架构的入口。用好反向代理和负载均衡,是运维的基本功。

一、反向代理基础

把请求转发给后端服务:

server {
    listen 80;
    server_name www.owai.cc;

    location /api/ {
        proxy_pass http://127.0.0.1:8080/;
        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;
    }

    location / {
        root /var/www/html;
        try_files $uri $uri/ /index.html;
    }
}

关键点:

  • `proxy_pass` 末尾有 `/` 时会替换 `location` 的路径前缀
  • `X-Real-IP` 让后端拿到真实客户端 IP
  • `try_files` 是 SPA 应用的标准配置

二、负载均衡策略

2.1 轮询(默认)

upstream backend {
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
    server 10.0.0.3:8080;
}

2.2 加权轮询

upstream backend {
    server 10.0.0.1:8080 weight=5;
    server 10.0.0.2:8080 weight=3;
    server 10.0.0.3:8080 weight=2;
}

2.3 IP Hash(会话保持)

upstream backend {
    ip_hash;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
}

同一客户端 IP 始终访问同一后端,适合有状态服务。

2.4 最少连接

upstream backend {
    least_conn;
    server 10.0.0.1:8080;
    server 10.0.0.2:8080;
}

请求发给当前连接数最少的后端。

三、健康检查

upstream backend {
    server 10.0.0.1:8080 max_fails=3 fail_timeout=30s;
    server 10.0.0.2:8080 max_fails=3 fail_timeout=30s;
    server 10.0.0.3:8080 backup;
}
  • `max_fails=3`:连续 3 次失败后标记为不可用
  • `fail_timeout=30s`:30 秒后重新尝试
  • `backup`:只有其他节点都不可用时才使用

四、HTTPS 配置

server {
    listen 443 ssl http2;
    server_name www.owai.cc;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    # HSTS
    add_header Strict-Transport-Security "max-age=31536000" always;

    location / {
        proxy_pass http://backend;
    }
}

# HTTP 跳转 HTTPS
server {
    listen 80;
    server_name www.owai.cc;
    return 301 https://$host$request_uri;
}

五、限流配置

# 定义限流区域
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://backend;
    }
}
  • `rate=10r/s`:每秒 10 个请求
  • `burst=20`:允许突发 20 个
  • `nodelay`:突发请求不排队,直接处理

六、缓存配置

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=1g;

server {
    location /static/ {
        proxy_cache my_cache;
        proxy_cache_valid 200 1h;
        proxy_cache_valid 404 1m;
        proxy_cache_use_stale error timeout updating;
        proxy_pass http://backend;
    }
}

七、常见问题排查

# 测试配置语法
nginx -t

# 查看错误日志
tail -f /var/log/nginx/error.log

# 平滑重载
nginx -s reload

# 查看连接状态
curl http://localhost/nginx_status

Nginx 的配置看起来简单,但每一行都有讲究。生产环境的 Nginx 配置,应该经过压力测试和安全审查后再上线。