为什么需要反向代理?
很多站长都会遇到一个问题:一台服务器上跑了多个网站,但只有 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:客户端真实 IPX-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 运维来说,这是必修课。
评论