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

配置Rails(Puma)应用HTTPS失败,恢复后HTTP也无法服务求助

问题分析与解决方案

核心错误原因

你遇到的Puma::HttpParserError本质是端口绑定冲突+配置逻辑矛盾,同时证书使用和存放也有问题:

  1. puma.rb里同时用port 3000和ssl_bind绑定同一个3000端口,导致Puma无法同时处理HTTP和HTTPS请求,当你用HTTP协议访问SSL监听的端口(或反过来),就会触发格式解析错误。
  2. 证书文件选错了,应该用fullchain.pem而不是cert.pem,缺少证书链会导致SSL握手异常。
  3. 私钥放在public/.well-known是严重的安全问题——这个目录是Web可访问的,私钥会被泄露,而且Let's Encrypt的验证只需要临时放文件,证书私钥应该存放在非Web目录。
  4. 恢复配置后仍报错,大概率是旧的Puma进程没彻底终止,还在按旧配置监听端口。

分步解决步骤

1. 修复Puma端口绑定冲突

打开config/puma.rb,二选一配置:

  • 如果只启用HTTPS:删除port ENV.fetch("PORT") { 3000 }这一行,只保留ssl_bind配置,注意端口可以用443(默认HTTPS端口,需要root权限)或者自定义端口如3001:
my_key = "#{File.join(Rails.root, 'config', 'ssl', 'privkey.pem')}"
my_crt = "#{File.join(Rails.root, 'config', 'ssl', 'fullchain.pem')}"

ssl_bind(
  '0.0.0.0', # 不要绑定特定域名,用0.0.0.0监听所有地址
  3001,
  key: my_key,
  cert: my_crt,
  verify_mode: 'none' # 普通服务不需要验证客户端证书,设为none
)
  • 如果先恢复HTTP服务:删除ssl_bind相关代码,只保留port ENV.fetch("PORT") { 3000 },同时注释掉config/application.rb里的config.force_ssl = true。

2. 迁移证书到安全目录

  1. 在项目根目录创建config/ssl文件夹:
mkdir -p config/ssl
  1. 把Certbot生成的privkey.pem和fullchain.pem复制到这个目录:
cp /path/to/your/certbot/files/privkey.pem config/ssl/
cp /path/to/your/certbot/files/fullchain.pem config/ssl/
  1. 设置文件权限,确保只有当前用户可读:
chmod 600 config/ssl/*.pem

3. 彻底清理旧进程并重启

  1. 杀掉所有Puma进程:
pkill -9 puma
  1. 重新启动Rails服务:
rails s -b 0.0.0.0

如果是用Puma直接启动:

bundle exec puma -C config/puma.rb

4. 验证配置

  • 如果启用HTTPS:用https://yourdomain.com:3001访问(如果用的是自定义端口),或者https://yourdomain.com如果绑定的是443端口。
  • 如果恢复HTTP:用http://yourdomain.com:3000访问,确保没有强制跳转。

额外注意事项

  • config.force_ssl = true要在HTTPS配置完全正常后再开启,否则会导致HTTP请求强制跳转到HTTPS,但如果HTTPS服务没正常运行,就会出现循环跳转或请求失败。
  • 生产环境建议用反向代理(如Nginx)处理SSL终止,不要让Puma直接暴露在公网,这样更安全且性能更好。

内容的提问来源于stack exchange,提问作者Eirik Husebø

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:03:36