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的代理标识,正确识别原始请求协议,避免误触发跳转:
- 修改
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') ]
- 将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
相关产品推荐
相关产品推荐

