Nginx 踩坑与进阶实战:从本地联调到反向代理核心原理¶
就是现在有一种是host 里面把原本要调试的本地的全部倒置 然后nginx把不用调试的再倒置回来 这里要有测试环境的域名 这里nginx监听ip是shen'm
然后还有一种就是nginx只是监听本地 nginx把前端以及不用调整的从本地ip映射到原本测试环境的ip 然后要调试的不变
太厉害了!你的总结非常精准,完全抓住了高级前端/后端联调的核心灵魂。
你描述的这两种方式,正是互联网大厂里最常用的两种“环境混合欺骗术”。我们把这两种流派分别叫做“域名劫持流”(你说的第一种)和“本地网关流”(你说的第二种)。
针对你第一种方式的提问,我为你进行深度拆解:
流派一:域名劫持流(利用 hosts + Nginx)¶
你描述的逻辑是:把测试环境的域名在 hosts 里强行指回本机(127.0.0.1),然后用 Nginx 接管,不需要调试的再踢回给真实的测试服务器。
👉 你的问题:这里 Nginx 监听的 IP 是什么?
答案: Nginx 监听的端口通常是 80(或 443),而 server_name 必须写测试环境的真实域名!
具体怎么做?
-
修改 hosts: 在
C:\Windows\System32\drivers\etc\hosts中加入:127.0.0.1 pms.test-env.com(假设这是你们的测试域名) -
Nginx 配置(核心陷阱注意):
Nginx
server {
listen 80; # 默认监听 80 端口
server_name pms.test-env.com; # 必须写测试域名
# 1. 调试的接口:留在本地
location /xzd/PMS/PCM/Contract/ {
proxy_pass http://127.0.0.1:4333/;
}
# 2. 不调试的接口/前端网页:踢回测试环境
location / {
# ⚠️ 致命警告:这里绝对不能写域名 proxy_pass http://pms.test-env.com;
# 必须写测试服务器的真实物理 IP!
proxy_pass http://192.168.8.192:80;
}
}
🔥 为什么不能写域名,必须写 IP?(避免死循环) 如果你在 location / 里写了转发给 http://pms.test-env.com,当 Nginx 准备发请求时,它也会去查你本机的 hosts 文件,发现这个域名指向 127.0.0.1,于是 Nginx 又把请求发给了自己……瞬间原地爆炸,无限死循环,直到报 502 Bad Gateway。所以必须用真实 IP打破循环。
流派二:本地网关流(纯 Nginx 中转)¶
这就是我们在上一段对话中帮你配好的那种方式,也是你描述的“nginx只是监听本地……要调试的不变”。
-
不碰
hosts,完全不影响电脑的其他网络功能。 -
浏览器直接访问
http://localhost:32073。 -
Nginx 配置:
Nginx
server {
listen 32073;
server_name localhost;
# 调试的接口:找本地
location /xzd/PMS/PCM/Contract/ { proxy_pass http://127.0.0.1:4333/; }
# 前端和不用调试的:找测试机 IP
location / { proxy_pass http://192.168.8.192:32073; }
}
👑 这两种方案,到底选哪个?¶
既然两种都能联调,它们的适用场景是什么?
| 对比维度 | 流派一:域名劫持流 (hosts + Nginx) |
流派二:本地网关流 (仅 Nginx) |
|---|---|---|
| 浏览器地址栏 | 显示的是真实的测试域名 pms.test-env.com |
显示的是本地地址 localhost:32073 |
| Cookie 兼容性 | 完美! 因为域名没变,测试环境种下的跨域 Cookie、单点登录(SSO) 全都不会失效。 | 偶尔有坑。 如果系统强制校验 Cookie 的域名,用 localhost 登录可能会疯狂掉线。 |
| 配置难度 | 较高(需改 hosts,且极其容易配置出死循环)。 | 极低(安全隔离,随开随关,最推荐)。 |
| 前端代码要求 | 前端代码里写死域名的也能正常拦截。 | 前端代码的请求必须用相对路径(如 /api/...)。 |
总结建议: 如果你目前的 “流派二(localhost 访问)” 能够正常登录、不掉线、页面也能刷出来,请坚决使用流派二,因为它最干净、最不容易干扰别人。 如果你们公司的系统安全级别很高,用 localhost 死活登不进去,或者 Cookie 一直丢失,那你再掏出 “流派一(hosts 域名劫持)” 这个终极武器!
listen(物理大门):决定 Nginx 在这台服务器上监听哪个端口。只要网络流量进了这个端口,Nginx 就接管了。
server_name(逻辑分流):决定“浏览器地址栏里输入的是什么网址”。它不是访问者的真实 IP!它是服务器的域名或 IP。
proxy_pass(单向电梯):真正的转发目的地。