跳转至

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 必须写测试环境的真实域名

具体怎么做?

  1. 修改 hosts: 在 C:\Windows\System32\drivers\etc\hosts 中加入: 127.0.0.1 pms.test-env.com (假设这是你们的测试域名)

  2. 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只是监听本地……要调试的不变”。

  1. 不碰 hosts,完全不影响电脑的其他网络功能。

  2. 浏览器直接访问 http://localhost:32073

  3. 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(单向电梯):真正的转发目的地。

回到页面顶部