ARR 进阶
[========]
ARR 进阶
使用请求条件和服务器变量
URL Rewrite 可以借助服务器参数实现对 url 的筛选。
URL 结构: http(s)://<host>:<port>/<path>?<querystring>
可以在 ARR 中使用服务端参数获取 URL 中某部分。
服务端参数说明:
- HTTP_HOST ->
<host>
- SERVER_PORT ->
<port>
- PATH_INFO ->
/<path>
- QUERY_STRING ->
<querystring>
- REQUEST_URI ->
/<path>?<querystring>
- URL ->
http(s)://<host>:<port>/<path>?<querystring>
更多服务器变量参考:
https://docs.microsoft.com/en-us/previous-versions/iis/6.0-sdk/ms524602(v=vs.90)
重写指定端口的请求
下面的示例通过配置 URL 重写规则,以达到监听本机80端口负载到本机其他端口的效果。
- URL 匹配
- 匹配条件,针对80端口号(80默认不包含在url中)
- 通过服务器场负载
替换请求 URL
下面的示例替换了请求的 host 和 port。
实现将http://localhost/b/1.html
地址转向http://10.99.59.47:8081/b/1.html
使用模板
https://docs.microsoft.com/zh-cn/iis/extensions/url-rewrite-module/url-rewrite-module-configuration-reference#rewrite-maps
可以将符合重写条件的 url 和替换内容使用键值对的方式配置在rewriteMaps
,只能进行纯文本的比较,不能使用模式匹配。
如下的web.config
:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rewriteMaps>
<rewriteMap name="StaticRewrites" defaultValue="">
<add key="/diagnostics" value="/default.aspx?tabid=2&subtabid=29" />
<add key="/webcasts" value="/default.aspx?tabid=2&subtabid=24" />
<add key="/php" value="/default.aspx?tabid=7116" />
</rewriteMap>
</rewriteMaps>
<rules>
<rule name="Rewrite Rule" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="{StaticRewrites:{REQUEST_URI}}" pattern="(.+)" />
</conditions>
<action type="Redirect" url="http://www.aaa.com{C:1}" redirectType="Found" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
- The requested URL http://localhost:8081/diagnostics will be Redirect as http://www.aaa.com:8081/default.aspx?tabid=2&subtabid=29.
- The requested URL http://localhost/webcasts will be Redirect to http://www.aaa.com/default.aspx?tabid=2&subtabid=24.
- The requested URL http://localhost/php will be Redirect to http://www.aaa.com/default.aspx?tabid=7116.
- 如果 URL 不能匹配映射中的 key,重写映射将返回一个与条件模式不匹配的空字符串,因此将不执行规则操作。
ARR 代理功能
请求由左向右,左边为正向代理,右边为反向代理。
正向代理,它处理来自客户端的出站请求,将其转发到Internet,并将生成的响应返回给客户端。
反向代理,它处理来自Internet的传入请求,将其转发给后端工作程序,然后将响应返回给Internet。
正向代理
ARR 正向代理 不支持 HTTPS(443)消息,因为ARR不支持HTTP CONNECT。
参考:https://docs.microsoft.com/zh-cn/iis/extensions/configuring-application-request-routing-arr/creating-a-forward-proxy-using-application-request-routing
反向代理
path 中包含 61 的 URL 会被转发到其他服务器
- 开启 ARR 代理
- 配置 URL 重写规则
上面的 URL 重写规则对应配置文件(web.config)格式:
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="ReverseProxy61" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="http://10.29.80.9:8010/{R:1}" />
<conditions>
<add input="{PATH_INFO}" pattern=".*/(61)/?.*" />
</conditions>
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
使用缓存
内存缓存
默认情况下 ServerFarm 中启用了内存缓存,
发生请求时,如果代理机没有缓存内容,则将请求转发到实际服务器,可以看到下图实际只有两次请求转发到了实际服务器,
可以通过命令netsh http show cache
查看缓存状态:
注意缓存生存时间和请求队列名称
磁盘缓存
使用磁盘缓存,可以针对静态文件在代理服务器进行缓存,已有缓存不需要转发请求到实际服务器。
- 选择服务器节点下的 Application Request Routing Cache
- 选择右侧增加驱动设备
- 设置一个本地磁盘路径
- 管理缓存配置,分片、压缩、缓存时间等
- ServerFarm 中启用磁盘缓存
- 发送请求后可以看到磁盘保存了缓存文件
- 监控中可以看到命中了磁盘缓存,不会请求去到原始服务器
注意请求顺序是:
- 代理机内存缓存
- 磁盘缓存
- 原始服务器
请求合并功能 enable request consolidation
为解决当缓存节点上发生级联的缓存缺失并且所有请求都转发到原始服务器时,如何保护原始服务器的问题。
参考:https://docs.microsoft.com/en-us/iis/extensions/configuring-application-request-routing-arr/configure-request-consolidation-feature-in-application-request-routing
缓存阵列
ARR 的高可用和水平扩展
结合 NLB 和 外部缓存,配置多台 ARR 服务器,用以实现高可用和水平扩展
https://docs.microsoft.com/zh-cn/iis/extensions/configuring-application-request-routing-arr/achieving-high-availability-and-scalability-arr-and-nlb