Azure Web App部署NodeJS SSE服务HTTP2下客户端请求pending超时问题
Azure Web App 部署SSE服务Pending问题解决方案
核心原因是Azure App Service默认启用的应用请求路由(ARR)缓冲、托管层反向代理缓冲机制会拦截流式响应,攒到足够大小才返回给客户端,是导致SSE请求长期Pending的核心原因。需要调整以下配置:
1. 调整平台层面配置
- 进入Azure门户对应Web App资源的「配置」-「应用程序设置」页面,添加配置项:
- 名称:
WEBSITE_DYNAMIC_CACHE,值:0,禁用Azure动态缓存
- 名称:
- 若使用Windows宿主的NodeJS运行时,默认采用IISNode托管,需要在项目根目录新增
web.config文件,添加以下配置:
<configuration> <system.webServer> <handlers> <add name="iisnode" path="你的服务入口文件.js" verb="*" modules="iisnode"/> </handlers> <!-- 禁用IIS响应缓冲 --> <httpProtocol> <customHeaders> <add name="X-Accel-Buffering" value="no" /> </customHeaders> </httpProtocol> <iisnode flushResponse="true" /> <!-- 禁用压缩,避免压缩模块缓冲流式内容 --> <urlCompression doStaticCompression="false" doDynamicCompression="false"/> </system.webServer> </configuration>
若使用Linux容器/内置Linux NodeJS运行时,不需要配置web.config,响应头添加X-Accel-Buffering: no即可禁用内置Nginx代理的缓冲。
2. 调整服务端响应代码
现有代码缺少禁用代理缓冲的标识,且没有手动刷新响应缓冲,修改后代码参考:
response.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache, no-store, must-revalidate', // 补充全量禁用缓存规则 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': "*", 'Access-Control-Allow-Headers': 'Origin, X-Requested-With, Content-Type, Accept', 'X-Accel-Buffering': 'no', // 禁用所有反向代理的缓冲逻辑 'Content-Encoding': 'identity' // 强制不压缩响应内容 }); response.write('id: ' + id + '\n'); if (event) { response.write('event: ' + event + '\n'); } response.write("data: " + data + '\n\n'); // 手动刷新响应缓冲,立即推送内容到客户端 response.flush();
3. 额外配置校验
- 进入Web App「配置」-「常规设置」页面,开启「始终在线」功能,避免服务空闲被回收导致SSE连接异常断开。
- Azure平台默认请求超时阈值为230秒,若需要保持长连接超过4分钟,需要每隔30秒左右发送一条SSE注释帧(格式为
:\n\n,冒号开头的空行),避免连接被平台主动断开。 - 若配置了Azure CDN、应用网关等前置代理,需要单独关闭对应代理的响应缓冲规则。
内容的提问来源于stack exchange,提问作者Djoezz
相关产品推荐
相关产品推荐

