You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 09:16:15