DNS刷新后Java服务启动报java.net.SocketException: Unresolved address求助
从你提供的错误日志和控制台信息来看,核心问题很明确:Jetty服务器启动时尝试绑定到app.domain.com:8081,但无法解析该域名对应的IP地址,进而抛出java.net.SocketException: Unresolved address错误。Apache等服务能恢复,是因为它们大概率绑定的是0.0.0.0(监听所有网卡)或已提前解析好的IP,而Java服务器是在启动阶段实时解析域名,所以受DNS异常的影响更直接。
下面是具体的排查和解决步骤:
1. 先验证本地域名解析是否正常
在服务器上执行以下命令,确认app.domain.com能否正确解析到你设置的目标IP:
# 查看域名解析结果 nslookup app.domain.com # 或者用ping测试解析(按Ctrl+C停止) ping app.domain.com
如果解析结果不是正确IP,或者提示无法解析,说明本地DNS缓存还存着旧记录,需要清理:
- Windows系统:打开命令提示符执行
ipconfig /flushdns - Linux/macOS系统:
# Linux(systemd环境) sudo systemd-resolve --flush-caches # macOS sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
2. 修改Java服务器的绑定地址配置
如果域名解析一时无法完全同步,可以先绕开域名解析,直接绑定到IP:
找到你的Jetty配置文件(比如jetty.xml)或应用自定义的配置项,把绑定地址从app.domain.com改成服务器的具体IP或者0.0.0.0(0.0.0.0表示监听所有网卡):
<!-- 原配置 --> <Set name="host">app.domain.com</Set> <!-- 修改后:绑定到所有网卡 --> <Set name="host">0.0.0.0</Set> <!-- 或者绑定到服务器的内网/公网IP --> <Set name="host">192.168.1.100</Set>
这样服务器启动时不需要依赖域名解析,直接绑定IP就能正常运行,后续DNS完全同步后再改回域名也没问题。
3. 检查本地hosts文件是否有冲突
有时候本地hosts文件的旧条目会覆盖DNS解析结果,检查以下路径的文件:
- Linux/macOS:
/etc/hosts - Windows:
C:\Windows\System32\drivers\etc\hosts
如果里面有app.domain.com的条目,确认对应的IP是最新的正确地址,若不正确就修改或删除该条目,保存后重新测试解析。
4. 重启网络服务(可选)
如果清理缓存后解析还是异常,可以尝试重启服务器的网络服务,确保新的DNS配置生效:
- Linux:
sudo systemctl restart network # 或者针对systemd-resolved服务 sudo systemctl restart systemd-resolved - Windows:在控制面板找到对应网卡,禁用后重新启用。
5. 等待DNS全局同步(兜底)
虽然Apache已经恢复,但DNS更新存在延迟(取决于域名记录的TTL值),如果以上步骤都无效,可以等待10分钟到几小时,让DNS记录在全球节点同步完成后再尝试启动服务器。
内容的提问来源于stack exchange,提问作者DN0300

