Skip to content

Nginx 反向代理与负载均衡配置详解 ​

Nginx 是最流行的 Web 服务器和反向代理。无论是部署前后端分离项目、做负载均衡,还是配置 HTTPS,都绕不开它。

正向代理 vs 反向代理 ​

  • 正向代理:代理客户端(如 VPN),服务端不知道真正的客户端是谁
  • 反向代理:代理服务端(如 Nginx),客户端不知道真正的服务端是谁

基础反向代理 ​

最经典的场景:前端部署在 Nginx,API 请求代理到后端。

nginx
server {
    listen 80;
    server_name example.com;

    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }

    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_pass 的路径规则 ​

最容易搞错的地方——proxy_pass 末尾有没有 /,行为完全不同:

nginx
# 带 / :/api/users -> http://backend/users(去掉 /api 前缀)
location /api/ {
    proxy_pass http://backend/;
}

# 不带 / :/api/users -> http://backend/api/users(保留完整路径)
location /api/ {
    proxy_pass http://backend;
}

负载均衡 ​

加权轮询 ​

nginx
upstream backend {
    server 192.168.1.10:8080 weight=3;
    server 192.168.1.11:8080 weight=2;
    server 192.168.1.12:8080 weight=5;
}

IP 哈希(会话保持) ​

同一客户端 IP 始终路由到同一台后端:

nginx
upstream backend {
    ip_hash;
    server 192.168.1.10:8080;
    server 192.168.1.11:8080;
}

健康检查 ​

nginx
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;
}

HTTPS 配置 ​

使用 Let's Encrypt 免费证书 ​

bash
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com
sudo certbot renew --dry-run  # 测试自动续期

手动配置 SSL ​

nginx
server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;

    add_header Strict-Transport-Security "max-age=31536000" always;
    add_header X-Frame-Options SAMEORIGIN;

    location / {
        root /usr/share/nginx/html;
        try_files $uri $uri/ /index.html;
    }

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

缓存配置 ​

静态资源缓存 ​

nginx
location ~* \.(js|css|png|jpg|jpeg|gif|svg|woff2?)$ {
    root /usr/share/nginx/html;
    expires 30d;
    add_header Cache-Control "public, immutable";
}

location ~* \.html$ {
    root /usr/share/nginx/html;
    add_header Cache-Control "no-cache";
}

限流 ​

nginx
limit_req_zone $binary_remote_addr zone=api_limit:10m rate=10r/s;

server {
    location /api/ {
        limit_req zone=api_limit burst=20 nodelay;
        proxy_pass http://backend;
    }
}

常用运维命令 ​

bash
sudo nginx -t          # 测试配置语法
sudo nginx -s reload   # 热重载配置(不中断连接)
sudo nginx -s stop     # 停止
sudo nginx -T          # 打印完整配置

小结 ​

Nginx 反向代理的核心就是 location + proxy_pass。在此基础上加上负载均衡(upstream)、缓存(proxy_cache)、限流(limit_req)和 HTTPS,就能覆盖绝大多数生产环境的运维需求。

基于 VitePress 构建

总访问量 访客数