Nginx通过外部域名反向代理至同一机器时随机出现超时错误
Nginx通过外部域名反向代理至同一机器时随机出现超时错误
看起来你遇到的是同一服务器上多域名(一个走Cloudflare代理、一个直连)反向代理时的随机超时问题,先帮你梳理下当前的配置场景,再分析可能的原因和解决办法:
Disclaimer: 我已经在Cloudflare论坛问过这个问题,但深入排查后发现这更像是Nginx的问题。
当前域名DNS配置情况
example.com(已启用Cloudflare代理)
| 记录类型 | 名称 | 内容 | 是否代理 |
|---|---|---|---|
| A | example.com | 12.34.56.78 | 是 |
| A | * | 12.34.56.78 | 是 |
app1.com(未启用Cloudflare代理)
| 记录类型 | 名称 | 内容 |
|---|---|---|
| A | app1.com | 12.34.56.78 |
| A | www.app1.com | 12.34.56.78 |
可能的问题根源
- 本地DNS解析环路冲突:当Nginx反向代理app1.com时,如果配置里直接用域名
app1.com,服务器会通过DNS解析到公网IP 12.34.56.78,然后请求自己的公网接口——这种本地环路请求很容易和Cloudflare过来的代理请求抢占服务器的网络连接资源,导致随机超时。 - Cloudflare与直连流量的路由干扰:Cloudflare的流量是从CF节点转发到你的服务器,而app1.com的流量是用户直接访问你的公网IP。如果服务器的防火墙、路由表没有做好流量区分,可能会出现连接在网络栈层面的混乱,引发随机的连接超时。
- Nginx连接池资源不足:如果Nginx的连接数上限、keepalive配置不够合理,当两个域名的请求同时涌入时,连接池耗尽就会导致部分请求超时。
针对性解决办法
1. 绕过公网DNS,直接本地访问app1
最直接的办法是修改Nginx反向代理配置,不用域名,直接指向服务器的回环地址或内网IP,彻底避免本地环路问题:
server { listen 80; server_name example.com; # 假设是在example.com下反向代理app1 location /app1/ { proxy_pass http://127.0.0.1:XXXX; # 替换成app1实际监听的端口 proxy_set_header Host app1.com; # 保持app1的Host头,避免后端识别错误 proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 开启keepalive优化连接复用 proxy_http_version 1.1; proxy_set_header Connection ""; } }
如果业务必须用域名访问,可以在服务器的/etc/hosts里加一条强制解析:
127.0.0.1 app1.com www.app1.com
2. 隔离Cloudflare与直连流量的Nginx配置
给example.com的server块添加IP白名单,只接受Cloudflare节点的请求,避免无关流量干扰:
server { listen 80; server_name example.com *.example.com; # 只允许Cloudflare官方IP段访问,需要补充完整的CF IP列表 allow 173.245.48.0/20; allow 103.21.244.0/22; allow 103.22.200.0/22; allow 103.31.4.0/22; allow 141.101.64.0/18; allow 108.162.192.0/18; allow 190.93.240.0/20; allow 188.114.96.0/20; allow 197.234.240.0/22; allow 198.41.128.0/17; allow 162.158.0.0/15; allow 104.16.0.0/13; allow 104.24.0.0/14; allow 172.64.0.0/13; allow 131.0.72.0/22; deny all; # 其余业务配置... }
3. 优化Nginx连接资源配置
调整Nginx全局配置,提升连接处理能力,避免因资源耗尽导致超时:
# nginx.conf 全局段 worker_processes auto; # 自动匹配CPU核心数 worker_connections 10240; # 增大单worker的连接上限 multi_accept on; # 允许worker进程一次性接受所有新连接 http { keepalive_timeout 65; keepalive_requests 1000; # 单个keepalive连接可处理的请求数 sendfile on; tcp_nopush on; tcp_nodelay on; # 反向代理的通用优化 proxy_connect_timeout 30s; proxy_send_timeout 30s; proxy_read_timeout 30s; proxy_http_version 1.1; proxy_set_header Connection ""; }
4. 排查服务器网络层面问题
- 用
iptables -L或防火墙管理工具检查规则,确保没有随机拦截连接的情况; - 用
tcpdump host app1.com and port 80抓包,观察超时发生时的连接状态,看是否有丢包、RST包等异常; - 检查服务器的路由表(
route -n),确认没有针对12.34.56.78的冲突路由规则。
备注:内容来源于stack exchange,提问作者Roko
相关产品推荐
相关产品推荐

