AI导读:在基于Nginx+FRP架构中,出现通过代理访问天地图服务时的404错误。通过排查,发现问题源于多层代理、DNS解析异常及上游服务器配置问题。解决过程包括简化代理架构、优化DNS解析和超时设置、以及SSL连接优化。经验总结指出,应避免过多代理层级,使用动态DNS解析机制,并定期检查证书和DNS解析成功率。同时,建议采用标准化配置注释。最终,通过优化配置,成功解决了404错误,强调定期审计复杂网络架构的配置。
Nginx多层代理引发的DNS解析异常问题排查记录
错误背景
在基于Nginx+FRP的混合架构中,发现通过代理访问天地图服务时出现404
错误,具体表现为:
- 直接访问
http://example.com/
正常
- 访问地图路径
http://example.com/img_w/wmts?...
返回404
- 本地Nginx日志出现上游连接超时错误:
1 2 3 4 5 6 7 8 9
| connect() failed (10060) while connecting to upstream upstream: "http://192.0.2.1:80/img_w/wmts..."
## 问题分析
### 1. 多层代理架构缺陷 ```nginx # 原配置存在三层代理 客户端 → 前端Nginx → FRP → 本地Nginx → 本地代理集群 → 天地图服务
|
2. DNS解析固化
1 2 3 4 5
| server { listen 55100; proxy_pass http://t0.tianditu.com; }
|
3. 上游服务器配置异常
1 2 3 4
| upstream tdt_map_server_list { server 127.0.0.1:55100; }
|
4. 连接超时设置缺失
1 2 3
| proxy_connect_timeout 60s; proxy_read_timeout 180s;
|
解决过程
步骤1:简化代理架构
1 2 3 4 5 6 7 8 9 10
| # 修改前 location /img_w/ { proxy_pass http://tdt_map_server_list; }
# 修改后 location /img_w/ { proxy_pass https://t0.tianditu.com/img_w/; proxy_ssl_server_name on; }
|
步骤2:动态DNS解析
1 2 3 4
| http { resolver 223.5.5.5 8.8.8.8 valid=30s; resolver_timeout 5s; }
|
步骤3:超时参数优化
1 2 3
| proxy_connect_timeout 15s; proxy_read_timeout 30s; proxy_send_timeout 30s;
|
步骤4:SSL连接优化
1 2
| proxy_ssl_protocols TLSv1.2; proxy_ssl_ciphers HIGH:!aNULL:!MD5;
|
经验总结
代理层级规范
避免超过两层的代理转发,复杂代理链路会导致:
DNS解析机制
Nginx默认在启动时解析域名,应:
- 使用resolver指令强制动态解析
- 定期检查证书有效性
- 监控DNS解析成功率
配置注释规范
建议采用标准化注释:
1 2 3 4 5
| proxy_ssl_protocols TLSv1.2;
keepalive 32;
|
最终配置示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| http { resolver 223.5.5.5 valid=30s; location ~ ^/(img_w|vec_w)/ { proxy_pass https://t0.tianditu.com; proxy_ssl_server_name on; proxy_set_header Host t0.tianditu.com; proxy_set_header X-Real-IP $remote_addr; proxy_connect_timeout 15s; proxy_read_timeout 30s; proxy_cache map_cache; proxy_cache_valid 200 302 10m; } }
|
总结:通过简化代理架构、优化DNS解析机制、合理设置超时参数,最终解决多层代理导致的404错误。建议在复杂网络架构中定期进行配置审计。