一个域名建多个网站,网络优化器下载,只做同城交易的网站,山楼小院在哪家网站做宣传在最近的一次部署中#xff0c;我遇到一个奇怪的问题#xff1a;Go 程序在运行时不使用 /etc/resolv.conf 中的 DNS 设置#xff0c;导致服务无法正常访问域名。这篇文章记录下完整的排查过程和最终的解决方案。1. 问题现象我有一个部署在 KVM 虚拟机内的 Go 应用#xff0…在最近的一次部署中我遇到一个奇怪的问题Go 程序在运行时不使用 /etc/resolv.conf 中的 DNS 设置导致服务无法正常访问域名。这篇文章记录下完整的排查过程和最终的解决方案。
1. 问题现象我有一个部署在 KVM 虚拟机内的 Go 应用主要功能依赖某些内网域名解析如 api.service.internal。而在主机中使用 dig 和 curl 等命令都能正常解析但 Go 程序却报错类似如下
lookup api.service.internal on 127.0.0.53:53: server misbehaving
查看主机resolv.conf 文件内容如下
$ cat /etc/resolv.conf
options timeout:1 rotate
search dns.koudai.com host.idcvdian.com
nameserver 10.27.0.84
nameserver 10.27.0.126
这些配置本应该能保证正常解析才对。2. 初步怀疑Go DNS 解析逻辑Go 的 DNS 默认行为与传统 C 库不同。Go 在构建时是否启用 CGO 会直接影响其 DNS 解析逻辑构建方式DNS 实现使用 /etc/resolv.confCGO_ENABLED0Go 自带 DNS 实现只使用 127.0.0.1、Google DNS 等默认配置CGO_ENABLED1调用系统 libc遵循 /etc/nsswitch.conf 和 resolv.confGo 默认静态构建时不会使用系统的 resolv.conf 进行 DNS 解析而是使用 Go 内置的 DNS Resolver。3. 构建方式调整为了让 Go 程序在运行时读取主机的 /etc/resolv.conf 并使用正确的 DNS我尝试启用 CGO
CGO_ENABLED1 go build -o myapp main.go
注意启用 CGO_ENABLED1 后会变成动态链接依赖 libc 等系统库。此时执行 ldd 命令应能看到依赖
$ ldd ./myapplinux-vdso.so.1 (0x00007ffc6fdff000)libc.so.6 /lib64/libc.so.6 (0x00007f624af5a000)...
而如果是静态构建CGO_ENABLED0ldd 则会提示
$ ldd ./myappnot a dynamic executable
4. 报错找不到动态库由于我的 KVM 虚拟机是一个极简化系统尝试 CGO_ENABLED1 构建后运行程序提示找不到 libc.so.6 等依赖。解决方案
sudo yum groupinstall Development Tools
sudo yum install glibc-devel
安装过程较大可能需要几百 MB可以只安装gcc相关
sudo yum install -y gcc glibc-devel5. 最终构建命令模板
CGO_ENABLED1 \
GOOSlinux GOARCHamd64 \
go build -o ./bin/myapp main.go
6. 附加检测是否启用 CGO
go env CGO_ENABLED
输出 1 表示启用了 CGO