IIS ARR 反向代理:把 Node、Java、Python 放到 IIS 后面
安装 ARR 与 URL Rewrite,开启代理,创建服务器场,保留 Host/X-Forwarded 头,并避免把 IIS 变成开放代理。
测试环境Standard / Datacenter · 版本号 26100.33650 · x64
E1- 版本号
- 26100.33650
- 版本
- Standard / Datacenter
- 架构
- x64
- 支持
- 文档(E1)
- 证据
- E1官方文档
- 核验日期
- 2026-10-29
- 页面类型
- 任务
ARR(Application Request Routing)把 IIS 变成反向代理:把请求转给上游服务器/服务器场,再把响应带回来。
适用:
- IIS 终止 TLS,Node/Java/Python 监听
127.0.0.1:3000; - 一个域名后面有多台应用服务器;
- 想在 Kestrel/Tomcat 前面用 IIS 的日志/压缩/健康检查。
不要只用 URL Rewrite:重写改变 IIS 服务的 URL;ARR 才转发到另一台服务器。
ARR 依赖 URL Rewrite。安装两个 x64 模块后:
Get-WebGlobalModule -Name ApplicationRequestRoutingGet-WebGlobalModule -Name RewriteModuleIIS 管理器 → 服务器 → Application Request Routing Cache → Server Proxy Settings → 启用代理。不开这个,农场规则会 404/502。
- Server Farms → Create Server Farm。
- 加
127.0.0.1:3000(或应用服务器)。 - 健康测试:一个不需要认证、返回 200 的路径。
- 代理设置:保留 Host,转发
X-Forwarded-For/X-Forwarded-Proto。 - 建 URL Rewrite 规则,把站点路由到农场。
最小规则形态:
<rule name="Proxy to app" stopProcessing="true"> <match url="(.*)" /> <action type="Rewrite" url="http://appfarm/{R:1}" /></rule>action 里的农场名必须和 ARR 农场一致,不是随便一个主机名。
- 保留
Host,应用才能生成正确的绝对 URL。 - 转发
X-Forwarded-Proto,应用才知道客户端用的是 HTTPS。 - 应用跳到
http://或内部主机名时,修应用的 trusted proxy 设置;不要全局关 HTTPS 跳转。 - WebSocket 需要 ARR/URL Rewrite 支持和匹配的超时。
curl.exe -I https://lab.example/curl.exe -H "Host: lab.example" http://127.0.0.1/Get-WebConfigurationProperty -PSPath 'MACHINE/WEBROOT/APPHOST' ` -Filter 'system.webServer/rewrite/rules' -Name '.'检查:
- 响应来自上游(应用头/内容);
X-Forwarded-For到应用;- 重定向用公网主机名;
- 上游挂了返回受控 502/503,不是一直挂起。
什么时候不用 ARR
Section titled “什么时候不用 ARR”- 静态站:IIS 本身够。
- Windows 边缘要 HTTP/3:ARR/IIS 的 HTTP/3 支持看版本,必须实测,不能假设。
- 大规模反向代理:Linux Nginx/HAProxy 往往更合适。ARR 是 Windows 上方便,不是万能负载均衡。
本页 E1。实验室装了 IIS 和 PHP,但没装 ARR;没有复现上游农场或头测试。Server 2025 上装通再升级 E2。