首页 guides Hostease 专区实测讨论:Traefik 反向代理配置,自动证书与云服务器多服务部署要盯哪些指标

Hostease 专区实测讨论:Traefik 反向代理配置,自动证书与云服务器多服务部署要盯哪些指标

这篇指南教你在一台云服务器(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 ACME 自动证书解析与续期流程示意图

用容器标签把多个服务路由到对应域名

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 会自动检测并生成新路由,不用重启整个代理。

Traefik 按域名把流量路由到多个后端服务的示意图

验证多服务路由时,除了看返回内容,还要确认不同服务不会互相覆盖。比如 app1 和 app2 各自监听 80 端口,Traefik 靠 Host() 规则区分,但如果两个容器的标签都把域名写错成同一个,流量会全部打到一个服务上。排查这类问题最快的方法是看 Traefik 的日志面板:http://服务器IP:8080 会展示当前所有路由和它们的健康状态,哪个路由命中多少次、有没有 503 错误一目了然。把 8080 端口留给本地排查用,不要直接暴露到公网,否则任何人都能读到你的服务列表和证书信息。

回滚与运维验证:别让自动证书变成黑盒

自动证书最怕的是”黑盒化”——你只知道它自动续期,却不知道续期有没有成功。建议至少每周跑一次检查脚本,把证书到期时间、各路由命中次数和容器健康状态汇总成一行日志。一旦发现某个域名证书快到期但没续上,要能快速定位是 DNS(域名系统,Domain Name System,把域名解析成 IP 地址的服务)解析、80 端口还是 acme.json 权限的问题。

要回滚某一次升级,最简单的方式是保留上一版 traefik.ymldocker-compose.yml,确认新版本有异常时直接切回旧文件并重启容器。因为 Traefik 的配置是声明式的,回滚不涉及数据库迁移或数据变更,几分钟就能完成,这也是它比手动配置 Nginx 更适合多服务场景的原因。不过要注意,回滚前先确认 acme.json 里的证书文件没有损坏,否则回滚后 443 端口可能起不来。

在 WHT 专区,我们更习惯把这类自动化当成一套可观测的流程:反向代理容器的入口,实际由上游服务器承担稳定承载。如果你需要一台 IO 与网络都稳定的反向代理载体,可以参考 Hostease 的香港云服务器选型思路,以及用香港云主机搭建个人博客的多服务上线做法;对多服务入口的带宽规划,香港VPS网络延迟实测与优化也可以作为参考。

总结与行动建议

最后总结一下:Traefik 的价值在于把”反向代理 + 自动证书 + 多服务路由”收进一个入口,但它的可靠性要靠验证来保证——证书要能用 curl -Iopenssl s_client 实测,路由要用 Host 头或真实访问确认。如果你需要现在就落地这套方案,建议先在一台测试机跑通最小配置,确认 80/443 端口、证书申请和两个服务的转发都正常,再迁到生产;可以考虑参考上述 Hostease 的香港云服务器选型云主机搭建个人博客香港VPS网络延迟实测的相关思路,把入口、线路和上线流程一起设计好。总体建议是:先验证、再切换,把自动证书当可观测流程来管,多服务部署才不会在关键时刻翻车。

本文来自网络,不代表WHT中文站立场,转载请注明出处。https://hostease.webhostingtalk.cn/guides/traefik-multiservice-certificate-validation/

作者: wht-he-admin

返回顶部