如何在香港服务器上构建基于Traefik的多站点反向代理并自动配置Let’s Encrypt?

如何在香港服务器上构建基于Traefik的多站点反向代理并自动配置Let’s Encrypt?

我在客户项目部署中,遇到了这样一个需求:客户希望将多个站点(不同域名)统一部署在同一台香港服务器上,并要求支持 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 是非常值得投入的技术选型。

未经允许不得转载:A5数据 » 如何在香港服务器上构建基于Traefik的多站点反向代理并自动配置Let’s Encrypt?

相关文章

contact