这篇指南教你在一台云服务器(cloud server,指按需租用的远程计算资源)上同时跑多个 Web 服务时,用反向代理(reverse proxy)把散落流量收拢成统一入口。Traefik(读作 traffic,一款用 Go 写的开源反向代理)最吸引人的地方不是转发本身,而是它内置的 ACME(自动证书管理环境,Automatic Certificate Management Environment)支持——证书申请、部署、续期都能自动完成,你不用再手写 certbot 脚本。本指南会帮你搞清楚的不只是”Traefik 怎么配”,而是”配置完之后,怎么验证多服务转发、自动证书和回滚没有坑”,这更接近 WHT 玩家真正关心的问题。
先用 Docker 搭起最小可用的 Traefik
在云服务器上,最常见的部署方式是 Docker Compose,因为它和容器编排天然契合。下面是一份最小可用的 Traefik 配置,重点是把 80 和 443 端口交给 Traefik,并挂载 Docker 套接字(socket)用于自动发现容器。
version: "3.8"
services:
traefik:
image: traefik:v3.1
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/etc/traefik/traefik.yml:ro
- ./acme.json:/acme.json
networks:
- web
networks:
web:
external: true
关键点有两个:一是挂载 Docker 套接字时必须只读(:ro),避免容器反过来控制宿主机;二是 acme.json 要提前创建并设置 600 权限,否则 Traefik 无法写入证书数据。很多新手在这里栽跟头,跑起来之后发现证书一直申请失败,排错到半夜才发现是权限问题。
touch acme.json chmod 600 acme.json
一个容易忽略的坑是反向代理所在服务器本身的稳定性。如果这台机器是拿来承载生产流量的,建议用一台有独立公网 IP、带宽(指单位时间内可传输的数据量)和 IO 都有保障的云服务器或 VPS(虚拟专用服务器,Virtual Private Server)。它不一定要顶配,但 80/443 端口的连通性和磁盘写入速度会直接影响证书申请与续期是否顺利。
入口点与证书解析器:自动证书的核心配置
Traefik 的核心配置写在 traefik.yml,其中入口点(entrypoint)和证书解析器(certificate resolver)是最关键的两段。入口点决定 Traefik 监听哪些端口,解析器负责和 ACME 服务通信、自动申请和续期证书。
entryPoints:
web:
address: ":80"
websecure:
address: ":443"
certificatesResolvers:
letsencrypt:
acme:
email: admin@example.com
storage: /acme.json
httpChallenge:
entryPoint: web
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
这里要特别盯住 exposedByDefault: false。它表示只有显式声明了 Traefik 标签的容器才会被自动发现,避免你把某个测试容器误暴露到公网。证书解析器使用 HTTP 质询(challenge)验证域名所有权,验证通过后自动签发证书;证书即将到期时 Traefik 会自动续期,无需手动干预。

用容器标签把多个服务路由到对应域名
Traefik 的多服务路由通过容器标签(label)声明。当你在 Docker Compose 中为服务加上 Traefik 标签后,Traefik 会自动创建对应的路由,把匹配域名或路径的请求转发到该服务。下面以两个 Web 服务为例,展示如何用域名区分流量。
services:
app1:
image: nginx:alpine
labels:
- "traefik.enable=true"
- "traefik.http.routers.app1.rule=Host(`app1.example.com`)"
- "traefik.http.routers.app1.tls.certresolver=letsencrypt"
- "traefik.http.services.app1.loadbalancer.server.port=80"
traefik.http.routers.app1.rule 决定哪个域名走这个路由;tls.certresolver=letsencrypt 告诉 Traefik 为这个域名自动申请并挂上证书。部署第二个服务时,只需把 app1 改成 app2、域名换成 app2.example.com 即可,Traefik 会自动检测并生成新路由,不用重启整个代理。

验证多服务路由时,除了看返回内容,还要确认不同服务不会互相覆盖。比如 app1 和 app2 各自监听 80 端口,Traefik 靠 Host() 规则区分,但如果两个容器的标签都把域名写错成同一个,流量会全部打到一个服务上。排查这类问题最快的方法是看 Traefik 的日志面板:http://服务器IP:8080 会展示当前所有路由和它们的健康状态,哪个路由命中多少次、有没有 503 错误一目了然。把 8080 端口留给本地排查用,不要直接暴露到公网,否则任何人都能读到你的服务列表和证书信息。
回滚与运维验证:别让自动证书变成黑盒
自动证书最怕的是”黑盒化”——你只知道它自动续期,却不知道续期有没有成功。建议至少每周跑一次检查脚本,把证书到期时间、各路由命中次数和容器健康状态汇总成一行日志。一旦发现某个域名证书快到期但没续上,要能快速定位是 DNS(域名系统,Domain Name System,把域名解析成 IP 地址的服务)解析、80 端口还是 acme.json 权限的问题。
要回滚某一次升级,最简单的方式是保留上一版 traefik.yml 和 docker-compose.yml,确认新版本有异常时直接切回旧文件并重启容器。因为 Traefik 的配置是声明式的,回滚不涉及数据库迁移或数据变更,几分钟就能完成,这也是它比手动配置 Nginx 更适合多服务场景的原因。不过要注意,回滚前先确认 acme.json 里的证书文件没有损坏,否则回滚后 443 端口可能起不来。
在 WHT 专区,我们更习惯把这类自动化当成一套可观测的流程:反向代理容器的入口,实际由上游服务器承担稳定承载。如果你需要一台 IO 与网络都稳定的反向代理载体,可以参考 Hostease 的香港云服务器选型思路,以及用香港云主机搭建个人博客的多服务上线做法;对多服务入口的带宽规划,香港VPS网络延迟实测与优化也可以作为参考。
总结与行动建议
最后总结一下:Traefik 的价值在于把”反向代理 + 自动证书 + 多服务路由”收进一个入口,但它的可靠性要靠验证来保证——证书要能用 curl -I 和 openssl s_client 实测,路由要用 Host 头或真实访问确认。如果你需要现在就落地这套方案,建议先在一台测试机跑通最小配置,确认 80/443 端口、证书申请和两个服务的转发都正常,再迁到生产;可以考虑参考上述 Hostease 的香港云服务器选型、云主机搭建个人博客和香港VPS网络延迟实测的相关思路,把入口、线路和上线流程一起设计好。总体建议是:先验证、再切换,把自动证书当可观测流程来管,多服务部署才不会在关键时刻翻车。

微信扫一扫打赏
支付宝扫一扫打赏