Nginx反向代理与负载均衡实战配置指南

文章最后更新时间:2026-04-13 16:31:22

Nginx是世界上最流行的Web服务器之一,它不仅可以作为静态文件服务器,还广泛应用于反向代理、负载均衡、API网关等场景。本文详细介绍Nginx反向代理和负载均衡的配置方法。

一、Nginx基础概念

什么是正向代理?

正向代理代表客户端向服务器发起请求。客户端知道目标服务器,但服务器不知道真实客户端是谁(服务器只知道代理服务器的存在)。翻墙软件就是典型的正向代理。

什么是反向代理?

反向代理代表服务器接收客户端请求。客户端不知道真实服务器是谁(只知道代理服务器的地址)。用户访问网站的80端口,实际上可能被代理到内网任意一台服务器。

反向代理的优势:

  • 隐藏真实服务器,提高安全性
  • 统一入口,方便做HTTPS、SSL证书配置
  • 后端服务器可以随时扩容或更换,不影响客户端
  • 可以缓存静态内容,减轻后端压力
  • 可以做负载均衡分发流量

二、反向代理配置

最简单的反向代理配置,将所有请求转发到另一台服务器:

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
        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_pass:指定后端服务地址
  • Host $host:传递原始请求的域名
  • X-Real-IP:传递客户端真实IP地址(后端程序可以看到真实IP)
  • X-Forwarded-For:传递完整请求链路IP(防止IP伪造)
  • X-Forwarded-Proto:传递原始协议(http/https)

三、负载均衡配置

当一台服务器不够用时,可以用Nginx做负载均衡,将请求分发到多台后端服务器。

1. 轮询(Round Robin)——默认策略

upstream backend {
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
    server 192.168.1.12:3000;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

2. 加权轮询(Weighted Round Robin)

upstream backend {
    server 192.168.1.10:3000 weight=3;
    server 192.168.1.11:3000 weight=2;
    server 192.168.1.12:3000 weight=1;
}

服务器性能不同:性能强的多分配请求。weight值越大,分配到的请求越多。

3. IP哈希(IP Hash)

upstream backend {
    ip_hash;
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
    server 192.168.1.12:3000;
}

同一个IP的请求,始终转发到同一台后端服务器。适用于需要会话保持的场景。

4. 最少连接(Least Connections)

upstream backend {
    least_conn;
    server 192.168.1.10:3000;
    server 192.168.1.11:3000;
}

新请求分配给当前连接数最少的服务器,适用于长连接业务(如WebSocket)。

四、健康检查与故障转移

当某台后端服务器宕机时,Nginx会自动将流量切换到健康的服务器。

upstream backend {
    server 192.168.1.10:3000 max_fails=3 fail_timeout=30s;
    server 192.168.1.11:3000 max_fails=3 fail_timeout=30s;
    server 192.168.1.12:3000 max_fails=3 fail_timeout=30s;
}
  • max_fails=3:连续3次连接失败,标记为不可用
  • fail_timeout=30s:30秒后重新尝试连接

五、HTTPS反向代理配置

server {
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /etc/ssl/certs/example.com.crt;
    ssl_certificate_key /etc/ssl/private/example.com.key;

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

server {
    listen 80;
    server_name example.com;
    return 301 https://$server_name$request_uri;
}

外网用HTTPS加密传输,内部转发到后端HTTP服务,安全又高效。

六、常用场景配置示例

场景1:代理多个不同域名的后端服务

server {
    listen 80;
    server_name api.example.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
    }
}

server {
    listen 80;
    server_name web.example.com;
    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

server {
    listen 80;
    server_name admin.example.com;
    location / {
        proxy_pass http://127.0.0.1:9000;
    }
}

场景2:代理API接口并设置超时

location /api/ {
    proxy_pass http://backend;
    proxy_connect_timeout 10s;
    proxy_read_timeout 60s;
    proxy_send_timeout 30s;
    proxy_set_header Host $host;
}

场景3:静态文件本地缓存,反向代理API

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

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

七、Nginx常用命令

nginx -t          # 测试配置文件语法
nginx -s reload   # 平滑重载配置(不断开现有连接)
nginx -s reopen   # 重新打开日志文件
nginx -s stop     # 快速停止
nginx -s quit     # 优雅停止(等待现有请求处理完)
nginx             # 启动

八、常见问题

Q:proxy_pass 后面加不加斜杠有什么区别?
A:location /A { proxy_pass http://backend; } 会保留 /A,即请求 /A/B 变成 http://backend/A/B。如果 proxy_pass http://backend/ 则去掉 /A,请求 /A/B 变成 http://backend/B。

Q:后端获取不到真实IP怎么办?
A:确保在 Nginx 配置了 proxy_set_header X-Real-IP $remote_addr; 后端程序通过读取 HTTP 头部的 X-Real-IP 字段获取真实IP。

Q:如何查看 Nginx 正在转发哪些请求?
A:查看 access.log 日志,默认在 /var/log/nginx/access.log。开启详细日志可以看到每次请求的来源和目标。

Q:Nginx 能代理 websocket 吗?
A:可以。需要额外配置:proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection “upgrade”; 否则 websocket 连接会在一段时间后断开。

总结

Nginx反向代理和负载均衡是搭建高可用系统的基础技能。核心配置:proxy_pass 转发请求、upstream 定义后端服务器池、不同策略(轮询/加权/ip_hash/最少连接)适应不同场景、health check 自动故障转移。掌握这些配置,就能搭建起稳定、高效的Web架构。

瀚煜云提供服务器托管及Nginx高可用架构部署技术支持。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容