entrypoint 是trafik 的網絡入口。能夠經過端口,SSL,重定向來定義前端
[entryPoints] [entryPoints.http] address = ":80" [entryPoints.http.redirect] entryPoint = "https" [entryPoints.https] address = ":443" [entryPoints.https.tls] [[entryPoints.https.tls.certificates]] certFile = "tests/traefik.crt" keyFile = "tests/traefik.key"
如上例子,定義了兩個entrypoint ,一個http , 一個https。他們的端口分別是80和443。經過給定證書和key文件來啓用ssl,並rewrite全部的http entrypoint的請求到https正則表達式
一個frontend 定義了一組規則來決定如何轉發到後端的入口。
規則分爲兩種:Modifiers 和 Matchers算法
Modifier規則只修改請求,它們對正在作出的路由決策沒有任何影響,下列是已經存在的modifier規則:json
AddPrefix: /products:爲請求URL路徑添加前綴 ReplacePath: /serverless-path:替換path,並把老的path添加到X-Replaced-Path頭 ReplacePathRegex: ^/api/v2/(.*) /api/$1:
Matchers 用來定義是否將特定的請求轉發到後端
用,分割的兩個規則表示或, 知足之一便可
使用;分割的規則表示與,須要所有知足後端
Headers: Content-Type, application/json: 經過 Headers 能夠添加一個匹配規則來匹配請求頭部包含的值。它接受要匹配的鍵/值對序列。 HeadersRegexp: Content-Type, application/(text|json): 也能夠在 Headers 中使用正則表達式。它接受要匹配的鍵/值對序列,序列內容解析是經過正則匹配的 Host: traefik.io, www.traefik.io: 匹配請求 Host 必需在給定域名列表內。 HostRegexp: traefik.io, {subdomain:[a-z]+}.traefik.io: 添加匹配請求 Host 的正則表達式。 它接受一個以{}包括起來的爲空或更多url變量的模版。變量的值能夠以一個可選的正則表達式來匹配。 Method: GET, POST, PUT: Method 能夠添加一個HTTP請求方法的匹配。它接受要匹配的一個或多個請求方法序列。 Path: /products/, /articles/{category}/{id:[0-9]+}: Path 能夠添加一個URL路徑的匹配。它接受一個以{}包括起來的爲空或更多url變量的模版。 PathStrip: /products/ 和 Path 相同,但從請求的URL路徑中去掉的給定的前綴。 PathStripRegex: /articles/{category}/{id:[0-9]+} 匹配精確的路徑,並在轉發到後端前剝離路徑,接受一組文字和正則路徑 PathPrefix: /products/, /articles/{category}/{id:[0-9]+} PathPrefix 能夠添加一個URL路徑前綴的匹配。它匹配給定模版中的完整URL路徑前綴。 PathPrefixStrip: /products/ 和 PathPrefix 相同,但從請求的URL路徑中去掉的給定的前綴。 PathPrefixStripRegex: /articles/{category}/{id:[0-9]+} 匹配路徑前綴,並在轉發到後端前剝離路徑,接受一組文字和正則路徑,從trafik 1.3開始,剝離的路徑將會傳遞到X-Forwarded-Prefix 頭。 Query: foo=bar, bar=baz 匹配查詢對象,接受k=v的格式
使用Host 和Path Matchers時,你必須聲明一個任意命名的變量,後跟冒號分隔的正則表達式,例如:/posts/{id:[0-9]+}
例子中的id 並無實際含義, 但你必須定義。
你能夠啓用passHostHeader變量來轉發客戶端的Host頭到backend,您還能夠選擇配置passTLSClientCert選項,以將客戶端證書到特定header中傳遞給後端。api
若是backend 監聽的根路徑(/),但也須要路由特定的前綴。 請使用Strip,例如PathPrefixStrip: /products, 將匹配/products、/products/shoes、/products/shirts,因爲路徑被剝離,所以backend 須要在/監聽
若是後端是靜態資源服務。它必須返回正確構造的相對URL。
繼續這個例子,後端應該返回/products/shoes/image.png(而不是/images.png,Traefik可能沒法與同一個後端關聯)。能夠經過查詢請求中的X-Forwarded-Prefix 頭來動態構造url服務器
當Modifier 和 Matcher 組合使用時,Matcher 規則將始終在Modifier 規則前生效。
下面的規則便是Matcher 也是Modifier,所以Matcher 應用在前,Modifier 應用在後cookie
- PathStrip - PathStripRegex - PathPrefixStrip - PathPrefixStripRegex
不管規則配置部分的順序如何, 修改器將以預約順序應用網絡
- PathStrip - PathPrefixStrip - PathStripRegex - PathPrefixStripRegex - AddPrefix - ReplacePath
默認狀況下,將使用規則長度(以免路徑重疊)對路由進行排序(以降序排序): - PathPrefix:/ foo;主機:foo.com(length == 28)將在PathPrefixStrip以前匹配:/ foobar(length == 23)將在PathPrefix:/ foo,/ bar(length == 20)以前匹配。
優先級值0將被忽略,所以將計算默認值(規則長度)。
能夠在frontend 中自定義優先級,自定義的優先級將覆蓋規則長度的計算結果
例如:session
[frontends] [frontends.frontend1] backend = "backend1" priority = 20 passHostHeader = true [frontends.frontend1.routes.test_1] rule = "PathPrefix:/to" [frontends.frontend2] backend = "backend2" passHostHeader = true [frontends.frontend2.routes.test_1] rule = "PathPrefix:/toto"
frontend1 將首先匹配(20>16)
能夠經過前端配置自定義header,以將header添加到與前端規則匹配的請求或響應中。
這容許將諸如X-Script-Name之類的header添加到請求中,或者將自定義header添加到響應中。
若是自定義header名稱與請求或響應的一個header名稱相同,則將替換它
例子1:路徑/cheese的全部匹配都會將X-Script-Name標頭添加到代理請求中,並將X-Custom-Response-Header標頭添加到響應中。
[frontends] [frontends.frontend1] backend = "backend1" [frontends.frontend1.headers.customresponseheaders] X-Custom-Response-Header = "True" [frontends.frontend1.headers.customrequestheaders] X-Script-Name = "test" [frontends.frontend1.routes.test_1] rule = "PathPrefixStrip:/cheese"
backend負責未來自一個或多個前端的流量負載平衡到一組http服務器。
只使用url定義server,你也能夠經過自定義weight給每個server
支持兩種負載均衡算法:
drr:動態輪訓,增長weight 當server 的表現比其餘好。也能夠回到原來的weight ,當server 發生變化。
能夠在backend 上應用斷路器來避免故障服務器上的高負載。初始狀態是Standby(待機)。斷路器觀察統計數據,可是不修改請求。當知足某個條件,斷路器進入Tripped(跳閘)狀態。它用預約義的代碼響應或重定向到另外一個frontend (?),一旦Tripped計時器到期,斷路器進入恢復狀態並重啓全部狀態,若是條件不匹配而且恢復計時器到期,斷路器將進入Standby狀態。
能夠經過如下方式配置:
Methods:LatencyAtQuantileMS, NetworkErrorRatio, ResponseCodeRatio
Operators: AND, OR, EQ, NEQ, LT, LE, GT, GE
ResponseCodeRatio(500, 600, 0, 600) > 0.5: 監控返回 HTTP狀態碼在[500-600]之間的數量/HTTP狀態碼在[0-600]之間的數量 的比例大於0.5時,斷路條件匹配
爲了主動防止後端因高負載而不堪重負,最大鏈接限制也能夠應用於每一個後端。
能夠經過爲maxconn.amount和maxconn.extractorfunc指定一個整數值來配置最大鏈接數,這是一種策略,用於肯定如何對請求進行分類以評估最大鏈接數。
例子:
[backends] [backends.backend1] [backends.backend1.maxconn] amount = 10 extractorfunc = "request.host"
backend1 將會返回HTTP CODE 429 Too Many Requests 若是同一主機頭的請求已經有10個在處理。
extractorfunc的另外一個可能值是client.ip,它將根據客戶端源ip對請求進行分類。
最後,extractorfunc能夠獲取request.header.ANY_HEADER的值,該值將根據您提供的ANY_HEADER對請求進行分類。
兩種負載均衡都支持粘性會話。
啓用粘性會話時,會在初始請求上設置cookie。默認cookie名稱是sha1的縮寫,在後續請求中,若是客戶端仍然健康,則會將客戶端定向到存儲在cookie中的後端。若是沒有,將分配新的後端。
能夠設置健康檢查以便從LB的輪訓中剔除不健康的後端。如事後端持續返回非2XX 或者 3XX 的狀態碼。traefik 按期執行Get 請求
經過一個後端的path 和檢查週期(執定多久進行一次,默認30s)來定義一個healthcheck。每一個backend必須在5秒內響應健康檢查。
默認狀況下,使用後端服務器的端口,可是,能夠覆蓋此端口。 一個恢復的後端返回2XX 和3XX的響應將會被再次添加進Lb 的輪詢池