当前位置: 首页 > news >正文

iisARR负均衡

IIS + ARR负载均衡详细配置指南

🎯 什么是ARR(Application Request Routing)

ARR是IIS的一个扩展模块,它可以:

  • 负载均衡:将请求分发到多个服务器
  • 反向代理:隐藏后端服务器架构
  • 健康检查:自动检测服务器状态
  • 故障转移:自动切换到健康的服务器

🏗️ 架构原理图

客户端请求流程:
[用户浏览器] → [IIS主站点 + ARR] → [后端API实例们]详细流程:
用户请求: http://api.company.com/api/users↓
[IIS主站点:80端口]
[ARR模块负载均衡]↓ (轮询分发)┌─────────┼─────────┐↓         ↓         ↓
[API实例1]  [API实例2]  [API实例3]
[端口5001]  [端口5002]  [端口5003]

工作原理

  1. 接收请求:用户访问主站点(80端口)
  2. ARR处理:ARR模块根据负载均衡算法选择后端服务器
  3. 转发请求:将请求转发到选中的后端API实例
  4. 返回响应:后端处理完成后,通过ARR返回给用户
  5. 用户无感知:用户完全不知道后端有多个实例

📋 手动配置步骤

第一步:安装ARR模块

1.1 下载ARR
  • 访问 IIS官网
  • 下载 Application Request Routing 3.0
  • 或使用Web Platform Installer搜索"ARR"
1.2 安装ARR
双击安装包 → 按默认选项安装 → 重启IIS管理器
1.3 验证安装

打开IIS管理器,应该能看到:

  • 服务器级别:Application Request Routing Cache
  • 服务器级别:Server Farms(服务器场)

第二步:创建后端API实例

2.1 创建应用程序池
IIS管理器 → 应用程序池 → 右键"添加应用程序池"创建三个应用程序池:
- 名称:API-Instance-1,.NET CLR版本:无托管代码
- 名称:API-Instance-2,.NET CLR版本:无托管代码
- 名称:API-Instance-3,.NET CLR版本:无托管代码
2.2 创建网站
IIS管理器 → 网站 → 右键"添加网站"创建三个网站:
网站1:
- 网站名称:API-Instance-1
- 应用程序池:API-Instance-1
- 物理路径:C:\inetpub\wwwroot\api1
- 端口:5001网站2:
- 网站名称:API-Instance-2
- 应用程序池:API-Instance-2
- 物理路径:C:\inetpub\wwwroot\api2
- 端口:5002网站3:
- 网站名称:API-Instance-3
- 应用程序池:API-Instance-3
- 物理路径:C:\inetpub\wwwroot\api3
- 端口:5003
2.3 复制API文件到各实例
将编译好的API文件复制到:
- C:\inetpub\wwwroot\api1\
- C:\inetpub\wwwroot\api2\
- C:\inetpub\wwwroot\api3\确保每个目录都包含完整的API文件
2.4 测试各实例
测试访问:
- http://localhost:5001/api/health
- http://localhost:5002/api/health
- http://localhost:5003/api/health确保每个实例都能正常响应

第三步:配置服务器场(Server Farm)

3.1 创建服务器场
IIS管理器 → 选择服务器节点 → 双击"Server Farms"
→ 右键空白区域 → "Create Server Farm"服务器场设置:
- Server farm name: API-Farm
- 点击"Next"
3.2 添加服务器
在"Add Server"对话框中逐一添加:服务器1:
- Server address: 127.0.0.1
- HTTP port: 5001
- Weight: 100 (权重,相等表示平均分配)服务器2:
- Server address: 127.0.0.1
- HTTP port: 5002
- Weight: 100服务器3:
- Server address: 127.0.0.1
- HTTP port: 5003
- Weight: 100点击"Finish"完成
3.3 配置负载均衡算法
IIS管理器 → Server Farms → API-Farm → 双击"Load Balance"负载均衡算法选择:
○ Weighted round robin (加权轮询) - 推荐
○ Weighted total traffic (加权总流量)
○ Least current request (最少当前请求)
○ Least response time (最少响应时间)选择"Weighted round robin",点击"Apply"
3.4 配置健康检查
IIS管理器 → Server Farms → API-Farm → 双击"Health Test"健康检查设置:
- URL test: /api/health
- Interval (seconds): 30
- Timeout (seconds): 10
- Acceptable status code: 200
- Match expected response body: 可选填入"healthy"点击"Apply"
3.5 配置监控和日志
IIS管理器 → Server Farms → API-Farm → 双击"Monitoring and Management"设置:
- Enable logging: ✓ 勾选
- Log file directory: C:\inetpub\logs\LogFiles\ARR
- Enable data collection: ✓ 勾选点击"Apply"

第四步:配置URL重写规则

4.1 创建负载均衡主站点
IIS管理器 → 网站 → 右键"添加网站"主站点设置:
- 网站名称:API-LoadBalancer
- 应用程序池:DefaultAppPool
- 物理路径:C:\inetpub\wwwroot\api-lb
- 端口:80 (或其他主要端口)
4.2 在主站点创建web.config
在 C:\inetpub\wwwroot\api-lb\ 目录下创建 web.config 文件:<?xml version="1.0" encoding="utf-8"?>
<configuration><system.webServer><rewrite><rules><!-- API请求负载均衡规则 --><rule name="API Load Balance" stopProcessing="true"><match url="^api/(.*)" /><action type="Rewrite" url="http://api-farm/api/{R:1}" /></rule><!-- 健康检查规则 --><rule name="Health Check" stopProcessing="true"><match url="^health$" /><action type="Rewrite" url="http://api-farm/api/health" /></rule><!-- 默认规则 - 可选 --><rule name="Default" stopProcessing="false"><match url="(.*)" /><action type="Rewrite" url="http://api-farm/{R:1}" /></rule></rules></rewrite><!-- ARR设置 --><proxy enabled="true" /></system.webServer>
</configuration>
4.3 启用代理功能
IIS管理器 → 选择服务器节点 → 双击"Application Request Routing Cache"
→ 点击右侧"Server Proxy Settings"
→ 勾选 "Enable proxy" 
→ 点击"Apply"

第五步:测试负载均衡

5.1 基础功能测试
访问主站点:
http://localhost/api/health应该能够正常返回健康检查结果
每次刷新可能会命中不同的后端实例
5.2 负载分发测试

在每个API实例中添加标识代码:

// 在API的健康检查端点中添加实例标识
[HttpGet("health")]
public IActionResult Health()
{var instanceName = Environment.GetEnvironmentVariable("INSTANCE_NAME") ?? "unknown";var response = new{status = "healthy",instance = instanceName,timestamp = DateTime.UtcNow,server = Environment.MachineName};return Ok(response);
}
5.3 故障转移测试
1. 停止其中一个API实例的应用程序池
2. 访问 http://localhost/api/health
3. 确认请求被自动转发到其他健康实例
4. 重启停止的实例,确认重新加入负载均衡

🔧 零停机部署手动操作

场景:更新API代码

步骤1:准备新版本
1. 编译新版本API到临时目录
2. 确保新版本在开发环境测试通过
步骤2:逐一更新实例
更新实例1:
1. IIS管理器 → Server Farms → API-Farm → Servers
2. 右键 127.0.0.1:5001 → "Take Offline"
3. 等待30秒,让ARR停止向该实例发送请求
4. 停止应用程序池 "API-Instance-1"
5. 备份 C:\inetpub\wwwroot\api1 到 api1-backup-时间戳
6. 复制新版本文件到 C:\inetpub\wwwroot\api1
7. 启动应用程序池 "API-Instance-1"
8. 访问 http://localhost:5001/api/health 确认正常
9. 右键 127.0.0.1:5001 → "Bring Online"
10. 等待2分钟观察重复以上步骤更新实例2和实例3
步骤3:验证更新
1. 访问主站点确认新功能正常
2. 检查ARR日志确认负载分发正常
3. 监控一段时间确保稳定

📊 监控和管理

查看服务器场状态

IIS管理器 → Server Farms → API-Farm → Servers状态含义:
- Available: 服务器健康,正在接收请求
- Unavailable: 服务器不健康,ARR不会向其发送请求
- Offline: 手动设置为离线状态
- Draining: 正在排空现有连接,不接收新请求

查看实时统计

IIS管理器 → Server Farms → API-Farm → 双击"Monitoring and Management"可以看到:
- 当前活跃连接数
- 总请求数
- 失败请求数
- 平均响应时间
- 每个服务器的负载情况

查看日志

ARR日志位置:
C:\inetpub\logs\LogFiles\ARR\日志内容包含:
- 请求时间
- 客户端IP
- 转发到的后端服务器
- 响应状态码
- 响应时间

⚠️ 常见问题和解决方案

问题1:404错误

现象:访问主站点返回404解决方案:
1. 检查web.config中的重写规则是否正确
2. 确认Server Farm名称与重写规则中的名称一致
3. 检查是否启用了代理功能

问题2:502 Bad Gateway

现象:访问返回502错误解决方案:
1. 检查后端API实例是否正常运行
2. 查看ARR日志确认转发地址是否正确
3. 检查防火墙是否阻止了内部端口访问

问题3:负载不均衡

现象:请求总是转发到同一个实例解决方案:
1. 检查负载均衡算法设置
2. 确认各服务器权重设置是否相等
3. 检查是否启用了会话保持(Session Affinity)

问题4:健康检查失败

现象:实例显示为Unavailable解决方案:
1. 手动访问健康检查URL确认API正常
2. 检查健康检查配置的URL路径是否正确
3. 确认预期的响应内容设置

🎯 实际部署建议

生产环境配置

1. 使用独立的负载均衡服务器
2. 配置SSL证书和HTTPS重定向
3. 设置合适的超时时间
4. 启用请求日志和监控
5. 配置故障通知机制

性能优化

1. 调整应用程序池的并发连接数
2. 配置ARR的缓存策略
3. 优化健康检查频率
4. 设置合理的权重分配

安全配置

1. 限制内部端口的外部访问
2. 配置IP白名单
3. 启用请求过滤
4. 设置速率限制

通过以上详细步骤,您就可以手动配置一个完整的IIS + ARR负载均衡系统,实现API的零停机部署!

http://www.xdnf.cn/news/583705.html

相关文章:

  • 【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号
  • 在react项目中使用andt日期组件,选择周和季度,直接获取所对应的日期区间
  • C++ HTTP框架推荐
  • 人脸识别备案开启安全防护模式!紧跟《办法》!
  • uni-app学习笔记九-vue3 v-for指令
  • redis Pub/Sub 简介 -16 (PUBLISH、SUBSCRIBE、PSUBSCRIBE)
  • 【C++20新特性】ranges::sort()使用方法,优势,注意点
  • 【1004. 最大连续1的个数 III】
  • ai之pdf解析工具 PPStructure 还是PaddleOCR
  • 火山引擎火山云带宽价格
  • 【工作流】Fastgpt配置豆包模型-火山引擎
  • Github 2025-05-22Go开源项目日报 Top10
  • 【COMPUTEX 2025观察】NVIDIA开放NVLink:一场重构AI算力版图的“阳谋“
  • Go File多终端数据同步技术全解:跨设备数据管理实战指南与复杂场景处理过程
  • PostgreSQL14 +patroni+etcd+haproxy+keepalived 集群部署指南
  • C#在 .NET 9.0 中启用二进制序列化:配置、风险与替代方案
  • 模型剪枝的定义与核心作用
  • 硬件开发复盘实战指南
  • CTF签到题
  • 自制操作系统day8 (鼠标数据取得、通往32位模式之路、A20GATE、切换到保护模式、控制寄存器cr0-cr4以及cr8、ALIGNB)
  • 基于 AMDXCVU47P HBM2 FPGA 的 2 路 100G 光纤 PCIe 高性能计算加速卡
  • LabVIEW多通道液位监控
  • 框架开发与原生开发的权衡:React案例分析(原生JavaScript)
  • 【hadoop】Spark的安装部署
  • jvm安全点(五)openjdk17 c++源码垃圾回收之安全点阻塞状态线程在安全点同步中无需调用block函数的详细流程解析
  • Vue:axios(GET请求)
  • 【VLNs篇】04:SayNav-为新环境中的动态规划到导航进行大型语言模型的基础构建
  • 批量处理合并拆分pdf功能 OCR 准确率高 免费开源
  • 华为昇腾开发——多模型资源管理(C++)
  • Apollo10.0学习——planning模块(9)之参数详解二