通过Traefik配置Django自定义域名遇ACME证书错误求助
排查Traefik+Cloudflare+Django的证书验证失败与404问题
核心问题拆解
- GoDaddy域名接入Cloudflare,通过Traefik反向代理关联Django服务
- Django在8000端口运行正常,但尝试切换到80端口后,域名访问出现请求挂起+404错误
- Traefik启动时ACME证书获取失败(403),提示域名验证失败、acme-challenge文件无响应
- 仅存在一个
acme.json文件,路径为/home/ec2-user/thing4/new_ui_51_fix_backend_for_8081/running_prices/TRAEFIK/letsencrypt/acme.json,且无acme-challenge相关内容 - 本地机器与Amazon Linux EC2均出现该问题,AWS端口已全部开放
一、ACME证书403错误排查
1. Cloudflare代理模式拦截验证请求
Cloudflare的Proxied模式会拦截HTTP-01挑战请求,导致Let's Encrypt无法直接访问Traefik的验证文件:
- 临时将域名对应的A/AAAA DNS记录切换为
DNS only,等待证书签发完成后再切回Proxied - 若需要保持代理模式,直接改用DNS-01挑战(见下文通用解决方案)
2. Traefik ACME配置正确性检查
确保Traefik静态配置(traefik.yml或启动参数)正确处理HTTP-01挑战:
entryPoints: web: address: ":80" # 必须监听80端口用于ACME挑战 websecure: address: ":443" certificatesResolvers: myresolver: acme: email: your-email@example.com storage: /letsencrypt/acme.json # 容器内路径需与挂载的宿主机路径对应 httpChallenge: entryPoint: web # 指定用web入口处理挑战请求
- 核对容器挂载规则:宿主机的
acme.json需挂载到配置中指定的容器内路径,例如:docker run -v /home/ec2-user/.../letsencrypt/acme.json:/letsencrypt/acme.json ... traefik - 修复
acme.json权限:执行chmod 600 /home/ec2-user/.../letsencrypt/acme.json,Traefik需要独占读写权限才能写入证书
3. 验证挑战请求可达性
- 在EC2本地执行
curl http://your-domain/.well-known/acme-challenge/test,若返回404说明Traefik已接收请求;若请求超时,说明端口或路由存在阻塞 - 用
tcpdump port 80抓包,确认Let's Encrypt的挑战请求是否到达服务器
二、Django 80端口404错误排查
1. 纠正端口转发逻辑
Django无需切换到80端口运行,正确逻辑是:Traefik监听80/443端口接收外部请求,再转发到Django的8000端口。若强行将Django改为80端口,会因普通用户权限不足(1024以下端口需root)导致服务启动失败,进而出现404。
2. 检查Traefik动态路由配置
确保Django服务的Traefik标签(或文件配置)正确注册路由:
labels: - "traefik.enable=true" - "traefik.http.routers.django.rule=Host(`your-domain.com`)" - "traefik.http.routers.django.entrypoints=web,websecure" - "traefik.http.routers.django.tls.certresolver=myresolver" - "traefik.http.services.django.loadbalancer.server.port=8000" # 指向Django实际运行的8000端口
3. 确认Django服务状态
在EC2本地执行curl http://localhost:8000,确保Django服务正常返回页面;若改为80端口后启动失败,查看Django日志确认权限问题。
三、通用解决方案
1. 改用DNS-01挑战适配Cloudflare代理模式
配置Traefik使用Cloudflare DNS-01挑战,无需暴露80端口,适合持续使用Cloudflare代理的场景:
certificatesResolvers: myresolver: acme: email: your-email@example.com storage: /letsencrypt/acme.json dnsChallenge: provider: cloudflare resolvers: - "1.1.1.1:53" - "8.8.8.8:53"
- 为Traefik容器设置环境变量:
CF_API_EMAIL(Cloudflare账号邮箱)和CF_API_KEY(Cloudflare全局API密钥)
2. 重置acme.json文件
备份当前acme.json后删除,重启Traefik让其重新生成文件,避免旧文件的错误配置影响证书签发。
3. 检查Traefik仪表盘路由状态
打开Traefik仪表盘,确认Django的路由、服务、端点已正确注册,若未注册则检查动态配置的语法或标签是否有误。
内容的提问来源于stack exchange,提问作者tgmjack
相关产品推荐
相关产品推荐

