如何解决SocketError:无法打开TCP连接(域名解析临时失败)
问题排查:Ubuntu 18.04服务器偶发DNS解析失败SocketError
问题描述
运行Ubuntu 18.04 LTS的生产应用服务器(app_server)访问主域名下任意端点时,偶发SocketError:
Failed to open TCP connection to kong_server:xxxx (getaddrinfo: Temporary failure in name resolution)
- 现象:访问结果不稳定,有时正常有时报错,无固定规律
- 环境对比:运行Ubuntu 16.04.7 LTS的预发布环境无此问题
- 架构信息:使用Kong 2.0.1(容器部署在CentOS 7.9.2009的kong_server)作为API网关,所有服务器处于同一私有网络,共用同一私有DNS服务器
已完成的排查动作
- 绕过NGINX Proxy Server直接访问
kong_server:xxxx,问题依旧 - 2022年12月16日更新:跳过Kong直接调用后端端点,仍出现相同错误,怀疑问题可能出在HTTParty配置或版本上
排查建议与解决方案
1. 监控DNS解析稳定性
在app_server上持续执行DNS查询命令,捕捉解析失败的时间点:
# 用nslookup监控解析结果 while true; do nslookup kong_server; sleep 1; done # 用dig查看更详细的解析过程 while true; do dig kong_server +short; sleep 1; done
同时查看私有DNS服务器的日志,确认是否是DNS服务端偶发故障导致解析失败。
2. 检查Ubuntu 18.04的DNS缓存服务
Ubuntu 18.04默认使用systemd-resolved作为DNS缓存,可能存在缓存异常:
- 查看当前DNS服务状态:
systemd-resolve --status - 清空DNS缓存:
sudo systemd-resolve --flush-caches - 对比预发布环境(Ubuntu 16.04可能使用
dnsmasq)的DNS配置,重点检查超时、重试次数等参数差异。
3. 排查HTTParty的配置与版本
- 确认HTTParty版本,对比预发布环境的版本差异:
puts HTTParty::VERSION - 检查HTTParty的全局配置,重点关注连接超时、DNS相关设置:
HTTParty.configure do |config| config.timeout = 10 config.open_timeout = 2 # 若存在自定义DNS解析逻辑,检查是否有逻辑缺陷 end - 临时更换为其他HTTP客户端(如Faraday)测试,确认是否是HTTParty本身的问题。
4. 调整系统网络参数
- 检查
/etc/resolv.conf,确认DNS服务器地址正确,可添加备用DNS作为 fallback:cat /etc/resolv.conf - 修改
systemd-resolved配置,调整DNS超时和重试参数(编辑/etc/systemd/resolved.conf):
修改后重启服务:[Resolve] DNS=私有DNS服务器IP FallbackDNS=8.8.8.8 8.8.4.4 TimeoutSec=2 DNSRetry=3sudo systemctl restart systemd-resolved
5. 应用层添加重试逻辑
在找到根本原因前,可在代码中添加解析失败的重试机制,降低业务影响:
def call_api(url) retry_count = 3 begin HTTParty.get(url) rescue SocketError => e retry_count -= 1 retry if retry_count > 0 raise e end end
内容的提问来源于stack exchange,提问作者Benediktus Aditya
相关产品推荐
相关产品推荐

