「奇技淫巧」 Traefik “智能”反向代理(解放苦于配置的双手)

traefik 是一款反向代理、负载均衡服务,使用golang 实现的。 和nginx 最大的不同是,它支持自动化更新反向代理和负载均衡配置。

官网:https://traefik.io/

官方文档:https://doc.traefik.io/traefik/

简单应用

反向代理应用

工具特点

  • docker 服务自动发现
  • HTTPS 自动配置
  • prometheus 数据接口
  • web-ui
  • 80-443 强制跳转
  • 配置简单
    • 给容器打上对应的 label 标签即可自动完成反向代理路由与负载均衡配置

Traefik Diagram

反向代理示例

采用分离部署、即将 traefik 作为一个独立的前置 web 入口,后端服务容器通过配置 label 标签完成路由与负载均衡配置、其它高级用法请参考官方文档。

  • 架构示意图

traefik docker-compose.yaml

version: "3.3"

services:

  traefik:
    image: "traefik:v2.5"
    container_name: "traefik"
    restart: always
#     labels: 
#     # 取消注释即可使用 traefik 面板
#      - "traefik.enable=true"
#      - "traefik.port=8080"
#      - "traefik.http.services.dummyService.loadbalancer.server.port=8080"
#      - "traefik.http.routers.traefik_http.service=api@internal"
#      - "traefik.http.routers.monitor.rule=Host(`monitor.example.org`)" 
#      - "traefik.http.routers.monitor.entrypoints=websecure"
#      - "traefik.http.routers.monitor.tls.certresolver=myresolver"

    command:
#      - "--log.level=DEBUG"
# 取消注释即可使用 traefik 面板
#      - "--api.insecure=true"
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--certificatesresolvers.myresolver.acme.httpchallenge=true"
      - "--certificatesresolvers.myresolver.acme.httpchallenge.entrypoint=web"
      # - "--certificatesresolvers.myresolver.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory"
      - "--certificatesResolvers.myresolver.acme.dnsChallenge.resolvers=1.1.1.1:53,8.8.8.8:53"
      - "--certificatesresolvers.myresolver.acme.email=me@example.org"
      - "--certificatesresolvers.myresolver.acme.storage=/letsencrypt/acme.json"
      # 强制 HTTPS 跳转
      - "--entrypoints.web.http.redirections.entryPoint.to=websecure"
      - "--entrypoints.web.http.redirections.entryPoint.scheme=https"
      # 取消注释即可使用 prometheus 搜集性能数据
#       - "--metrics.prometheus=true"
#       - "--entryPoints.metrics.address=:8082"
#       - "--metrics.prometheus.entryPoint=metrics"

    ports:
      - "80:80"
      - "443:443"
    #  - "8080:8080" # 面板端口
    # network_mode: host
    volumes:
      - "./letsencrypt:/letsencrypt"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
# 测试容器
#   whoami:
#     image: "traefik/whoami"
#     container_name: "simple-service"
#     restart: always
#     labels:
#       - "traefik.enable=true"
#       - "traefik.http.routers.whoami.rule=Host(`whoami.example.org`)"
#       - "traefik.http.routers.whoami.entrypoints=websecure"
#       - "traefik.http.routers.whoami.tls.certresolver=myresolver"

#     networks:
#       - proxy-tier

networks:
  proxy-tier:
    external:
      name: traefik

使用方法:

  1. 首先使用 docker-compose 启动 traefik
cd traefik
docker-compose up -d
  1. 选择需要的应用、修改必要的配置文件、添加需要的 label 标签
  cloudreve: 
    image: xavierniu/cloudreve:arm64v8
    restart: always
    labels:
      - "traefik.enable=true"
      - "traefik.port=5212"
      - "traefik.http.routers.cloudreve.rule=Host(`cloudreve.exampl.org`)"
      - "traefik.http.routers.cloudreve.entrypoints=websecure"
      - "traefik.http.routers.cloudreve.tls.certresolver=myresolver"
  1. 然后使用 docker-compose 启动相应的服务。
docker-compose up -d

性能监控

traefik 默认提供 prometheus 数据收集功能、可以自己选择是否开启、如果开启可以使用 prometheus + grafana 完成对自己 web 运行状态的监控。

  • 面板展示

image.png

目前使用 traefik 运行的项目

https://github.com/expoli/docker-compose-files

大杂烩、记录了一些自己用的服务与相应的配置文件、欢迎 pr 其他的有趣的项目

https://github.com/expoli/start-bolo-with-docker-compose

目前 bolo 博客、默认的 docker-compose 部署方式方案

https://expoli.tech

懒人如我、肯定不会失去享受的机会的, 老nginx 配置有点烦了

   
  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口

    23 引用
  • Traefik

    1 引用