求助:Nginx始终将请求发至本地Apache而非配置的上游服务器
首先,咱们先拆解下你遇到的问题核心:同一服务器上跑着NGINX(80端口)和Apache(81端口),NGINX已经配置了www.example.com反向代理到外部上游服务器,但启动Apache后,所有请求都被转到本地81端口的Apache,停止Apache后又恢复正常。这种情况大概率是DNS解析冲突或者NGINX配置中隐藏的转发规则导致的,下面一步步排查和解决:
第一步:先定位问题根源
1. 检查DNS解析结果
在启动Apache前后,分别执行命令查看www.example.com的解析结果:
- Linux/macOS:
dig www.example.com或nslookup www.example.com - Windows:
ping www.example.com或nslookup www.example.com
如果启动Apache后,解析结果变成了127.0.0.1(本地回环地址),那就是本地DNS解析被干扰了——这会让NGINX把原本要发往外部服务器的请求,错误地发到本地。
2. 查看NGINX日志确认转发目标
打开NGINX的访问日志(通常是/var/log/nginx/access.log),查看upstream_addr字段,看看请求实际被转发到了哪个地址。如果日志里显示127.0.0.1:81,那就能实锤NGINX确实把请求发到了本地Apache。
3. 排查Apache的默认配置
虽然你说Apache没配置www.example.com,但还是要检查下Apache的虚拟主机配置:如果有<VirtualHost *:81>这样的默认配置,它会接收所有发往81端口的请求,哪怕没有匹配到具体域名,这也会导致你看到的报错。
第二步:针对性解决问题
方案1:强制NGINX使用固定IP绕过DNS解析
如果你的外部上游服务器IP是固定的,直接把NGINX upstream配置里的域名换成实际IP,这样就完全避免了DNS解析的干扰:
upstream my_external_server { server 192.168.1.100; # 替换成你的外部服务器真实IP } server { listen 80; server_name www.example.com; location / { proxy_pass http://my_external_server; # 其他proxy相关配置(比如proxy_set_header)保持不变 } }
方案2:指定NGINX使用可靠的DNS服务器
如果必须用域名(比如外部服务器IP会动态变化),可以在upstream中配置resolve参数,让NGINX使用公共DNS来解析域名,避开本地解析的干扰:
upstream my_external_server { server external-server.example.com; resolve 8.8.8.8 8.8.4.4 valid=300s; # 使用Google公共DNS,每5分钟重新解析一次 } server { listen 80; server_name www.example.com; location / { proxy_pass http://my_external_server; proxy_set_header Host $host; # 其他必要的proxy配置 } }
方案3:清理本地DNS解析干扰
- 检查系统hosts文件:Linux/macOS是
/etc/hosts,Windows是C:\Windows\System32\drivers\etc\hosts,确保没有把www.example.com指向127.0.0.1的条目,有就删掉。 - 刷新DNS缓存:Linux执行
systemctl restart systemd-resolved,Windows执行ipconfig /flushdns。
方案4:排查NGINX隐藏的转发规则
检查NGINX的所有配置文件(包括include引入的子配置),看看有没有类似下面的意外转发规则:
# 比如这种 fallback 规则会在文件不存在时转发到本地81 location @fallback { proxy_pass http://localhost:81; }
如果有这类规则,要么删除,要么调整逻辑,避免误触发。
最后验证
修改配置后,先执行nginx -t检查配置语法是否正确,然后重启NGINX:systemctl restart nginx(Linux),再启动Apache测试,看看请求是否正常转发到外部服务器。
内容的提问来源于stack exchange,提问作者Robvk

