Nginx反向代理配置,把请求转发到后端服务

前言

现在做后端开发,后端服务一般跑在 3000、8080 这种端口上,总不能让用户直接访问 IP:端口 吧?这时候就需要 Nginx 反向代理,把 80 端口的请求转发到后端服务。本文就讲一下 Nginx 反向代理的配置方法。

什么是反向代理

简单说,反向代理就是:

  • 用户访问 Nginx(80 端口)
  • Nginx 把请求转发给后端服务(比如 3000 端口)
  • 后端服务返回结果给 Nginx
  • Nginx 再返回给用户

用户不知道后端服务的存在,只跟 Nginx 打交道。

基本配置

最简单的反向代理

server {
    listen 80;
    server_name www.example.com;

    location / {
        proxy_pass http://127.0.0.1:3000;
    }
}

就这么简单,所有访问 www.example.com 的请求都会被转发到 http://127.0.0.1:3000。

检查并重载

nginx -t
systemctl reload nginx

常用配置项

proxy_pass 后端地址

proxy_pass http://127.0.0.1:3000;

后端服务的地址,可以是 IP 加端口,也可以是域名。

传递真实客户端 IP

默认情况下,后端服务看到的是 Nginx 的 IP,不是真实用户的 IP。需要加上几个请求头:

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

这样后端服务就能拿到真实用户的 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";
}

超时设置

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_connect_timeout 60s;
    proxy_read_timeout 60s;
    proxy_send_timeout 60s;
}

如果后端服务响应慢,可以把超时时间调大一点。

按路径分流

不同路径转发到不同后端服务:

server {
    listen 80;
    server_name www.example.com;

    location /api/ {
        proxy_pass http://127.0.0.1:3000;
    }

    location /admin/ {
        proxy_pass http://127.0.0.1:8080;
    }

    location / {
        root /var/www/html;
        index index.html;
    }
}

这样:

  • /api/ 开头的请求 → 3000 端口
  • /admin/ 开头的请求 → 8080 端口
  • 其他请求 → 静态文件

常见坑

坑1:502 Bad Gateway

访问报 502,说明 Nginx 连不上后端服务。

排查:

  1. 看后端服务有没有启动:curl http://127.0.0.1:3000
  2. 看后端服务监听的地址对不对,是不是只监听了 127.0.0.1
  3. 看防火墙有没有挡住

坑2:后端拿不到真实 IP

日志里全是 Nginx 的 IP,不是用户真实 IP。

解决: 加上那几个请求头:

proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

坑3:静态资源 404

前端是 Vue/React 这种单页应用,刷新页面就 404。

原因: Nginx 找不到对应的静态文件。

解决: 加个 try_files:

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

所有找不到的路径都返回 index.html,交给前端路由处理。

坑4:HTTPS 代理后端 HTTP

前端是 HTTPS,后端是 HTTP,浏览器报混合内容错误。

解决: 确保 Nginx 和后端之间是 HTTP 没问题,但要让后端知道原始请求是 HTTPS:

proxy_set_header X-Forwarded-Proto $scheme;

总结

Nginx 反向代理的核心就是 proxy_pass,把请求转发到后端服务。常用配置:

配置项 作用
proxy_pass 后端服务地址
proxy_set_header Host 传递域名
proxy_set_header X-Real-IP 传递真实 IP
proxy_set_header X-Forwarded-For 传递完整 IP 链
proxy_read_timeout 读取超时时间

反向代理是 Nginx 最常用的功能之一,做 Web 开发必备。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-10-5 07:55