首页 > 经验记录 > Traefik静态文件代理三板斧

Traefik静态文件代理三板斧

首先要知道一个点,Traefik 不支持 Nginx 那样的 alias 方案,它根本就没有原生指令,所以你要直接使用他来作为静态文件服务器是不行的。

那么我们就只能曲线救国了。

  • 先弄一个专门的静态文件服务器
  • 然后 Traefik 直接路由到该服务器上
  • 记得指定路径,避免影响其他服务

 

这里就让我们来用 busybox

busybox是一个极小的静态文件服务器,在docker上启动,挂载一下本地Linux路径就能无脑映射,启动后占用内存几百k,十分轻量

比如说我下面配置的,就是 /opt/dockerdata/httpstatic 这个地址会被当成静态服务器访问

这里加入了proxy网络(traefik的网络)所以没有开外部端口映射,全部都在Docker里访问,你要是有直接访问的需求映射一下也成

version: "3.8"

services:
  static-server:
    image: busybox:latest
    container_name: static-server
    command: ["httpd", "-f", "-p", "80", "-h", "/static"]
    volumes:
      - /opt/dockerdata/httpstatic:/static:ro
    networks:
      - proxy
    restart: unless-stopped

networks:
  proxy:
    external: true

 

需要实现的目的是,静态服务器为第一优先级,只有在静态服务器访问不到时,才去访问后端服务

我的 Traefik 的配置全在 dynamic.yml 中,因为我在Docker里启动时,就是这么启动的,监听该文件作为配置

- "--providers.file.filename=/etc/traefik/dynamic.yml"

- "--providers.file.watch=true"

所以我改的是这个文件,而不是Docker启动环境变量,不管你的是什么配置,只要逻辑和我一致基本就大差不差

 

为了实现对应效果,直接写一个路由方案即可,把对应路径的无脑代理到本地静态文件服务(busybox),其他路径放行,该去哪去哪

在 http.routers 里加入:

static-router:
  entryPoints: [web]
  rule: "Host(`www.yourhost.com`) && (Path(`/.well-known/acme-challenge/{any:.*}`) || Path(`/ads.txt`) || PathPrefix(`/static/`))"
  service: static-svc
  priority: 1000

规则指定为www域名 + 该域名下的指定路径。然后 priority 优先级拉满。

上面配置的 static-svc 就是你需要在 http.services 中该配置的服务本身了

services:
  static-svc:
    loadBalancer:
      servers:
        - url: "http://static-server:80"

 

至此已经实现目的。

总的来说,代理本地的静态文件,你用Traefik需要绕这么一道,比Nginx要麻烦一点点,但也不至于麻烦太多。

 

 

 

           


CAPTCHAis initialing...
EA PLAYER &

历史记录 [ 注意:部分数据仅限于当前浏览器 ]清空

      00:00/00:00