You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:55:17