使用Traefik+Let's Encrypt遇DNS问题:查询example.com的A记录时出现NXDOMAIN
解决Traefik ACME HTTP挑战的NXDOMAIN问题
我之前在Docker Swarm+Traefik的环境里也碰到过几乎一模一样的DNS问题,给你梳理几个关键排查步骤,应该能定位到原因:
1. 先确认DNS记录真的生效了(别忽略DNS缓存!)
NXDOMAIN本质是域名解析不到任何记录,所以先排除DNS本身的问题:
- 用公共DNS服务器直接查询,避免本地缓存干扰:
确保返回的A记录是你Swarm集群的公网IP(如果是多节点集群,应该指向集群的负载均衡IP,比如DigitalOcean的负载均衡器)。dig example.com @8.8.8.8 dig www.example.com @8.8.8.8 - 用
dig example.com +trace跟踪解析链路,确认从根域到权威DNS(DigitalOcean的DNS服务器)都返回了正确的A记录。 - 别忘了DNS有TTL缓存,刚修改的记录可能需要5-10分钟甚至更久才能全球同步,别刚改完就测试。
2. 检查Traefik的HTTP入口点是否正确暴露
ACME HTTP挑战需要Let's Encrypt能访问到你Traefik的80端口,所以要确保:
- 在Traefik的Swarm服务配置里,80端口已经正确绑定到主机:
services: traefik: ports: - "80:80" - "443:443" # 如果用Swarm路由网格,确保mode是ingress(默认),且节点的80端口没被防火墙挡住 - 你的服务器防火墙(比如ufw、iptables)已经开放80和443端口,DigitalOcean的防火墙规则也要允许这两个端口的入站流量。
3. 核对Traefik的ACME配置细节
确保你的toml配置里,HTTP挑战和入口点的关联是正确的:
[entryPoints] [entryPoints.http] address = ":80" # 必须监听80端口 [entryPoints.https] address = ":443" [acme] email = "your-email@example.com" storage = "/acme.json" entryPoint = "https" [acme.httpChallenge] entryPoint = "http" # 这里必须指向刚才的HTTP入口点,不能写错!
如果用了自定义证书解析器(resolver),还要确保路由规则里关联了这个解析器:
# 你的业务服务labels里要加 labels: - "traefik.http.routers.my-service.rule=Host(`example.com`) || Host(`www.example.com`)" - "traefik.http.routers.my-service.tls=true" - "traefik.http.routers.my-service.tls.certresolver=default" # 和acme配置对应
4. 检查Swarm网络和服务可达性
- 确保你的业务服务和Traefik服务在同一个overlay网络里,不然Traefik无法转发请求到业务服务(不过这个主要影响正常访问,挑战阶段可能先看80端口是否能访问)。
- 直接用公网IP访问
http://<你的公网IP>/.well-known/acme-challenge/,看看Traefik是否返回404(正常,因为还没生成挑战文件),如果返回连接超时,说明80端口根本没对外开放。
5. 查看Traefik日志找细节
最后,一定要看Traefik的服务日志,里面有最准确的错误信息:
docker service logs -f traefik # 替换成你的Traefik服务名
日志里会显示ACME挑战的完整流程,比如是Let's Encrypt无法解析你的域名,还是挑战请求到达Traefik后处理出错,这些细节能帮你快速定位问题。
内容的提问来源于stack exchange,提问作者Adrien
相关产品推荐
相关产品推荐

