
我在客户项目部署中,遇到了这样一个需求:客户希望将多个站点(不同域名)统一部署在同一台香港服务器上,并要求支持 HTTPS 证书自动签发和续期。过去我常用 Nginx + Certbot 手动配置,但在维护多个站点时逐渐变得低效。于是我决定采用 Traefik,这是一款现代化的反向代理和负载均衡器,原生支持 Let’s Encrypt,可以极大简化 HTTPS 证书的管理。
以下是我在实际项目中的完整实操流程,基于 Docker Compose 构建,适合部署在香港任意主机(如 A5 数据香港 CN2 或国际线路服务器)上,支持自动化、可扩展的多站点管理。
一、前置条件
- 一台香港服务器,公网可访问,开放 80 和 443 端口
- 已绑定的多个域名,域名解析 A 记录指向该服务器公网 IP
- 安装好 Docker 和 Docker Compose(建议使用 docker-compose v2+)
二、项目结构设计
traefik-multisite/
├── traefik/
│ ├── traefik.yml
│ ├── acme.json
│ └── dynamic_conf.yml
├── docker-compose.yml
└── sites/
├── site1/
│ └── docker-compose.yml
└── site2/
└── docker-compose.yml
三、配置 Traefik
1. traefik.yml(静态配置)
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
providers:
docker:
exposedByDefault: false
file:
filename: "/etc/traefik/dynamic_conf.yml"
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /etc/traefik/acme.json
httpChallenge:
entryPoint: web
log:
level: INFO
2. dynamic_conf.yml(动态中间件配置)
http:
middlewares:
redirect-to-https:
redirectScheme:
scheme: https
permanent: true
3. 设置权限并创建 acme.json
touch traefik/acme.json
chmod 600 traefik/acme.json
四、Traefik 主服务 docker-compose.yml
version: "3.9"
services:
traefik:
image: traefik:v2.11
container_name: traefik
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik/traefik.yml:/etc/traefik/traefik.yml:ro
- ./traefik/dynamic_conf.yml:/etc/traefik/dynamic_conf.yml:ro
- ./traefik/acme.json:/etc/traefik/acme.json
networks:
- web
networks:
web:
external: true
创建共享网络
docker network create web
五、部署站点容器(以 site1 为例)
sites/site1/docker-compose.yml:
version: "3.9"
services:
site1:
image: nginx:alpine
container_name: site1
restart: always
volumes:
- ./html:/usr/share/nginx/html:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.site1.rule=Host(`site1.example.com`)"
- "traefik.http.routers.site1.entrypoints=websecure"
- "traefik.http.routers.site1.tls.certresolver=letsencrypt"
- "traefik.http.routers.site1.middlewares=redirect-to-https@file"
networks:
- web
networks:
web:
external: true
如果你要部署多个站点,只需将 site1.example.com 替换成对应域名,并另建目录管理即可。
六、启动服务
docker-compose up -d # 启动 Traefik
cd sites/site1
docker-compose up -d # 启动 site1
首次访问 https://site1.example.com 时,Traefik 会自动申请 Let’s Encrypt 证书,并将其缓存到 acme.json 文件中。
七、证书自动续期机制
Traefik 会在证书过期前 30 天自动续期。你无需额外设置 Cron 任务或 Certbot 调用,前提是:
- 域名解析始终有效
- 服务未长时间关闭
- acme.json 保持写权限
八、常见问题排查
1. 证书签发失败
- 检查 80 端口是否被防火墙/ISP 阻断(Let’s Encrypt 使用 HTTP Challenge)
- 确保域名指向当前服务器,DNS 缓存已刷新
- 检查 acme.json 权限为 600,并由 Traefik 用户写入
2. 站点未被识别
确认容器 label 设置正确
Traefik 是否成功识别 Docker(查看 docker network ls 和 docker network inspect)
九、总结与扩展
使用 Traefik 搭建香港多站点代理服务,让我在全球业务中大幅提升了效率。它不仅支持自动签发 HTTPS,而且只需添加配置就能无缝部署新站点。
对于后续优化,还可以:
- 集成 Cloudflare API 实现 DNS-01 证书签发
- 启用访问日志、请求限流和 IP 黑名单
- 使用 Docker Swarm 或 Kubernetes 提升高可用能力
通过本文方法,我在实际项目中稳定承载了十多个多语言站点,全部部署在同一台香港节点服务器上,实现了跨国低延迟访问与高可用架构。如果你正考虑构建多站点部署平台,Traefik 是非常值得投入的技术选型。











