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

Docker部署Rails至AWS ECS健康检查返回HTTP301如何修复

问题根因

返回301的核心原因是Rails生产环境默认开启config.force_ssl配置,会对所有HTTP请求返回301跳转至对应HTTPS地址。你当前配置的负载均衡健康检查默认通过HTTP协议访问容器的3000端口,正好命中跳转规则,因此健康检查失败。
另外你的Dockerfile存在启动逻辑错误:最后一行RUN bundle exec rails s -b 0.0.0.0 -p 3000属于构建阶段执行的指令,构建完成后不会生效;当前CMD /bin/bash配置会导致容器启动时直接进入bash交互界面,不会自动启动Rails服务,这个问题需要一并修复。


修复方案(按生产环境推荐优先级排序)

方案1:调整负载均衡目标组健康检查配置(最优方案)

  • 直接将ALB目标组的健康检查协议从HTTP修改为HTTPS,健康检查路径保持/healthcheck不变
  • 如果容器内Rails服务使用自签名证书(未配置正式SSL证书),需要在健康检查配置中开启「不验证后端证书」选项,避免证书校验不通过
  • 该方案无需修改任何应用代码,完全保留生产环境全路径强制HTTPS的安全规则,是AWS ECS部署Rails应用的标准实践。

方案2:跳过健康检查路径的SSL强制跳转

如果必须使用HTTP协议做健康检查,修改Rails生产环境配置文件config/environments/production.rb,调整SSL强制跳转规则,排除健康检查端点:

# 替换原有 config.force_ssl = true 配置
config.ssl_options = {
  redirect: {
    exclude: ->(request) { request.path == '/healthcheck' }
  }
}

修改完成后重新构建镜像部署即可,该方案仅放开/healthcheck路径的HTTP访问,其余业务路径仍然保留HTTPS强制跳转逻辑。

方案3:配置Rails信任负载均衡代理头

如果你的负载均衡是在监听器层做HTTPS卸载,解密后以HTTP协议转发请求到后端容器,需要配置Rails信任ALB的代理标识,正确识别原始请求协议,避免误触发跳转:

  1. 修改config/environments/production.rb,添加信任代理配置,覆盖AWS VPC常用私有网段:
config.action_dispatch.trusted_proxies = [
  IPAddr.new('10.0.0.0/8'),
  IPAddr.new('172.16.0.0/12'),
  IPAddr.new('192.168.0.0/16')
]
  1. 将HTTP到HTTPS的跳转逻辑配置在ALB监听器层(HTTP监听器直接301跳转到HTTPS),后端Rails服务不再处理强制跳转逻辑,仅通过ALB传递的X-Forwarded-Proto头识别原始请求协议。

Dockerfile修复

将Dockerfile末尾的启动逻辑修改为如下内容,保证容器启动时自动运行Rails服务:

EXPOSE 3000

# 删除原文件最后一行 RUN bundle exec rails s -b 0.0.0.0 -p 3000
# 替换原CMD配置
CMD ["bundle", "exec", "rails", "s", "-b", "0.0.0.0", "-p", "3000"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 14:18:26