You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Web App URL Rewrite代理Milestone服务器异常排查求助

排查与解决Azure Web App反向代理Milestone服务器的异常问题

我之前处理过好几起Azure Web App反向代理到私有网络设备的类似问题,结合你的描述,咱们一步步拆解排查方向和可能的解决办法:

一、ARR反向代理配置深度排查

首先重点检查ARR的核心配置,因为你已经通过applicationHost.xdt完成了ARR部署,很多代理异常都和ARR的默认参数有关:

  • 调整超时与缓冲区设置:默认的ARR超时时间可能太短,尤其是Milestone返回图片或者大页面的时候,很容易导致连接提前断开,但HTTP状态码还是返回200,就出现了空内容的情况。你可以在applicationHost.xdt里添加或修改以下配置:
    <location path="YourWebAppName">
      <system.webServer>
        <proxy>
          <proxySettings>
            <connectionTimeout>300</connectionTimeout> <!-- 延长到5分钟,单位秒 -->
            <responseBufferLimit>2147483647</responseBufferLimit> <!-- 增大响应缓冲区,避免图片内容被截断 -->
          </proxySettings>
        </proxy>
      </system.webServer>
    </location>
    
  • 禁用干扰性缓存:ARR默认开启的缓存策略可能对动态生成的摄像头图片造成干扰,导致返回旧的空内容。可以在web.config的rewrite规则里添加禁止缓存的设置,同时要确保ARR允许修改这些服务器变量:
    在rewrite规则的<action>节点下添加:
    <serverVariables>
      <set name="HTTP_PRAGMA" value="no-cache" />
      <set name="HTTP_CACHE_CONTROL" value="no-cache, no-store" />
    </serverVariables>
    
    然后在applicationHost.xdt里添加允许修改的变量:
    <location path="YourWebAppName">
      <system.webServer>
        <rewrite>
          <allowedServerVariables>
            <add name="HTTP_PRAGMA" />
            <add name="HTTP_CACHE_CONTROL" />
          </allowedServerVariables>
        </rewrite>
      </system.webServer>
    </location>
    

二、网络连接与传输层排查

虽然tcpping能通,但Azure Web App和私有网络的VPN连接可能存在隐性的传输问题:

  • 检查MTU匹配情况:Azure VPN Gateway默认MTU是1500,但如果私有网络侧的MTU更小,大尺寸的图片数据包会被分片甚至丢失。可以尝试在Web App的应用设置里添加WEBSITE_VNET_ROUTE_ALL=1(确保所有流量走VPN),同时将VPN连接的MTU调整到1400左右测试。
  • 开启诊断日志抓细节:打开Web App的「日志」选项,开启详细的HTTP日志和ARR日志,查看请求在代理过程中的具体状态。日志里会显示ARR接收后端响应的字节数,如果字节数为0或者远小于预期,说明传输过程中内容被截断了。
  • VNet内虚拟机对比测试:在和Web App同VNet的虚拟机里直接访问Milestone的摄像头图片和index.html,如果这里访问正常,那问题大概率出在Web App的代理层;如果VM访问也有问题,那就是私有网络内的Milestone配置或网络链路问题。

三、Milestone服务器端配置检查

Milestone本身的设置也可能导致代理异常:

  • 并发连接数限制:如果Milestone对同一来源的并发连接数做了限制,Web App作为代理发起的大量图片请求会被限流,导致大部分请求返回空内容。可以登录Milestone管理界面,调整并发连接数的上限。
  • 响应头完整性检查:有些设备返回的响应头里没有正确的Content-Length,ARR在代理这种响应时可能无法正确识别内容长度,导致返回空内容。可以用curl http://XX.XX.XX.XX:XXXX/video/your-image.jpg直接访问Milestone的图片URL,查看响应头是否包含Content-Length或者Transfer-Encoding: chunked。如果没有,需要在Milestone里开启相关设置,或者在Web App的rewrite规则里补全响应头。
  • 服务器资源负载检查:如果Milestone服务器CPU、内存占用过高,或者磁盘IO瓶颈,会导致返回图片缓慢甚至失败。登录Milestone服务器查看系统资源使用情况,确保没有过载。

四、Azure Web App本身的限制与优化

  • 服务计划层级排查:如果用的是免费或基础层Web App,可能有CPU、内存或者并发连接数的硬性限制,代理大量请求时会出现瓶颈。可以临时升级到标准层测试,看问题是否消失。
  • 优化Rewrite规则:你的当前规则匹配所有^video/?(.*)路径,可以针对图片请求单独处理,避免不必要的代理逻辑,同时禁用压缩避免协议兼容问题:
    <!-- 优先处理图片请求 -->
    <rule name="ProxyImages" stopProcessing="true">
      <match url="^video/(.+\.(jpg|png|jpeg))$" />
      <action type="Rewrite" url="http://XX.XX.XX.XX:XXXX/{R:1}" />
      <serverVariables>
        <set name="HTTP_ACCEPT_ENCODING" value="" /> <!-- 禁用压缩,避免代理过程中解压出错 -->
      </serverVariables>
    </rule>
    <!-- 处理其他video路径请求 -->
    <rule name="ProxyOther" stopProcessing="true">
      <match url="^video/?(.*)" />
      <action type="Rewrite" url="http://XX.XX.XX.XX:XXXX/{R:1}" />
    </rule>
    

五、请求重试容错配置

针对偶尔成功的情况,可以利用ARR的重试机制,对空内容的200请求自动重试:
在web.config的rewrite规则里添加:

<rule name="ProxyWithRetry" stopProcessing="true">
  <match url="^video/?(.*)" />
  <action type="Rewrite" url="http://XX.XX.XX.XX:XXXX/{R:1}" />
  <serverVariables>
    <set name="ARR_BACKEND_RETRY_STATUS_CODES" value="200" /> <!-- 针对200状态码的空内容请求重试 -->
  </serverVariables>
  <conditions>
    <add input="{RESPONSE_CONTENT_LENGTH}" pattern="0" /> <!-- 匹配内容长度为0的响应 -->
  </conditions>
</rule>

同时要在applicationHost.xdt里允许修改这个服务器变量:

<allowedServerVariables>
  <add name="ARR_BACKEND_RETRY_STATUS_CODES" />
</allowedServerVariables>

按照上面的步骤逐一排查,应该能定位到问题所在。从我的经验来看,最可能的原因是ARR的超时或缓冲区设置不足,或者网络MTU不匹配导致的数据包丢失。

内容的提问来源于stack exchange,提问作者Marian Graurov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:39:55