Traefik 反向代理与负载均衡

Traefik 是一款现代化的反向代理和负载均衡器,专为微服务和容器化环境设计。它最大的特点是可以自动发现 Docker 容器并配置路由规则,支持自动申请和续期 Let's Encrypt HTTPS 证书。相比 Nginx,Traefik 的配置更加动态和自动化。本文将在搬瓦工 VPS 上部署 Traefik 并配置反向代理。

一、环境要求

  • Docker:需要先安装 Docker 和 Docker Compose。
  • 内存:Traefik 仅需约 64MB 额外内存。
  • 域名:至少一个域名指向 VPS 的 IP(用于 HTTPS 证书)。

二、使用 Docker Compose 部署

创建 docker-compose.yml

version: '3.8'

services:
  traefik:
    image: traefik:v3.0
    container_name: traefik
    restart: always
    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
      - ./config:/etc/traefik/config:ro
    networks:
      - web
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.yourdomain.com`)"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
      - "traefik.http.routers.dashboard.middlewares=auth"
      - "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xxxxx"

networks:
  web:
    external: true

2.1 创建 Traefik 配置

创建 traefik.yml

api:
  dashboard: true
  insecure: false

entryPoints:
  web:
    address: ":80"
    http:
      redirections:
        entryPoint:
          to: websecure
          scheme: https
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: web
  file:
    directory: /etc/traefik/config
    watch: true

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

log:
  level: INFO

accessLog: {}

2.2 初始化并启动

# 创建外部网络
docker network create web

# 创建证书存储文件
touch acme.json
chmod 600 acme.json

# 创建配置目录
mkdir -p config

# 启动 Traefik
docker compose up -d

三、配置反向代理服务

Traefik 通过 Docker 标签(labels)自动配置路由。以部署一个 Web 应用为例:

version: '3.8'

services:
  webapp:
    image: nginx:alpine
    container_name: webapp
    restart: always
    networks:
      - web
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.webapp.rule=Host(`app.yourdomain.com`)"
      - "traefik.http.routers.webapp.tls.certresolver=letsencrypt"
      - "traefik.http.services.webapp.loadbalancer.server.port=80"

networks:
  web:
    external: true

只要容器连接到 web 网络并添加上述标签,Traefik 就会自动为其配置反向代理和 HTTPS 证书。

四、多服务配置示例

version: '3.8'

services:
  blog:
    image: wordpress:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.blog.rule=Host(`blog.yourdomain.com`)"
      - "traefik.http.routers.blog.tls.certresolver=letsencrypt"
      - "traefik.http.services.blog.loadbalancer.server.port=80"
    networks:
      - web
      - internal

  api:
    image: myapi:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.api.rule=Host(`api.yourdomain.com`)"
      - "traefik.http.routers.api.tls.certresolver=letsencrypt"
      - "traefik.http.services.api.loadbalancer.server.port=3000"
    networks:
      - web
      - internal

  gitea:
    image: gitea/gitea:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.gitea.rule=Host(`git.yourdomain.com`)"
      - "traefik.http.routers.gitea.tls.certresolver=letsencrypt"
      - "traefik.http.services.gitea.loadbalancer.server.port=3000"
    networks:
      - web
      - internal

networks:
  web:
    external: true
  internal:
    external: false

五、中间件配置

5.1 Basic Auth

# 生成密码(注意 $ 需要双写为 $$)
apt install apache2-utils -y
htpasswd -nb admin your_password
labels:
  - "traefik.http.middlewares.myauth.basicauth.users=admin:$$apr1$$xxxxx"
  - "traefik.http.routers.myapp.middlewares=myauth"

5.2 限速

labels:
  - "traefik.http.middlewares.ratelimit.ratelimit.average=100"
  - "traefik.http.middlewares.ratelimit.ratelimit.burst=50"
  - "traefik.http.routers.myapp.middlewares=ratelimit"

5.3 IP 白名单

labels:
  - "traefik.http.middlewares.ipwhitelist.ipwhitelist.sourcerange=192.168.1.0/24,10.0.0.0/8"
  - "traefik.http.routers.myapp.middlewares=ipwhitelist"

5.4 请求头设置

labels:
  - "traefik.http.middlewares.security-headers.headers.stsSeconds=31536000"
  - "traefik.http.middlewares.security-headers.headers.browserXssFilter=true"
  - "traefik.http.middlewares.security-headers.headers.contentTypeNosniff=true"
  - "traefik.http.middlewares.security-headers.headers.frameDeny=true"

六、文件配置方式

对于非 Docker 的后端服务,可以使用文件配置。创建 config/services.yml

http:
  routers:
    external-app:
      rule: "Host(`ext.yourdomain.com`)"
      service: external-app
      tls:
        certResolver: letsencrypt

  services:
    external-app:
      loadBalancer:
        servers:
          - url: "http://192.168.1.100:8080"
          - url: "http://192.168.1.101:8080"
        healthCheck:
          path: /health
          interval: 10s

七、监控面板

访问 https://traefik.yourdomain.com 可以查看 Traefik Dashboard,实时查看所有路由、服务和中间件的状态。

八、常见问题

证书申请失败

确保域名已正确解析到 VPS IP,且 80 端口可从外部访问:

docker logs traefik | grep -i "acme\|certificate"

502 Bad Gateway

检查后端服务容器是否在同一 Docker 网络中,以及端口是否正确:

docker network inspect web

路由不生效

确保容器标签中 traefik.enable=true 已设置,且 exposedByDefault 为 false。

总结

Traefik 是容器化环境中反向代理的绝佳选择,自动服务发现和自动 HTTPS 极大简化了运维工作。搭配 Docker 可以快速为多个应用配置反向代理。选购搬瓦工 VPS 请参考 全部方案,使用优惠码 NODESEEK2026 享受 6.77% 折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。