为什么需要反向代理?

很多站长都会遇到一个问题:一台服务器上跑了多个网站,但只有 80 和 443 端口是公用的,怎么让不同域名访问到不同的网站?

这就是 Nginx 反向代理的核心用途——一个端口,分发多个服务

反向代理是什么?

简单说,Nginx 站在前面当"前台",根据访问的域名把请求转发到后面不同的程序。

用户 → Nginx (80/443) → 网站A (8081)
                        → 网站B (8082)
                        → API服务 (3000)

实际场景

假设你有一台服务器,上面跑了:

  • 一个 Typecho 博客(端口 8081)
  • 一个 Node.js 应用(端口 3000)
  • 一个静态文件站(目录 /var/www/static)

通过反向代理,三个服务都通过 80 端口对外,用户完全感知不到后面有多个端口。

基础配置示例

# 博客站点
server {
    listen 80;
    server_name blog.7ehl.com;
    
    location / {
        proxy_pass http://127.0.0.1:8081;
        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.7ehl.com;
    
    location / {
        proxy_pass http://127.0.0.1:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

几个关键配置说明

proxy_pass

将请求转发到后端服务地址。注意末尾带不带 / 会影响 URI 拼接:

  • proxy_pass http://127.0.0.1:8081; → 原始 URI 原样传递
  • proxy_pass http://127.0.0.1:8081/; → 匹配的路径会被替换

proxy_set_header

后端服务需要通过这些 header 获取真实客户端信息:

  • Host:原始请求的域名
  • X-Real-IP:客户端真实 IP
  • X-Forwarded-For:代理链上的所有 IP

如果不设这些,后端看到的永远是 127.0.0.1,日志和 IP 限制都会失效。

进阶:WebSocket 支持

如果你的应用用到 WebSocket(比如聊天、实时推送),需要额外配置:

location /ws {
    proxy_pass http://127.0.0.1:3000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

常见问题

Q:改了配置不生效?

nginx -t          # 检查配置语法
nginx -s reload   # 热重载配置

Q:502 Bad Gateway?

说明 Nginx 连不上后端服务。检查后端服务是否在运行、端口是否正确。

netstat -tlnp | grep 8081   # 检查端口是否在监听

Q:上传文件太大被拦截?

在 server 块里加上:

client_max_body_size 100m;

总结

反向代理是 Nginx 最核心的功能之一。掌握它,一台服务器就能优雅地承载多个服务,而且还能顺便做负载均衡、SSL 终端、缓存加速。对于 IDC 运维来说,这是必修课。