如何排查IIS中偶发的502.3错误(错误码12030、12152)
排查步骤
1. 检查httpPlatformHandler进程托管配置
- 核对
web.config中httpPlatform的核心参数,适配并发场景:startupTimeLimit:默认30秒,若Uvicorn启动较慢,调至60秒避免启动超时requestTimeout:默认2分钟,若接口处理耗时久,延长至5分钟左右,防止请求中途断开processesPerApplication:默认1,单进程Uvicorn并发能力有限,建议设置为CPU核心数对应的数值(如4),让IIS托管多进程分摊请求
- 示例配置片段:
<httpPlatform processPath="C:\Python39\python.exe" arguments="-m uvicorn main:app --host 127.0.0.1 --port %HTTP_PLATFORM_PORT%" stdoutLogEnabled="true" stdoutLogFile=".\logs\uvicorn.log" startupTimeLimit="60" requestTimeout="00:05:00" processesPerApplication="4" />
2. 优化Uvicorn并发配置
- Uvicorn默认工作线程数为1,启动时通过
--workers参数设置为CPU核心数*2(如--workers 4),提升并发处理能力 - 查看httpPlatform配置的
stdoutLogFile路径下的Uvicorn日志,排查是否有进程崩溃、连接中断(如ConnectionResetError)或响应发送异常的记录 - 若启用SSL,确认Uvicorn的SSL协议版本、证书配置与IIS一致,避免协议不兼容触发12030错误
3. 调整IIS连接与队列参数
- 打开IIS管理器,进入应用程序池高级设置:
- 增大
队列长度(默认1000)至2000-3000,避免请求排队溢出 - 设置
最大工作进程数与httpPlatform的processesPerApplication匹配,确保进程数足够承载并发
- 增大
- 进入网站高级设置,将
最大连接数设为0(无限制)或足够大的数值 - 临时禁用应用程序池的快速失败保护(或调高标准),防止Uvicorn偶发崩溃导致IIS终止后续请求
4. 深挖FRT日志细节
- 聚焦
MODULE_SET_RESPONSE_ERROR_STATUS事件的完整信息:- 查看
ErrorCode子错误码、Notification阶段(如SEND_RESPONSE),定位错误发生的请求阶段 - 通过请求ID、URL关联Uvicorn日志,核对该请求的处理过程是否异常
- 确认是否存在httpPlatformHandler与Uvicorn进程连接失败、读取响应超时/中断的细节
- 查看
5. 验证本地网络与端口稳定性
- 用
tcpview工具监控127.0.0.1上Uvicorn监听端口的连接状态,若存在大量TIME_WAIT/CLOSE_WAIT连接,调整Windows TCP参数:- 修改注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters:- 设置
TcpTimedWaitDelay为30,缩短TIME_WAIT连接回收时间 - 设置
MaxUserPort为65534,扩大可用端口范围
- 设置
- 修改注册表
- 确保httpPlatformHandler通过
127.0.0.1而非localhost连接Uvicorn,规避DNS解析或IPv6/IPv4兼容问题
6. 隔离测试Uvicorn服务
- 绕过IIS,直接用k6测试Uvicorn原生服务(访问
127.0.0.1:端口):- 若直接测试仍出现错误,说明问题在Uvicorn/FastAPI代码或配置,需排查线程不安全逻辑、资源泄漏(如数据库连接未释放)
- 若直接测试正常,问题则出在IIS与httpPlatformHandler的交互,需重点调整两者的配置匹配度
内容的提问来源于stack exchange,提问作者jscodes
相关产品推荐
相关产品推荐

