Next.js 14服务器端调用Apache部署的API请求超时故障排查
问题描述
在Next.js 14应用中调用另一台Apache服务器上的安全API时,出现TypeError: fetch failed和UND_ERR_CONNECT_TIMEOUT错误。本地测试请求完全正常,但部署到服务器后相同代码无法运行。
Next.js服务运行在localhost:3000,通过同一机器上的Nginx反向代理,配置如下:
server { listen [::]:80 default_server deferred; listen 80 default_server deferred; server_name example.com www.example.com; if ($host = www.example.com) { return 301 https://example.com$request_uri; } if ($host = example.com) { return 301 https://$host$request_uri; } return 404; } server { listen [::]:443 ssl http2; listen 443 ssl http2; server_name example.com www.example.com; root /var/www/html; location / { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_redirect off; } }
尝试过两种调用方式:一是从服务器组件请求路由处理程序,再由路由处理程序调用外部API;二是直接在服务器组件中调用外部API,代码如下:
const endpoint = "https://ws.apiprovider.com/api/v1/rest/pattern" const token = "*********" const data = { key1: 'some_string', key2: 'some_other_string' } const requestOptions = { method: "POST", body: JSON.stringify(data), headers: { "Content-Type": "application/json", token: token } } const res = await fetch(endpoint, requestOptions) const jsonRes = await res.json()
提供API的服务器已稳定运行许久,本地及Insomnia测试均正常,但服务器上使用wget或curl无法访问该API。已排查SELinux拒绝审计,临时关闭setenforce并禁用firewalld,问题仍存在。应用调用其他REST API均无异常,求其他排查方向。
排查方向
- 服务器网络出站限制:检查服务器是否有出站防火墙规则(比如云服务商的安全组、硬件防火墙),是否禁止了对目标API端口(443)的访问。部分云服务商默认可能限制特定出站流量,需要确认目标域名/IP在允许列表内。
- DNS解析问题:在服务器上执行
nslookup ws.apiprovider.com或dig ws.apiprovider.com,确认解析出的IP是否与本地一致。如果解析异常,可能是服务器DNS配置错误,尝试更换公共DNS(比如8.8.8.8)测试。 - 目标API的IP白名单限制:确认目标API服务器是否设置了IP白名单,仅允许特定IP访问。本地测试时用的是本地公网IP,而部署服务器的公网IP可能不在白名单内,需要联系API提供商添加。
- SSL证书验证问题:服务器上的根证书是否缺失,导致无法验证目标API的SSL证书。执行
curl -v https://ws.apiprovider.com查看SSL握手过程,是否有证书验证失败的提示。如果是,可以手动导入缺失的根证书,或者临时添加--insecure参数测试(仅用于排查,生产环境不建议)。 - 代理配置问题:服务器是否需要通过代理访问外部网络?检查环境变量
http_proxy、https_proxy是否配置正确。如果服务器处于内网,可能需要配置代理才能访问外部API,而本地环境不需要。 - 目标API的速率限制或限流策略:虽然API稳定运行,但部署服务器的IP可能触发了API的限流规则(比如首次访问被拦截、请求频率过高)。查看API提供商的文档,确认是否有相关限制,或者联系提供商排查该IP的访问日志。
- Next.js fetch的超时配置:默认fetch的超时时间可能较长,但服务器环境下网络延迟可能导致超时。尝试在fetch选项中添加
signal: AbortSignal.timeout(10000)(10秒超时),并捕获超时错误,确认是否是超时时间设置不合理。 - 服务器网络链路问题:执行
traceroute ws.apiprovider.com或mtr ws.apiprovider.com,查看网络链路是否有丢包或延迟过高的节点,定位网络瓶颈。 - 目标API的端口是否可达:在服务器上执行
telnet ws.apiprovider.com 443或nc -zv ws.apiprovider.com 443,确认443端口是否能正常连通。如果无法连通,说明网络层面存在阻断。
内容的提问来源于stack exchange,提问作者Phree
相关产品推荐
相关产品推荐

