AWS Elastic Beanstalk AL2部署Ruby2.7.4(Rails6)应用无法访问排查
问题排查方向与根因分析
核心排查方向
- 首先排查Puma套接字文件的生成状态:登录EB实例检查
/var/run/puma/my_app.sock是否存在,文件权限、属主是否正常,新环境直接部署时该目录大概率不存在或无写入权限 - 检查Nginx错误日志:查看
/var/log/nginx/error.log是否存在connect() to unix:///var/run/puma/my_app.sock failed类报错 - 检查Puma运行日志:查看
/var/log/puma/puma.log是否存在套接字绑定失败、目录不存在的报错 - 检查
/var/run/puma/目录的权限与归属:新环境默认不会创建该目录,官方示例应用部署时会初始化该目录,这也是先部署示例再部署你的应用能正常运行的核心原因 - 验证Puma配置冲突:你的Puma配置存在明显的参数定义错误
确定根因
- Puma配置错误:你在Puma配置中错误将套接字路径设置为pidfile路径:
bind "unix:///var/run/puma/my_app.sock" pidfile "/var/run/puma/my_app.sock" # 错误!pidfile是进程ID存储文件,不能和套接字文件路径一致,会导致套接字被覆盖无法监听
同时配置存在重复pidfile定义,后续又指定pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" },会导致Puma启动时的文件写入冲突。
新环境缺少
/var/run/puma/目录:AWS Elastic Beanstalk Ruby 2.7 平台默认不会主动创建/var/run/puma/目录,你的应用直接部署时Puma无法在不存在的目录下创建套接字文件,导致Nginx转发请求时找不到上游服务,无内容返回。而先部署官方示例Rails应用时,示例的部署脚本会自动创建该目录并配置正确权限,后续再部署你的应用时目录已经存在,所以可以正常运行。Nginx重载时机问题:你的
.ebextensions/nginx.config中的010_reload_nginx命令是在容器命令阶段执行,此时如果Puma还未完成启动、套接字还未生成,Nginx重载后也会出现上游找不到的问题。
修复方案
- 修正Puma配置:删除错误的pidfile定义,只保留正确的pidfile配置:
# 删掉这行错误配置 pidfile "/var/run/puma/my_app.sock" bind "unix:///var/run/puma/my_app.sock" # 仅保留这一处pidfile定义即可 pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }
- 在.ebextensions中新增目录初始化配置:在
nginx.config中新增commands段,提前创建/var/run/puma/目录并配置正确权限:
commands: 00_create_puma_dir: command: "mkdir -p /var/run/puma && chown webapp:webapp /var/run/puma" # 保留原有的files、container_commands配置不变
- 可选:移除Nginx强制跳转逻辑测试:排查初期可以临时注释HTTPS跳转逻辑,排除证书、跳转链导致的无返回问题。
内容的提问来源于stack exchange,提问作者user1066568
相关产品推荐
相关产品推荐

