Nginx端口转发实现本地多环境测试虚拟主机,核心是通过hosts绑定域名到127.0.0.1,并为每个域名配置独立server块,用proxy_pass转发至对应本地端口(如dev.local→3000),配合HTTPS进阶可提升开发一致性。

用Nginx端口转发搭本地多环境测试虚拟主机,核心是让不同域名(如 dev.local、test.local)指向本机上运行在不同端口的服务(如 3000、5000、8080),无需改代码、不暴露端口,浏览器直接输域名就能访问对应环境。
一、本地域名解析必须先配好
这是前提,否则浏览器根本不知道 dev.local 指向哪台机器。
- 编辑系统 hosts 文件:
Linux/macOS:/etc/hosts
Windows:C:\Windows\System32\drivers\etc\hosts - 添加几行映射,全部指向本机(127.0.0.1):
127.0.0.1 dev.local127.0.0.1 test.local127.0.0.1 api.local - 保存后,在终端执行
ping dev.local,能通即生效;Windows 还建议执行ipconfig /flushdns清缓存
二、按域名写独立的 server 块配置
不要全堆在 nginx.conf 里,推荐拆成多个文件,放在 /etc/nginx/conf.d/ 下,比如:
-
dev.local.conf→ 转发到localhost:3000(前端开发服务) -
test.local.conf→ 转发到localhost:5000(后端测试 API) -
api.local.conf→ 转发到localhost:8080(Java Spring Boot)
每个配置示例(以 dev.local 为例):
server {
listen 80;
server_name dev.local;
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 后面不能带结尾斜杠(/),否则路径会被重写;如果后端服务本身有子路径(如 /admin),需配合 rewrite 或调整 location 规则。
三、验证与排错关键点
配置完别急着刷新浏览器,按顺序检查:
- 确认各后端服务已在对应端口运行:
curl -I http://localhost:3000应返回 200 - 检查 Nginx 配置语法:
sudo nginx -t,提示 “syntax is ok” 才安全 - 重载配置:
sudo nginx -s reload(不是 restart) - 查日志定位问题:
tail -f /var/log/nginx/error.log,常见错误包括:端口被占、域名没匹配上、proxy_pass 地址不可达 - 防火墙通常不影响本地回环(127.0.0.1),但若用了 Docker 容器或远程调试,需确认容器网络是否允许 host 网络通信
四、进阶建议:加 HTTPS 和统一入口
开发环境虽可只用 HTTP,但某些功能(如 Service Worker、地理位置)强制要求 HTTPS。可用 mkcert 快速生成本地可信证书:
- 安装 mkcert 并生成证书:
mkcert dev.local test.local api.local - 在 server 块中启用 HTTPS:
listen 443 ssl;ssl_certificate /path/to/dev.local.pem;ssl_certificate_key /path/to/dev.local-key.pem; - 再加一个 80 端口 server 块做自动跳转:
return 301 https://$host$request_uri;
这样所有环境都走 HTTPS,和生产更一致,也避免浏览器警告干扰测试。


















