Traefik HTTP中间件(二)
1.概述
附加到路由器的中间件是一种在请求发送到您的服务之前(或在服务的答案发送到客户端之前)调整请求的方法。
Traefik 中有几个可用的中间件,有的可以修改请求、headers,有的负责重定向,有的添加认证等等。
使用相同协议的中间件可以组合成链以适应各种场景。
1.1可用的中间件
中间件 | 目的 | 区域 |
---|---|---|
AddPrefix | 添加一个路径前缀 | 路径修改器 |
BasicAuth | 添加基本认证 | 安全、认证 |
Buffering | 缓冲请求/应答 | 请求生命周期 |
Chain | 结合多个中间件 | 其他的 |
CircuitBreaker | 防止调用不健康的服务 | 请求生命周期 |
Compress | 压缩响应 | 内容修饰符 |
ContentType | 处理 Content-Type 内容类型的自动检测 | 其他的 |
DigestAuth | 增加摘要认证 | 安全、认证 |
Errors | 自定义错误页面 | 请求生命周期 |
ForwardAuth | 代表身份验证 | 安全、认证 |
Headers | 添加/更新Headers头 | 安全 |
IPWhiteList | 限制允许的IP | 安全、请求生命周期 |
InFlightReq | 限制同时连接的数量 | 安全、请求生命周期 |
PassTLSClientCert | 在Headers头中添加Client证书 | 安全 |
RateLimit | 限制调用频率 | 安全、请求生命周期 |
RedirectScheme | 基于方案的重定向 | 请求生命周期 |
RedirectRegex | 基于正则表达式的重定向 | 请求生命周期 |
ReplacePath | 改变请求路径 | 路径修改器 |
ReplacePathRegex | 正则改变请求路径 | 路径修改器 |
Retry | 发生错误时自动重试 | 请求生命周期 |
StripPrefix | 改变请求路径 | 路径修改器 |
StripPrefixRegex | 正则改变请求路径 | 路径修改器 |
2.Add Prefix
路径前缀
AddPrefix中间件在转发请求之前更新请求的路径
2.1配置示例
2.2配置选项
2.2.1prefix
prefix是要在请求的 URL 中的当前路径之前添加的字符串。它应该包括一个前导斜杠 ( /)
3.BasicAuth
添加基本身份验证
BasicAuth 中间件将您的服务的访问权限限制为已知用户
3.1配置示例
3.2配置选项
3.2.1General
密码必须使用 MD5、SHA1 或 BCrypt 进行哈希处理(用于htpasswd生成密码)
3.2.2users
该users选项是一组授权用户。必须使用该name:hashed-password格式声明每个用户。
3.2.3usersFile
usersFile选项是指向外部文件的路径,该文件包含中间件的授权用户
文件内容是一个名称列表name:hashed-password,例如以下文件内容:
3.2.4realm
你可以使用领域选项自定义用于身份验证的领域.缺省值为traefik.
3.2.5headerField
你可以使用headerField定义一个报头字段来存储经过身份验证的用户.
3.2.6removeHeader
设置 removeHeader 选项为 true,可以将请求转发到你的服务之前删除授权得 Header.(默认值为 false)
4.Buffering
如何在转发前阅读请求
缓冲中间件限制了可以转发给服务的请求的大小.
通过缓冲,Traefik将整个请求读入内存(可能将大型请求缓冲到磁盘),并拒绝超过指定大小限制的请求.
这可以帮助服务避免大量的数据(例如multipart/form-data),并且可以最大程度地减少将数据发送到服务所花费的时间。
4.1配置示例
4.2配置选项
4.2.1maxRequestBodyBytes
使用 maxRequestBodyBytes 选项, 可以配置允许的请求的最大请求体(以字节为单位).
如果请求超过允许的大小,则不会将其转发到服务,并且客户端会收到 413 (Request Entity Too Large) 响应.
4.2.2memRequestBodyBytes
可以使用 memRequestBodyBytes 选项配置一个阈值(以字节为单位),低于该阈值的请求会缓存到内存,而超过该阈值的请求将缓存到磁盘上.
4.2.3maxResponseBodyBytes
使用 maxReesponseBodyBytes 选项,可以配置服务允许的最大响应大小(以字节为单位)。
如果响应超出允许的大小,则不会转发给客户端。 客户端改为收到 413 (Request Entity Too Large) 响应.
4.2.4memResponseBodyBytes
可以使用 memResponseBodyBytes 选项配置一个阈值(以字节为单位),低于该阈值的响应会缓存到内存,而超过该阈值的响应将缓存到磁盘上.
4.2.5retryExpression
可以在 retryExpression 选项的帮助下使缓存中间件重试该请求.
重试表达式定义为以下函数与运算符 AND(&&)和 OR(||)的逻辑组合。 至少需要一个函数:
- Attempts() 尝试次数(第一个计数)
- ResponseCode() 服务的响应码
- IsNetworkError() - 如果响应码与网络错误有关
5.Chain
当一个中间件还不够时
链式中间件使您能够定义其它中间件的可重用组合, 这使得重用相同的组更加容易.
5.1配置示例
例如,由 WhiteList、BasicAuth 和 HTTPS 组成链式中间件
6.CircuitBreaker
别浪费时间调用不健康得服务
断路器可以保护你的系统免于将请求堆积到不正常的服务(导致级联故障)上.
当系统运行状况良好时,电路处于关闭状态(正常运行).当系统运行不正常的时候,电路将断开,并且不再转发请求(而是由后备机制进行处理)
为了评估系统的健康状态,断路器会不断监测你的服务
6.1配置示例
6.1.1断路器有三种可能的状态
- Closed:服务正常运行
- Open:后备机制接管你的服务
- Recovering:断路器试图通过逐步向你的服务发送请求来恢复正常运行
6.1.2Closed
当电路关闭时,断路器只收集指标来分析请求的行为.
在指定的时间间隔(checkPeriod),断路器评估表达式以决定其状态是否必须改变.
6.1.3Open
当开放时,回退机制在FallbackDuration的持续时间内接管正常的服务调用。在这个持续时间之后,它进入恢复状态
6.1.4Recovering
在恢复期间,断路器向你的服务发送线性增加的请求量(为RecoveryDuration)。如果你的服务在恢复期间出现故障,断路器会再次打开。如果服务在整个恢复期间正常运行,那么断路器就会关闭.
6.2配置选项
6.2.1Configuring the Trigger 配置触发器
你可以指定一个表达式,一旦匹配,就会打开断路器并应用回退机制而不是调用你的服务.
表达式选项可以检查三个不同的指标:
- 网络错误率(NetworkErrorRatio)
- 状态代码比率(ResponseCodeRatio)
- 以毫秒为单位的四分位数的延迟(LatencyAtQuantileMS)
NetworkErrorRatio
如果你想让断路器在30%的网络错误率下触发,表达式将是
ResponseCodeRatio
你可以根据给定的状态代码范围的比率来触发断路器,ResponseCodeRatio接受四个参数:
- from
- to
- dividedByFrom
- dividedByTo
将被计算的操作是sum(to -> from) / sum (dividedByFrom -> dividedByTo)
例如,表达式ResponseCodeRatio(500, 600, 0, 600)>0.25,如果25%的请求返回5XX状态(在返回0到5XX状态代码的请求中),将触发断路器.
LatencyAtQuantileMS
你可以在给定比例的请求变得太慢时触发断路器。例如,表达式LatencyAtQuantileMS(50.0)>100将在中位延迟(50分位数)达到100MS时触发断路器。
你必须为四分位值提供一个浮点数(尾数为.0)
Using multiple metrics
你可以在表达式中使用运算符组合多个指标,支持的运算符是:
- AND (&&)
- OR (||)
例如:ResponseCodeRatio(500, 600, 0, 600) > 0.30 || NetworkErrorRatio() > 0.10 当30%的请求返回5XX状态代码,或者当网络错误比例达到10%时,就会触发断路器
Operators
下面是支持的运算符的列表:
- 大于 (>)
- 大于或等于 (>=)
- 小于 (<)
- 小于或等于 (<=)
- 等于 (==)
- 不等于 (!=)
6.2.2Fallback mechanism
回退机制向客户端返回 HTTP 503 Service Unavailable(而不是调用目标服务)。这种行为不能被配置
6.2.3CheckPeriod
用于评估表达式并决定断路器的状态是否必须改变的时间间隔。默认情况下,CheckPeriod是100ms。这个值不能被配置
6.2.4FallbackDuration
回撤时间默认情况下,FallbackDuration是10秒。这个值不能被配置.
6.2.5RecoveringDuration
恢复模式(恢复状态)的持续时间默认情况下,RecoveringDuration是10秒。这个值不能被配置.
7.Compress
将响应压缩之后在发送给客户端
Compress 中间件启用 gzip 压缩
7.1配置示例
响应在以下情况下会被压缩:
- 响应体大于 1400 字节
- Accept-Encoding 请求头包含 gzip
- 响应尚未压缩,即尚未设置 Content-Encoding 响应头
7.2配置选项
7.2.1excludedContentTypes
excludedContentTypes 指定一系列内容类型,以便在压缩之前将传入请求的 Content-Type 请求头与之对比.
请求中 excludedContentTypes 定义的内容类型不会被压缩.
内容类型压缩时忽略大小写和空格.
8.DigestAuth
增加 Digest 身份认证
DigestAuth 中间件是一种将访问权限限制到已知用户的快速方法
8.1配置示例
8.2配置选项
使用 htdigest 生成密码
8.2.1users
The users 是授权用户的数组。每个用户需要使用这种 **name:realm:encoded-password **格式声明。
- 如果同时提供了 users 和 usersFile,则两者将合并。usersFile 的内容优先于 users 中的值。
- 出于安全原因,Kubernetes IngressRoute 的用户字段 users 不存在,而应该使用 secret 字段。
8.2.2usersFile
usersFile 选项是指向外部文件的路径,该文件包含中间件的授权用户。
文件内容是 **name:realm:encoded-password **格式的列表。
一个包含test/test和test2/test2的文件:
8.2.3realm
可以使用 realm 选项自定义身份验证领域。 默认值为 traefik。
8.2.4headerField
可以使用 headerField 选项为经过身份验证的用户自定义标题字段。
8.2.5removeHeader
将 removeHeader 选项设置为 true 以在将请求转发到您的服务之前删除授权标头。 (默认值为 false )
9.ErrorPage
说出错误从来没有这么容易过!
ErrorPage中间件根据HTTP状态码的配置范围返回一个自定义页面来代替默认页面。
注意:错误页面本身不是由Traefik托管的
9.1配置示例
在例子中,错误页面URL基于状态代码 (query=/{status}.html).
9.2配置选项
9.2.1status
status选项定义了哪些状态或状态范围会导致错误页面。状态代码范围是包含的(500-599将触发500到599之间的每个代码,包括500到599)。
注意:可以将状态码定义为一个数字(500)、多个用逗号分隔的数字(500,502)、两个代码之间用破折号(500-599)分隔的范围或两者的组合(404,418,500-599)。
9.2.2service
将提供新请求的错误页面的服务,在Kubernetes中,需要引用Kubernetes服务而不是Traefik服务。
注意:Host Header 缺省情况下,客户端Host头值被转发到配置的错误服务。要转发与配置的错误服务URL对应的Host值,passHostHeader选项必须设置为false
9.2.3query
错误页面的URL(由service托管)。你可以在query选项中使用{status}变量,以便在URL中插入状态代码.
10.ForwardAuth
使用外部服务来转发认证
ForwardAuth中间件将认证委托给一个外部服务。如果该服务的回答是2XX代码,则允许访问,并执行原始请求。否则,将返回认证服务器的响应。
10.1配置示例
10.2Forward-Request Headers
以下请求属性将作为 **X-Forwarded- **头信息提供给forward-auth目标端点。
属性 | 转发请求标头 |
---|---|
HTTP Method | X-Forwarded-Method |
Protocol | X-Forwarded-Proto |
Host | X-Forwarded-Host |
Request URI | X-Forwarded-Uri |
Source IP-Address | X-Forwarded-For |
10.3配置选项
10.3.1address
地址选项定义了认证服务器地址
10.3.2trustForwardHeader
将trustForwardHeader选项设置为true,以信任所有X-Forwarded-*头
10.3.3authResponseHeaders
authResponseHeaders选项是要从认证服务器响应中复制并在转发请求中设置的头信息列表,替换任何现有的冲突头信息。
10.3.4authResponseHeadersRegex
authResponseHeadersRegex选项是匹配头信息的正则表达式,用于从认证服务器的响应中复制并在转发的请求中设置,在剥离所有匹配正则表达式的头信息后。它允许部分匹配正则表达式与头文件的密钥。应该使用字符串的开头(^)和字符串的结尾($)锚,以确保与头文件键完全匹配。
提示:
- 正则表达式和替换可以使用在线工具,如Go Playground或Regex101进行测试。
- 在YAML中定义正则表达式时,任何转义字符都需要转义两次: example.com需要写成 example\.com。
10.3.5authRequestHeaders
authRequestHeaders选项是要从请求中复制到认证服务器的头文件列表。它允许过滤那些不应该被传递给认证服务器的头信息。如果没有设置或为空,那么所有的请求头信息都会被传递。
10.3.6tls(可选)
定义了用于与认证服务器安全连接的TLS配置
ca(可选)
ca是用于与认证服务器安全连接的证书颁发机构的路径,它默认为系统捆绑。
caOptional(可选)
caOptional的值定义了TLS客户端认证与认证服务器的安全连接应该使用哪个策略。
注意:如果ca是未定义的,这个选项将被忽略,在握手过程中不会要求客户证书。因此,任何提供的证书将永远不会被验证。
当该选项被设置为 true 时,在握手过程中会要求提供客户证书,但不一定需要。如果发送了证书,它必须是有效的。
当该选项设置为 **false **时,在握手过程中会要求提供客户证书,并且客户应该至少发送一份有效的证书。
cert(可选)
cert是用于与认证服务器安全连接的公共证书的路径。使用该选项时,需要设置key选项。
注意:出于安全原因,Kubernetes IngressRoute不存在该字段,应该使用秘密字段来代替。
key(可选)
key是用于与认证服务器安全连接的私人密钥的路径。使用该选项时,需要设置cert选项。
注意:出于安全原因,Kubernetes IngressRoute不存在该字段,应该使用秘密字段来代替。
insecureSkipVerify(可选,默认false)
如果 **insecureSkipVerify **为 **true **,则与认证服务器的TLS连接接受服务器提交的任何证书,而不考虑其涵盖的主机名。
__EOF__

本文链接:https://www.cnblogs.com/rxg456/p/16247721.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2021-05-09 五种IO模型和三种实现方式