Logo
Overview
服务器折腾记录——traefik使用指北

服务器折腾记录——traefik使用指北

June 16, 2024
题外话:这几天如果有朋友天天上我博客看的话应该没有吧,会发现它天天爆炸。偶尔还能看到早年间设置的Cloudflare Pro专属的自定义报错界面(
前几天接收到友人的提醒后去看了眼vercel的log,发现好像是这玩意不太靠谱了。正好最近服务器空着也是浪费钱,我就把他挪到服务器了。

看到网上有个一点都不火的转发工具:traefik,但是看着好高级的样子,于是啃文档研究了一下。

干啥的

其实和nginx,caddy这类工具一样,traefik本质上就是提供一个http/tcp/udp服务器做转发。

当然如果只是这样,它也就没必要单独拿出来水一篇文章了。它还有一个比较先进的功能——服务发现,就是能够根据某个控制中枢(如/var/run/docker.sock )来发现已经启动的应用,然后自动配置转发。(这个好像应该是叫微服务什么的,我不懂互联网黑话)所以这个比前面提到的两个转发服务器都好用!因为不用每次转发还要改配置文件了!

怎么用

我们用docker来安装并且配置traefik。

下面是一个常用的docker-compose配置文件

version: "3.9"

services:
  traefik:
    image: traefik:v3.0.2
    restart: always
    ports:
      - target: 80
        published: 80
        protocol: tcp
        mode: host
      - target: 443
        published: 443
        protocol: tcp
        mode: host
    networks:
      - traefik
    command:
      - "--api=true"
      - "--api.dashboard=true"
      - "--api.insecure=true"
      - "--ping=true"
      - "--log.level=info"
      - "--entrypoints.http.address=:80"
      - "--entrypoints.https.address=:443"
      - "--providers.docker"
      - "--providers.docker.endpoint=unix:///var/run/docker.sock"
      - "--providers.docker.network=traefik"
      - "--providers.docker.exposedbydefault=false"
      - "--certificatesresolvers.le.acme.email=${CF_DNS_EMAIL}"
      - "--certificatesresolvers.le.acme.storage=/certs/acme.json"
      - "--certificatesresolvers.le.acme.dnsChallenge.resolvers=1.1.1.1:53,8.8.8.8:53"
      - "--certificatesresolvers.le.acme.dnsChallenge.provider=cloudflare"
      - "--certificatesresolvers.le.acme.dnsChallenge.delayBeforeCheck=30"
      - "--global.sendanonymoususage=false"
      - "--global.checknewversion=false"
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=traefik"
      - "traefik.http.middlewares.redir-https.redirectscheme.scheme=https"
      - "traefik.http.middlewares.redir-https.redirectscheme.permanent=false"
      - "traefik.http.middlewares.gzip.compress=true"

      - "traefik.http.routers.traefik-dash-sec.tls.certresolver=le"
      - "traefik.http.routers.traefik-dash-sec.tls.domains[0].main=${CF_DNS_MAIN}"
      - "traefik.http.routers.traefik-dash-sec.tls.domains[0].sans=${CF_DNS_LIST}"

      - "traefik.http.routers.traefik-dash.entrypoints=http"
      - "traefik.http.routers.traefik-dash.rule=Host(`${SERVICE_DOMAIN}`)"
      - "traefik.http.routers.traefik-dash.middlewares=redir-https@docker"

      - "traefik.http.middlewares.test-auth.basicauth.users=${AUTH}"
      - "traefik.http.routers.traefik-dash-sec.middlewares=gzip@docker,test-auth@docker"
      - "traefik.http.routers.traefik-dash-sec.service=dashboard@internal"
      - "traefik.http.routers.traefik-dash-sec.entrypoints=https"
      - "traefik.http.routers.traefik-dash-sec.tls=true"
      - "traefik.http.routers.traefik-dash-sec.rule=Host(`${SERVICE_DOMAIN}`)"

      - "traefik.http.routers.traefik-dash-api.middlewares=gzip@docker,test-auth@docker"
      - "traefik.http.routers.traefik-dash-api.service=api@internal"
      - "traefik.http.routers.traefik-dash-api.entrypoints=https"
      - "traefik.http.routers.traefik-dash-api.rule=Host(`${SERVICE_DOMAIN}`) && PathPrefix(`/api`)"
      - "traefik.http.routers.traefik-dash-api.tls=true"

    env_file:
      - .env
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./certs/:/certs/
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    healthcheck:
      test: ["CMD-SHELL", "wget -q --spider --proxy off localhost:8080/ping || exit 1"]
      interval: 3s
      retries: 10
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
networks:
  traefik:
    external: true

可以看到这里有好多奇奇怪怪的标签还有内容,多了两个不太常用的键:commands和labels。

commands解释

commands是运行的时候,给traefik程序添加更多的参数进行配置。当然也可以走yaml或者toml的配置文件挂载,但是本着能只修改一个文件就不修改两个的原则,我们还是走commands里完成配置。

在上面文件里的commands里,我们做了以下事情:

  • --api=true --api.dashboard=true --api.insecure=true --ping ,启用了api、面板、以及上面两个东西的http访问,还有healthcheck的ping选项。
  • --global.sendanonymoususage=false -global.checknewversion=false 禁用检查和匿名统计数据。
  • --log.level=info 日志等级
  • --entrypoints.http.address=:80 --entrypoints.https.address=:443 80,443两个端口分别命名为http和https。
  • --providers.docker --providers.docker.endpoint=unix:///var/run/docker.sock --providers.docker.network=traefik --providers.docker.exposedbydefault=false 对于docker的配置。providers.docker.network=traefik 只允许traefik转发位于traefik网络下的容器,providers.docker.exposedbydefault=false 则是让必须在标签里有traefik.enable=true 的才能转发,避免转发出去一些中间件甚至后端。
  • 剩下的几个--certificatesresolvers.le.acme.email=${CF_DNS_EMAIL} --certificatesresolvers.le.acme.storage=/certs/acme.json --certificatesresolvers.le.acme.dnsChallenge.resolvers=1.1.1.1:53,8.8.8.8:53 --certificatesresolvers.le.acme.dnsChallenge.provider=cloudflare --certificatesresolvers.le.acme.dnsChallenge.delayBeforeCheck=30是用来配置证书的。traefik提供了很多种方式来申请证书,还能做到自动续签。这里我们选择let’s encrypt服务,并且让它自动申请证书。其中我们把/certs 挂载到外部实现持久化。环境变量中CF_DNS_EMAIL 是Cloudflare的DNS,另外参考文档还需要一个或者两个token来实现dns验证。我选择把所有的环境变量放到.env 里便于修改。
labels解释

labels是docker的新功能,traefik可以根据标签的内容对自己的转发逻辑进行配置。在这个容器上贴标签,我们让traefik对自己进行转发,把自己转发到80/443上,同样,对于其他的docker服务,我们想用traefik转发的话只需要配置相应的内容,然后启动容器,traefik就可以自动转发。

在这个labels里,我们有如下的操作:

  • traefik.enable=true ,启用traefik。
  • traefik.docker.network=traefik 告知容器在traefik网络中
  • traefik.http.middlewares.redir-https.redirectscheme.scheme=https
    traefik.http.middlewares.redir-https.redirectscheme.permanent=false
    traefik.http.middlewares.gzip.compress=true 这三条定义了两个中间件,一个是gzip压缩,一个是redir-https(重定向到https)
  • traefik.http.routers.traefik-dash-sec.tls.certresolver=le
    traefik.http.routers.traefik-dash-sec.tls.domains[0].main=${CF_DNS_MAIN}

    traefik.http.routers.traefik-dash-sec.tls.domains[0].sans=${CF_DNS_LIST} 这三条定义了一个新的routertraefik-dash-sec ,并且对它启用了上面定义的lets encrypt的配置,CF_DNS_MAIN和CF_DNS_LIST是需要申请证书的主域名和域名列表,可以用通配符来覆盖整个域名。
  • 然后就是基本定义了,我们把traefik dashboard和上面的api放在一起,所以定义了三个不同的内容:一个是http的,全部重定向给https服务,https服务在/api 路径下交给traefik-dash-api 来处理,另外的交给traefik-dash-sec 处理,这两个服务同样启用了tls。

这就是我的使用方法了,在部署其他的compose容器时,加上这么一些label,域名指向这台服务器,就能轻松地完成转发、证书、重定向的配置。这不比nginx/caddy方便多了(雾

最后

当然traefik的用处还很多,中间件,插件,鉴权什么的都没有细讲,但是作为普通用户的我们也没必要去配置那么多东西了,如果想配置也可以直接去看官方文档

碎碎念:考试周还在折腾服务器水文的我是不是搞错了什么?

参考内容

https://soulteary.com/2023/07/18/traefik-v3-docker-comprehensive-user-guide-basics.html

https://doc.traefik.io/traefik/

comment

留言 / 评论

如果暂时没有看到评论,请点击下方按钮重新加载。