Azure ML计算实例如何对外暴露监听端口的Gradio应用?
我在Azure ML计算实例中运行了一个监听特定端口的Gradio应用,未使用Docker,仅为基础Python应用。我希望将该端口对外暴露,以便通过计算实例的URL/IP访问应用,当前无需考虑安全性,且不想使用Docker(了解自定义应用方案)。
已尝试的操作:
- 通过
sudo ufw allow <port>开放计算实例防火墙端口 - 尝试以下访问方式:
http(s)://<compute-ip>:<port>- 超时https://<compute>.<location>.instances.azureml.ms:<port>- 超时https://<compute>-<port>.<location>.instances.azureml.ms/- 可加载应用,但除根URL外其他路由均报错,提示{"detail":"Method Not Allowed"}
核心疑问:如何解决该问题?是否可通过配置计算实例允许路由URL?还是必须使用Docker+自定义应用方案?
问题根源
Azure ML计算实例的反向代理机制会将https://<compute>-<port>.<location>.instances.azureml.ms/这类URL的请求转发到实例内部端口,但Gradio应用的非根路由(如/predict、/queue等)默认使用POST方法,Azure ML代理在转发时的路由映射或请求方法处理逻辑,会导致这类非根路由触发"Method Not Allowed"错误。
无需Docker的解决办法
调整Gradio应用启动参数
启动Gradio时指定server_name="0.0.0.0"让应用监听所有网卡,同时设置root_path="/"确保路由与代理转发路径匹配:import gradio as gr def demo_func(input_text): return f"处理结果:{input_text}" if __name__ == "__main__": gr.Interface(fn=demo_func, inputs="text", outputs="text").launch( server_port=<你的目标端口>, server_name="0.0.0.0", root_path="/" )若使用Gradio Blocks模式,同样需添加这两个参数。
配置计算实例的网络安全组(NSG)
进入Azure门户,找到目标Azure ML工作区→计算实例→对应实例→「网络」选项卡,确认关联的NSG入站规则已允许<目标端口>的TCP流量(仅开放该端口即可,无需额外配置)。注意:Azure ML计算实例的公网IP属于代理层,直接用IP+端口访问会超时,必须使用
https://<compute>-<port>.<location>.instances.azureml.ms/格式的URL。升级Gradio版本
旧版本Gradio存在代理路由兼容性问题,执行以下命令升级到最新稳定版:pip install --upgrade gradio
是否必须使用Docker?
不需要。通过上述调整应用启动参数和NSG规则,即可在不依赖Docker的前提下正常访问所有路由。Docker+自定义应用方案属于生产级部署的规范方式,但开发场景下直接调整配置就能解决问题。
内容的提问来源于stack exchange,提问作者Vlad Iliescu

