Rails 5+/6 rbenv+Passenger环境bin/ruby权限不足引发500错误求助
错误原因
报错日志明确指向Ruby可执行文件权限不足:
App 735 output: /bin/sh: 1: exec: /root/.rbenv/versions/2.7.3/bin/ruby: Permission denied
核心触发原因有两个:
- rbenv被安装在
/root目录下,Linux系统默认root家目录的权限为700,仅root用户自身拥有读、写、执行权限,其余所有用户都没有访问权限 - Passenger工作进程不会以root身份运行,默认会使用站点配置中指定的普通用户(如www-data、deploy等)启动,这类用户无权访问
/root目录下的资源,因此执行Ruby二进制文件时被系统拦截
解决方案
优先选择方案1,符合生产环境安全规范;方案2仅可用于临时验证,不建议在生产环境使用。
方案1:迁移rbenv到普通用户家目录(推荐)
操作步骤:
- 新建专属部署用户,避免用root运行业务服务:
useradd -m deploy - 切换到
deploy用户,重新安装rbenv及对应版本的Ruby环境,执行su - deploy后按照rbenv安装流程完成2.7.3版本Ruby、对应版本bundler、项目依赖的安装 - 修改Passenger对应的Web服务(Nginx/Apache)站点配置,更新Ruby路径参数:
# Nginx配置示例,Apache配置对应修改passenger_ruby参数即可 passenger_ruby /home/deploy/.rbenv/versions/2.7.3/bin/ruby; - 调整Rails项目目录的所属权限,保证deploy用户有完整访问权限:
chown -R deploy:deploy /path/to/your/rails/project - 重启Web服务和Passenger,验证站点访问是否正常
方案2:调整目录权限(仅临时验证用)
如果需要快速验证问题根因,可以临时调整权限,生产环境使用会带来严重安全风险:
- 开放root家目录的读执行权限:
chmod 755 /root - 递归开放rbenv目录的公共读执行权限:
chmod -R o+rx /root/.rbenv - 重启服务验证是否恢复访问
额外排查点
如果调整权限后仍报错,可检查系统是否开启了SELinux(常见于CentOS/RHEL系列系统):
- 临时关闭SELinux验证:
setenforce 0 - 若关闭后恢复正常,需要给rbenv目录、项目目录配置正确的SELinux上下文,或者按需调整SELinux策略即可。
内容的提问来源于stack exchange,提问作者Wordica
相关产品推荐
相关产品推荐

