Nginx 启动时会强制解析 proxy_pass 后的静态域名,若 DNS 不可达或域名无效则报错失败;必须用变量(如 set $backend "api.example.com"; proxy_pass http://$backend;)绕过启动解析,并确保 resolver 正确配置。

直接在 proxy_pass 后写域名(如 proxy_pass http://api.example.com;),Nginx 会在启动或重载时强制解析该域名。一旦 DNS 不可达、域名不存在,或客户环境无公网(比如内网隔离场景),就会报 resolver failed 或 host not found 类错误,导致服务根本起不来。排查要从“启动阶段行为”切入,而不是等请求进来再查。
看 nginx -t 报错的具体内容
执行 nginx -t 是最快定位方式。若配置含静态域名,错误通常出现在这一环节:
- 常见报错示例:
host not found in upstream "api.example.com" in /etc/nginx/conf.d/app.conf:12 - 或更底层的:
resolving "api.example.com" failed、getaddrinfo() failed - 注意行号——它指向的是
proxy_pass所在行,不是 resolver 行
确认是否用了变量绕过启动解析
只要 proxy_pass 值是字面量(即不带 $ 的纯域名),就一定会触发启动期 DNS 查询。必须改成变量形式才能跳过:
⚠️ 已弃用 — 该技能已拆分为两个独立技能,以提升模块化程度:**webchat-https-proxy**(HTTPS/WSS 反向代理)和 **webchat-voi...**
- ✅ 正确:
set $backend "api.example.com"; proxy_pass http://$backend; - ❌ 错误:
set $backend "api.example.com"; proxy_pass http://api.example.com;(变量没用上) - ❌ 错误:
proxy_pass http://$backend$request_uri;但$backend为空或未定义
检查 resolver 是否存在且位置正确
变量只是开关,resolver 才是 DNS 解析器。但它不能随便放:
- 旧版本 Nginx(http 块顶层的
resolver,必须放在server或location块内,且与proxy_pass在同一作用域 - 推荐写法:
location /api { resolver 114.114.114.114 valid=30s; set $backend "api.example.com"; proxy_pass http://$backend; } - 如果写了
resolver却仍在启动时报错,大概率是它没生效——比如被写在了别的server块里,或语法有空格/分号缺失
验证客户环境 DNS 可达性
to B 场景下,客户内网往往禁公网、无外部 DNS。此时:
- 别依赖系统
/etc/resolv.conf;resolver必须显式指定客户可用的 DNS 地址(如内网 DNS 服务器 IP) - 可在客户机器上手动测试:
nslookup api.example.com 114.114.114.114,确认该 DNS 能通且能返回结果 - 若客户 DNS 只支持 TCP 或需特定端口,Nginx 默认只走 UDP 53,可能失败——此时需评估是否改用
upstream+ 固定 IP/Service 名方案










