Ruby无法找到Capistrano current目录的排查求助
RoR应用Passenger启动故障排查
环境配置
- 操作系统:Alma Linux 8.10
- Web服务器:Apache 2.4.37
- Passenger版本:mod_passenger 6.0.23
- Ruby管理:rbenv,Ruby版本3.3.3
- Rails版本:7.2.1
- 部署工具:capistrano 3.19.1 + capistrano-passenger 0.2.1
故障现象
部署后首次访问/var/www/me.mio/current应用时,Apache错误日志/var/log/httpd/error_log出现如下错误:
/home/user/.rbenv/versions/3.3.3/bin/ruby: No such file or directory -- Passenger AppPreloader: /var/www/me.mio/current (LoadError) [...age/Cor/App/Implementation.cpp:221 ]: Could not spawn process for application /var/www/me.mio/current: The application process exited prematurely. age/Cor/Con/CheckoutSession.cpp:284 ]: Cannot checkout session because a spawning error occurred.
解读:Ruby提示Capistrano的current目录不存在(感谢engineersmnky的评论)
查看passenger-status发现,该应用未生成任何进程,其他同配置应用均正常运行:
Version : 6.0.23 Date : 2024-09-03 10:39:24 +0000 Instance: LEqbzjUQ (Apache/2.4.37 (AlmaLinux) OpenSSL/1.1.1k Phusion_Passenger/6.0.23) ----------- General information ----------- Max pool size : 6 App groups : 5 Processes : 4 Requests in top-level queue : 0 ----------- Application groups ----------- /var/www/me.mio/current (production): App root: /var/www/me.mio/current Requests in queue: 0 /var/www/smd/current (production): App root: /var/www/smd/current Requests in queue: 0 * PID: 128934 Sessions: 0 Processed: 7 Uptime: 1h 15m 50s CPU: 0% Memory : 78M Last used: 3m 35s # 其他正常应用信息省略...
已完成的排查步骤
- 确认
/var/www/me.mio/current目录真实存在 - 目录内
.ruby-version文件内容为3.3.3,rbenv环境识别正常:$ cat .ruby-version # 3.3.3 $ rbenv version # 3.3.3 (set by /var/www/me.mio/current/.ruby-version) $ ruby -v # ruby 3.3.3 ... $ which ruby # ~/.rbenv/shims/ruby - 确认Ruby可执行文件存在且可正常运行:
$ ls -l ~/.rbenv/versions/3.3.3/bin/ruby -rwxr-xr-x 1 ... 217824 Jun 13 19:00 /home/user/.rbenv/versions/3.3.3/bin/ruby $ ~/.rbenv/versions/3.3.3/bin/ruby -v # ruby 3.3.3 ... - 执行
rbenv rehash无效果 - 检查Passenger生成的
/tmp/.../passenger-error-*.html文件,无有效错误信息 - Apache虚拟主机配置已指定
PassengerRuby /home/user/.rbenv/shims/ruby和PassengerMinInstances 1
排查思路与解决方案
1. 权限排查
- 检查应用目录及路径权限,确保Apache运行用户(通常为
apache或httpd)拥有完整读权限:# 检查目录权限 ls -ld /var/www/me.mio ls -ld /var/www/me.mio/current # 确认软链接指向正确的release目录 ls -l /var/www/me.mio/current # 递归检查路径每一级权限 namei -l /var/www/me.mio/current - 检查Ruby安装目录权限,确保Apache用户可访问Ruby可执行文件:
ls -ld /home/user/.rbenv ls -ld /home/user/.rbenv/versions/3.3.3
2. Passenger配置调整
- 尝试在虚拟主机配置中直接指定Ruby绝对路径,避开rbenv shim的环境变量问题:
修改后重启Apache,重新访问应用测试。<VirtualHost *:443> ... PassengerRuby /home/user/.rbenv/versions/3.3.3/bin/ruby ... </VirtualHost> - 为Apache添加rbenv相关环境变量,确保进程启动时加载正确路径:
将上述配置添加到虚拟主机或全局Apache配置中,重启后测试。SetEnv RBENV_ROOT /home/user/.rbenv SetEnv PATH /home/user/.rbenv/shims:/home/user/.rbenv/bin:$PATH
3. 应用部署与初始化验证
- 重新执行Capistrano部署,确保
current软链接正确生成且release目录完整:cd /var/www/me.mio cap production deploy - 手动启动Rails生产环境控制台,验证应用本身是否能正常初始化:
若控制台启动失败,根据输出的错误信息排查代码或依赖问题。cd /var/www/me.mio/current rails c production
4. Passenger进程清理
- 强制重启目标应用的Passenger进程:
passenger-config restart-app /var/www/me.mio/current - 停止所有Passenger进程后重启Apache:
passenger stop systemctl restart httpd
内容的提问来源于stack exchange,提问作者sanichi
相关产品推荐
相关产品推荐

