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要麻烦一点点,但也不至于麻烦太多。
