Nginx通过proxy_pass实现前后端分离接口转发,核心是location /api/ { proxy_pass http://127.0.0.1:8080/; }剥离前缀并配合必要代理头,确保路径正确、不404、不暴露内网。

用 Nginx 的 proxy_pass 实现前后端分离项目的接口转发,核心是让前端静态资源由 Nginx 直接服务,而所有 API 请求(比如以 /api/ 开头的)统一转发给后端服务,从而绕过浏览器跨域限制。关键不在“能不能转”,而在“怎么转才不丢路径、不报 404、不暴露内网地址”。
明确前后端职责划分
前端构建后的静态文件(HTML、JS、CSS)放在 Nginx 的 root 目录下,由 Nginx 直接响应;后端只专注提供接口,不处理页面渲染。Nginx 充当“守门人”,按 URL 路径决定该自己处理,还是转发给后端。
- 访问
/、/login、/assets/xxx.js→ Nginx 返回静态文件 - 访问
/api/users、/api/orders→ Nginx 转发到后端服务(如http://127.0.0.1:8080)
配置 location + proxy_pass 的路径规则
这是最容易出错的一环。是否加斜杠,直接决定路径怎么拼:
-
location /api/ { proxy_pass http://127.0.0.1:8080/; }:请求/api/v1/login→ 后端收到/v1/login(自动剥离/api/) -
location /api/ { proxy_pass http://127.0.0.1:8080; }:请求/api/v1/login→ 后端收到/api/v1/login(完整保留) - 推荐统一用第一种写法(
location和proxy_pass都带尾部斜杠),语义清晰,后端无需适配前缀
必须设置的代理头信息
否则后端可能拿不到真实 IP、误判协议、生成错误跳转地址:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
-
proxy_set_header Host $host;:把用户访问的原始域名传给后端,避免后端日志或重定向里出现127.0.0.1:8080 -
proxy_set_header X-Real-IP $remote_addr;:传递客户端真实 IP,不是 Nginx 自己的 IP -
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:支持多层代理时链路追踪 -
proxy_set_header X-Forwarded-Proto $scheme;:告诉后端当前是http还是https,影响安全头和跳转逻辑
完整可运行的 server 配置示例
假设前端打包目录为 /var/www/myapp,后端服务运行在本地 8080 端口:
server {
listen 80;
server_name your-domain.com;
<pre class="brush:php;toolbar:false;"># 静态资源:根路径及子路径全部由 Nginx 提供
location / {
root /var/www/myapp;
try_files $uri $uri/ /index.html;
}
# API 接口:转发到后端,自动剥离 /api/ 前缀
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_set_header X-Forwarded-Proto $scheme;
}}
配置完别忘了重载:sudo nginx -t && sudo systemctl reload nginx。

















