Azure应用服务Rails应用8080端口HTTP探测无响应求助
我之前也踩过一模一样的坑,本地跑起来顺得不行,一部署到Azure就报容器没响应8080端口的探测。给你几个具体的排查方向,按顺序试试:
1. 先确认Puma的绑定地址(最容易忽略的坑!)
很多人只改了端口,却没注意绑定地址是localhost——容器里的localhost是内部回环地址,Azure的探测请求根本访问不到。赶紧修改你的config/puma.rb:
# 替换原来的端口配置,必须绑定到0.0.0.0 bind "tcp://0.0.0.0:#{ENV.fetch("PORT") { 8080 }}"
这样Puma才会监听容器的所有网络接口,Azure的探测请求才能正常打进来。
2. 明确设置应用启动命令
Azure有时候会用默认的rails server启动应用,但这个命令可能不会正确加载你的puma配置。去App Service的「配置」→「常规设置」里,把启动命令改成:bundle exec puma -C config/puma.rb
或者更直接一点,直接指定绑定地址和端口:bundle exec puma -p 8080 -b 0.0.0.0
确保应用是用你配置好的Puma实例启动的。
3. 核对环境变量的优先级
Azure里的WEBSITES_PORT是告诉平台要探测哪个端口,而PORT是给你的Rails应用使用的,两者必须对应:
- 在「配置」→「应用程序设置」里,设置
WEBSITES_PORT = 8080 - 同时设置
PORT = 8080(或者保持你之前改的ENV.fetch("PORT") { 8080 },让应用从环境变量读取)
改完后务必重启应用,然后去Kudu工具(https://<你的应用名>.scm.azurewebsites.net)的「环境」页面,确认这两个变量确实生效了——有时候配置没同步会坑死人。
4. 查看启动日志找线索
光看探测失败的提示没用,得看应用到底有没有正常启动:
- 去Kudu的「日志流」,或者App Service的「日志」→「应用日志」,找Puma启动时的日志。如果看到
Listening on tcp://0.0.0.0:8080,说明Puma监听正常;如果是localhost或者其他端口,那就是配置没生效。 - 如果日志里有启动报错(比如依赖缺失、数据库连接失败),那才是根本问题——应用都没起来,探测肯定失败。
5. 调整健康检查路径
Azure默认探测/路径,但如果你的Rails根路径需要登录认证,或者有重定向,探测会返回非200状态码,直接判定失败。解决办法:
- 在
config/routes.rb里加一个简单的健康检查路由:
get '/health', to: ->(_req) { [200, {}, ['OK']] }
- 然后去App Service的「配置」→「健康检查」里,把路径改成
/health,这样探测就能稳定拿到200的响应了。
6. 给应用足够的启动时间
Rails应用启动时要预编译资产、初始化数据库连接,可能需要几十秒甚至几分钟。Azure默认的探测初始延迟可能太短,导致还没启动完就被判定失败。去「配置」→「健康检查」里,把「初始延迟」改成300秒(5分钟),给应用足够的启动时间。
按这个顺序排查下来,基本能解决问题。我当时就是因为绑定了localhost,折腾了大半天,改完绑定地址立刻就好了😂
内容的提问来源于stack exchange,提问作者Toby

