Install Trafik As Reverse Proxy

on 2024-09-29

Traefik 介绍

Traefik-Architecture

Traefik 是一款服务反向代理网关, 可从多种不同的基础设施架构中读取服务信息并完成请求转发

Traefik 将服务注册信息提供者定义为 Provider, 以下为 Traefik 当前支持的 Provider

  • Docker
  • Kubernetes IngressRoute
  • Kubernetes Ingress
  • Kubernetes Gateway API
  • Consul Catalog
  • Nomad
  • ECS
  • File
  • Consul
  • Etcd
  • ZooKeeper
  • Redis
  • HTTP

Docker 安装 Traefik

使用 docker-compose 安装 Traefik

services:
  traefik:
    image: traefik
    container_name: traefik
    restart: unless-stopped
    network_mode: host
    command:
      - --api=true
      # - --accesslog=true
      # - --log.level=INFO
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --providers.file.filename=/config/traefik.yaml
      - --providers.file.watch=true
      - --entrypoints.web.address=:80
      - --entrypoints.web.http.redirections.entrypoint.to=websecure
      - --entrypoints.web.http.redirections.entrypoint.scheme=https
      - --entrypoints.websecure.address=:443
      - --entrypoints.websecure.http.tls=true
      - --entrypoints.websecure.http.tls.certresolver=dnspod
      - --certificatesresolvers.dnspod.acme.dnschallenge=true
      - --certificatesresolvers.dnspod.acme.dnschallenge.provider=dnspod
      - --certificatesresolvers.dnspod.acme.email=xxx@gmail.com
      - --certificatesresolvers.dnspod.acme.storage=/letsencrypt/acme.json
    environment:
      - DNSPOD_API_KEY=***************
    volumes:
      - ./config:/config
      - ./letsencrypt:/letsencrypt
      - /var/run/docker.sock:/var/run/docker.sock

命令行参数说明

参数说明
--api=true开启 API 与 Dashboard
--accesslog=true开启访问日志
--log.level=INFO设置服务日志等级, 默认为 ERROR
--providers.docker=true开启 Docker 后端支持
--providers.docker.exposedbydefault=false开启 Docker 自动端口转发
--providers.file.filename=/config/traefik.yaml开启文件配置支持
--providers.file.watch=true监听配置文件监听
--entrypoints.web.address=:80监听80端口, 入口名为 web
--entrypoints.web.http.redirections.entrypoint.to=websecureweb 入口请求重定向到 websecure
--entrypoints.web.http.redirections.entrypoint.scheme=httpsweb 入口请求重定向为 https
--entrypoints.websecure.address=:443监听443端口, 入口名为 websecure
--entrypoints.websecure.http.tls=truewebsecure 入口开启 tls 加密
--entrypoints.websecure.http.tls.certresolver=dnspodwebsecure 入口 tls 提供者为 dnspod
--certificatesresolvers.dnspod.acme.dnschallenge=truednspod 开启 dnschallenge
--certificatesresolvers.dnspod.acme.dnschallenge.provider=dnspoddnschallenge 提供者为 dnspod
--certificatesresolvers.dnspod.acme.email=xxx@gmail.com证书申请者邮箱
--certificatesresolvers.dnspod.acme.storage=/letsencrypt/acme.json证书保存位置 /letsencrypt/acme.json

其他启动配置可以参考官方 CLI Reference

环境变量

变量说明
DNSPOD_API_KEY=***dnspod 密钥

其他 DNS Providers

Traefik 配置使用

Docker Provider

Traefik 可以读取服务在 labels 中的内容, 以下为一个实例

services:
  blog:

    # ...

    labels:
      - traefik.enable=true
      - traefik.http.services.blog.loadbalancer.server.port=80
      - traefik.http.middlewares.redirect-to-www.redirectregex.regex=^https://xilin.icu/(.*)
      - traefik.http.middlewares.redirect-to-www.redirectregex.replacement=https://www.xilin.icu/$${1}
      - traefik.http.routers.blog.rule=Host(`xilin.icu`)||Host(`www.xilin.icu`)
      - traefik.http.routers.blog.entrypoints=websecure
      - traefik.http.routers.blog.service=blog
      - traefik.http.routers.blog.tls.certresolver=dnspod
      - traefik.http.routers.blog.middlewares=redirect-to-www

标签说明

标签说明
traefik.enable=true开启 Traefik 转发
traefik.http.services.blog.loadbalancer.server.port=80服务 blog 的向外暴露端口为80
traefik.http.middlewares.redirect-to-www.redirectregex.regex=^https://xilin.icu/(.*)设置中间件 redirect-to-www 的匹配规则
traefik.http.middlewares.redirect-to-www.redirectregex.replacement=https://www.xilin.icu/$${1}设置中间件 redirect-to-www 的重写逻辑
traefik.http.routers.blog.entrypoints=websecure路由 blog 的入口为 websecure 也就是443端口
traefik.http.routers.blog.service=blog路由 blog 的转发服务为 blog
traefik.http.routers.blog.tls.certresolver=dnspod路由 blog 的证书解析为 dnspod
traefik.http.routers.blog.middlewares=redirect-to-www路由 blog 使用中间件 redirect-to-www

File Provider

通过 --providers.file.filename 指定了 File Provider 的路径, 因此可以通过配置文件增加对非 docker 服务的代理支持

http:
  middlewares:
    basic-auth:
      basicAuth:
        users:
          - xxl:$apr1$Jk5NhCQT$4IMBP5aRjjacrKXBVvy.c0

  routers:
    dashboard:
      entryPoints:
        - websecure
      middlewares:
        - basic-auth
      rule: Host(`traefik.xilin.icu`)
      tls:
        certResolver: dnspod
      service: api@internal

    zero:
      entryPoints:
        - websecure
      rule: Host(`zero.xilin.icu`)||HostRegexp(`^.+\.zero\.xilin\.icu$`)
      tls:
        certResolver: dnspod
        domains:
          - main: "zero.xilin.icu"
            sans:
              - "*.zero.xilin.icu"
      service: zero

  zero:
      loadBalancer:
        servers:
          - url: http://zero.lan:80

其他配置可参考官方实例