Traefik反向代理配置实战:自动HTTPS与Docker流量路由

Traefik是现代云原生反向代理和负载均衡器,原生支持Docker、Kubernetes等服务发现机制。与Nginx需要手动修改配置文件不同,Traefik通过监听容器事件自动更新路由规则,无需重启即可生效。Docker自动化部署场景中,Traefik的自动HTTPS和动态配置能力大幅降低运维成本,成为替代Nginx+Certbot方案的热门选择。

Traefik架构与核心概念解析

Traefik的数据模型由四个核心概念组成:Entrypoints(入口点)定义Traefik监听的网络端口;Routers(路由器)将请求匹配到对应的后端服务;Services(服务)定义后端的负载均衡目标;Middlewares(中间件)在请求转发前后执行处理逻辑,如认证、限流、重写等。

Traefik的配置分为静态配置和动态配置。静态配置在启动时加载,定义入口点、Provider(服务发现来源)和日志等基础设置;动态配置在运行时自动更新,定义路由、服务和中间件。

Docker Compose部署Traefik与自动HTTPS

使用Docker Compose部署Traefik是最常见的方式。以下配置部署一个开启自动HTTPS的Traefik实例,通过Let’s Encrypt自动获取和续期SSL证书:

# docker-compose.yml
services:
  traefik:
    image: traefik:v3.1
    command:
      # 静态配置
      - --api.dashboard=true
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      # HTTP自动跳转HTTPS
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https
      # Let's Encrypt ACME配置
      - --certificatesresolvers.letsencrypt.acme.email=admin@example.com
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
      # 日志
      - --log.level=INFO
      - --accesslog=true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      # 挂载Docker socket以监听容器事件
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # 证书持久化存储
      - traefik-certs:/letsencrypt
    networks:
      - webgateway
    restart: unless-stopped

  # 示例后端服务
  whoami:
    image: traefik/whoami
    labels:
      - traefik.enable=true
      # HTTPS路由
      - traefik.http.routers.whoami.rule=Host(`whoami.example.com`)
      - traefik.http.routers.whoami.entrypoints=websecure
      - traefik.http.routers.whoami.tls.certresolver=letsencrypt
      # 服务端口
      - traefik.http.services.whoami.loadbalancer.server.port=80
    networks:
      - webgateway

volumes:
  traefik-certs:

networks:
  webgateway:
    external: true

上面的配置中,关键点说明:

providers.docker.exposedbydefault=false确保默认不暴露所有容器,只有添加了traefik.enable=true标签的容器才被Traefik识别。entrypoints.web.http.redirections将所有HTTP请求自动跳转到HTTPS。certresolver=letsencrypt指定使用Let’s Encrypt自动获取证书,Traefik通过HTTP-01挑战验证域名所有权。

部署前需要创建外部网络:docker network create webgateway。部署后,当容器带有正确的Host标签启动时,Traefik自动创建路由并申请SSL证书,整个过程无需手动操作。

中间件配置:限流与BasicAuth认证

Traefik中间件以链式方式处理请求,多个中间件可以组合使用。以下通过Docker labels配置限流和BasicAuth认证:

services:
  api-service:
    image: myapp:latest
    labels:
      - traefik.enable=true
      - traefik.http.routers.api.rule=Host(`api.example.com`) && PathPrefix(`/v1`)
      - traefik.http.routers.api.entrypoints=websecure
      - traefik.http.routers.api.tls.certresolver=letsencrypt
      - traefik.http.routers.api.middlewares=rate-limit,auth
      # 服务端口
      - traefik.http.services.api.loadbalancer.server.port=8080
      # 限流中间件:每秒平均10个请求,突发最多20个
      - traefik.http.middlewares.rate-limit.ratelimit.average=10
      - traefik.http.middlewares.rate-limit.ratelimit.burst=20
      # BasicAuth认证
      - traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$encodedpassword

BasicAuth密码使用htpasswd工具生成:htpasswd -nbB admin yourpassword。注意在YAML中$需要转义为$$

负载均衡与健康检查配置

多个容器实例提供同一服务时,Traefik自动进行负载均衡。通过Docker Compose的deploy.replicas或启动多个容器实例实现水平扩展,Traefik自动识别新增实例:

services:
  webapp:
    image: webapp:latest
    deploy:
      replicas: 3
    labels:
      - traefik.enable=true
      - traefik.http.routers.webapp.rule=Host(`app.example.com`)
      - traefik.http.routers.webapp.entrypoints=websecure
      - traefik.http.routers.webapp.tls.certresolver=letsencrypt
      - traefik.http.services.webapp.loadbalancer.server.port=3000
      # 负载均衡策略:轮询(默认)或加权
      - traefik.http.services.webapp.loadbalancer.server.scheme=http
      # 健康检查:每10秒检查一次,超时3秒
      - traefik.http.services.webapp.loadbalancer.healthcheck.path=/health
      - traefik.http.services.webapp.loadbalancer.healthcheck.interval=10s
      - traefik.http.services.webapp.loadbalancer.healthcheck.timeout=3s
      # 粘性会话(可选)
      - traefik.http.services.webapp.loadbalancer.sticky.cookie=true
      - traefik.http.services.webapp.loadbalancer.sticky.cookie.name=app_session

文件配置方式与动态更新

对于非Docker环境或需要更精细控制路由的场景,使用文件Provider以YAML格式定义动态配置。Traefik监视文件变化,修改后自动热加载,无需重启:

# traefik-dynamic.yml
http:
  routers:
    dashboard:
      rule: Host(`traefik.example.com`)
      entrypoints:
        - websecure
      service: api@internal
      tls:
        certresolver: letsencrypt
      middlewares:
        - auth

    grafana:
      rule: Host(`grafana.example.com`)
      entrypoints:
        - websecure
      service: grafana-service
      tls:
        certresolver: letsencrypt

  services:
    grafana-service:
      loadBalancer:
        servers:
          - url: http://192.168.1.50:3000
          - url: http://192.168.1.51:3000
        healthCheck:
          path: /api/health
          interval: 10s
          timeout: 3s

  middlewares:
    auth:
      basicAuth:
        users:
          - "admin:$apr1$xyz$encodedpassword"
    secure-headers:
      headers:
        sslRedirect: true
        stsSeconds: 31536000
        stsIncludeSubdomains: true
        frameDeny: true
        contentTypeNosniff: true
        browserXssFilter: true

静态配置中启用文件Provider:

# traefik.yml (静态配置)
entryPoints:
  web:
    address: :80
  websecure:
    address: :443

providers:
  file:
    filename: /etc/traefik/traefik-dynamic.yml
    watch: true

certificatesResolvers:
  letsencrypt:
    acme:
      email: admin@example.com
      storage: /letsencrypt/acme.json
      httpChallenge:
        entryPoint: web

监控告警集成与Prometheus指标

Traefik内置Prometheus指标导出,开启后可在Grafana中监控流量、响应时间和错误率。静态配置中添加:

metrics:
  prometheus:
    addEntryPointsLabels: true
    addServicesLabels: true
    addRoutersLabels: true
    entryPoint: web

关键的监控指标包括traefik_http_requests_total(请求总数)、traefik_http_request_duration_seconds(请求延迟分布)和traefik_service_requests_total(按服务统计请求量)。在Prometheus中配置告警规则,当错误响应率超过阈值或证书即将过期时触发告警通知。

原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/traefik-fan-xiang-dai-li-pei-zhi-shi-zhan-zi-dong-https-yu/

(0)
小编小编
上一篇 11小时前
下一篇 11小时前

相关推荐