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

部署在EC2的Next.js应用调用HTTPS API间歇性出现EAI_AGAIN错误

Next.js服务端API调用间歇性DNS解析失败问题排查与解决

问题背景

你在EC2(Amazon Linux/Ubuntu)上部署的Next.js前端,服务端generateMetadata函数通过axios调用后端API(https://api.myapp.com)时,间歇性出现getaddrinfo EAI_AGAIN api.myapp.com错误,但以下场景均正常:

  • 浏览器/Postman访问API正常返回结果
  • 本地运行Next.js时,SSR阶段的axios调用能成功执行
  • EC2实例上用curl调用API可正常获取JSON响应
  • nslookup api.myapp.com能解析到预期IP(仅Server字段显示Unknown)

可能原因及修复方案

1. Node.js DNS缓存与系统DNS逻辑不兼容

Node.js的DNS缓存策略和系统DNS存在差异,当后端域名的TTL设置较短时,Node.js可能提前失效缓存,引发解析请求拥堵失败。

  • 修复操作:启动Node.js时强制指定可靠的DNS服务器(比如AWS VPC内置DNS或Google公共DNS):
    node --dns-servers 10.0.0.2,8.8.8.8 server.js
    
    或在代码中强制优先解析IPv4,避免IPv6解析异常导致的重试延迟:
    const dns = require('dns');
    dns.setDefaultResultOrder('ipv4first');
    

2. EC2实例DNS配置不稳定

虽然nslookup能正常解析,但Node.js读取的/etc/resolv.conf可能配置了不可靠的DNS服务器,导致间歇性解析失败。

  • 修复操作:编辑/etc/resolv.conf文件,添加稳定的DNS服务器:
    echo "nameserver 10.0.0.2" | sudo tee -a /etc/resolv.conf
    echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
    
    随后重启网络服务:
    • Ubuntu系统:sudo systemctl restart systemd-resolved
    • Amazon Linux系统:sudo systemctl restart network

3. axios无超时重试机制

axios默认超时时间较短,且未配置重试逻辑,遇到DNS解析延迟就直接触发报错。

  • 修复操作:创建带有超时和重试逻辑的axios实例:
    const axios = require('axios');
    const axiosInstance = axios.create({
      timeout: 10000, // 延长超时时间到10秒
      retry: 3, // 最多重试3次
      retryDelay: (count) => count * 1000 // 每次重试间隔1秒
    });
    
    // 响应拦截器实现重试逻辑
    axiosInstance.interceptors.response.use(
      res => res,
      err => {
        const config = err.config;
        if (!config || !config.retry) return Promise.reject(err);
        config.__retryCount = config.__retryCount || 0;
        if (config.__retryCount >= config.retry) return Promise.reject(err);
        config.__retryCount++;
        return new Promise(resolve => {
          setTimeout(() => resolve(axiosInstance(config)), config.retryDelay(config.__retryCount));
        });
      }
    );
    
    // 使用配置好的实例调用API
    const response = await axiosInstance.get(`https://api.myapp.com/api/v1/appointment/${urlId}`);
    

4. 系统DNS缓存不一致

系统DNS缓存可能存在过期或刷新不及时的情况,而Node.js有时会绕过系统缓存直接发起DNS请求,导致解析结果不一致。

  • 修复操作:手动刷新系统DNS缓存:
    • Ubuntu系统:sudo systemd-resolve --flush-caches
    • Amazon Linux系统:先安装nscd服务sudo yum install nscd,再执行sudo service nscd restart

5. 网络安全组/NACL限制

EC2安全组或VPC NACL可能限制了DNS请求(UDP/TCP 53端口)的出站流量,导致间歇性解析失败。

  • 修复操作:检查EC2安全组的出站规则,确保允许到0.0.0.0/0的UDP 53和TCP 53流量;同时检查VPC NACL的出站规则,确认相同端口的流量被允许通过。

内容的提问来源于stack exchange,提问作者Ashish Rautela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 13:40:19