[providers]
提供者发现您的基础环境上存在的服务(它们的IP,运行状况等)[entryPoints]
入口点侦听传入流量(端口等)[http.routers]
路由器分析请求(主机,路径,headers,SSL等)[http.middlewares]
服务将请求转发到您的服务(负载均衡,...)[http.services]
中间件可以更新请求或根据请求做出决策(身份验证,速率限制,标头等)。
和之前的版本一样,Traefik v2 中的配置依然可以使用两种不同的方式:
静态配置:不经常修改的启动配置
包含提供者定义,并定义 Treafik 将要监听的入口点。
动态配置:可经常修改的路由配置
包含定义系统如何处理请求的所有配置内容。这些配置是可以改变的,而且是无缝热更新的,没有任何请求中断或连接损耗。
静态配置有如下三种不同的互斥方式(您只能同时使用一种),可以在Traefik中定义静态配置选项:
如果没有为给定选项提供任何值,那么将应用默认值。此外,如果选项具有子选项,并且未指定任何这些子选项,则默认值也将适用。
例如,--providers.docker这个父选项只要存在,即使没有设置--providers.docker.endpoint这个子选项,该父选项本身也足以启用docker提供程序,并默认设置了--providers.docker.endpoint = "unix:///var/run/docker.sock"。因为父选项--providers.docker将设置(并重置)所有子选项的默认值。
由于完全采用traefik.toml文件的方式来配置,所以docker这边没有用到labels标签,这样做的好处是更加安全,也方便管理。
version: "3.7"
services:
traefik_proxy:
hostname: traefik
image: traefik:v2.0
container_name: proxy-traefik
restart: always
networks:
- traefik
- internal
ports:
- "80:80"
- "443:443"
- "8090:8080"
volumes:
- ./traefik/traefik.toml:/etc/traefik/traefik.toml #用文件的方式来配置
- ./traefik/log:/var/log
- ./traefik/dynamic_conf.toml:/dynamic_conf.toml #加载动态配置
- ./traefik/ssl:/ssl #导入ssl证书
web_hbxin:
hostname: hbxin
image: nginx
container_name: web-hbxin
restart: always
command: [nginx, '-g', 'daemon off;']
networks:
- traefik
- internal
volumes:
- ./nginx/conf/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
- ./share/wwwroot:/usr/share/nginx/wwwroot
- ./share/rewrite:/usr/share/nginx/rewrite
api_iqiar:
hostname: iqiar
build: ./go
container_name: api-iqiar
restart: always
networks:
- traefik
- internal
depends_on:
- mysql
networks:
traefik:
name: traefik
internal:
name: internal
#声明入口点
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.https]
address = ":443"
[entryPoints.traefik]
address = ":8080"
#声明提供者
[providers]
#docker作为提供者,默认配置需要共享套接字,因此会不安全,所以这里注释掉了,没有启用
#[providers.docker]
#exposedByDefault = false #关闭对Docker容器的自动发现,默认是true
#关闭后需要在docker-compose里面单独对某个容器加入- "traefik.enable=true" 标签,容器才能被发现。
#endpoint = "unix:///var/run/docker.sock"
#文件作为提供者
[providers.file]
filename = "dynamic_conf.toml" #加载动态文件配置
watch = true #允许Traefik自动监视文件更改
[api]
dashboard = true #开启WEB面板
insecure = true #开启不安全模式
#debug = true
[log]
#level = "DEBUG"
filePath = "/var/log/debug.log"
[accessLog]
filePath = "/var/log/access.log"
bufferingSize = 100 #文件自动分割
[[tls.certificates]]
#这里文件名需注意,要与域名匹配
certFile = "./ssl/api.huangbin.xin.pem"
keyFile = "./ssl/api.huangbin.xin.key"
[[tls.certificates]]
# 这里文件名需注意,要与域名匹配
certFile = "./ssl/huangbin.xin.pem"
keyFile = "./ssl/huangbin.xin.key"
#路由配置
[http.routers]
#API网站
#声明一个名为api_dev的路由,主要用于本地调试
[http.routers.api_dev]
#未指明入口点,则默认针对全部入口点
#路由规则是匹配特定域名
rule = "Host(`api.localhost`)"
#路由指向一个名为service-api的服务
service = "service-api"
#声明一个名为api_prod_tls的路由,针对https,并开启TLS
[http.routers.api_prod_tls]
#针对名为https的入口点
entryPoints = ["https"]
rule = "Host(`api.huangbin.xin`)"
service = "service-api"
#针对这个路由开启TLS
[http.routers.api_prod_tls.tls]
#声明一个名为api_prod的路由,与上面同样的域名,但会强制将http请求重定向跳转到上面定义的https入口点
[http.routers.api_prod]
#针对名为http的入口点
entryPoints = ["http"]
#相比上文的路由,这里加了一个中间件,处理重定向
middlewares = ["tls-redirect"]
rule = "Host(`api.huangbin.xin`)"
service = "service-api"
[http.routers.web_default]
rule = "Host(`localhost`)"
service = "service-web"
#坑点一个,以下同一个域名同时面对两个规则,优先级priority的值默认都是0,那么取规则最长的路由
[http.routers.web_dev_long]
rule = "HostRegexp(`*.localhost`)"
service = "service-web"
priority = 0
[http.routers.web_dev]
rule = "Host(`hb.localhost`)"
service = "service-web"
priority = 0
#主站,配置与上文大同小异,进修改了域名和服务名
[http.routers.web_prod_tls]
#由于下文已经存在了TLS节点,所以这里即使不写entryPoints = ["https"],也仍然会只处理https请求,忽略http请求,而且Traefik将终止SSL连接,直接将解密的数据发送到services
rule = "Host(`huangbin.xin`)"
service = "service-web"
[http.routers.web_prod_tls.tls]
[http.routers.web_prod]
entryPoints = ["http"]
middlewares = ["tls-redirect"]
rule = "Host(`huangbin.xin`)"
service = "service-web"
#中间件配置
[http.middlewares]
#重定向方案,将http强制跳转到https
[http.middlewares.tls-redirect.redirectScheme]
#重定向到入口点https
scheme = "https"
#开启301永久重定向
permanent = true
#服务配置
[http.services]
#声明一个名为service-api的服务
[http.services.service-api]
#声明一组负载均衡器
[http.services.service-api.loadBalancer]
#声明一台服务器
[[http.services.service-api.loadBalancer.servers]]
url = "http://api_iqiar/" #官方文档没有讲明白,注意这里需填写可以被traefik访问到的url地址,这里api_iqiar是我的docker容器名称,还可以改为服务器host或者ip
#再声明另一台服务器,组成负载均衡
[[http.services.service-api.loadBalancer.servers]]
url = "http://api_iqiar_2/"
[http.services.service-web]
[http.services.service-web.loadBalancer]
[[http.services.service-web.loadBalancer.servers]]
url = "http://web_hbxin/"
使用docker标签配置,需要共享套接字,这会不安全,如果非要使用,可以参考下文链接:
开一个socat节点:https://blog.mikesir87.io/2018/07/letting-traefik-run-on-worker-nodes/
使用客户端证书进行身份验证:https://docs.docker.com/engine/security/https/