多个 RoR Web 应用程序已在服务器上运行多年,并定期使用最新版本的 ruby、rails 和 mod_passenger 进行更新。现在,突然一个特定的应用程序(其他应用程序都没有,即使它们使用相同的设置)出现了下面描述的问题。
我目前使用的是 Alma Linux 8.10,使用 Apache 2.4.37、mod_passenger 6.0.23、通过 rbenv 的 ruby 3.3.3 和 Rails 7.2.1。通过 capistrano 3.19.1 和 capistrano-passenger 0.2.1 进行部署。
这是
/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.
目前(感谢engineersmnky的评论)这个错误消息的解释是ruby认为capistrano当前目录不存在。
以下是
/etc/httpd/conf.d
文件中的一些相关行:
<VirtualHost *:443>
...
PassengerRuby /home/user/.rbenv/shims/ruby
PassengerMinInstances 1
...
</VirtualHost>
PassengerPreStart https://...
这是在应用程序的
current
目录中运行一些命令的结果,该目录确实存在:
$ 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
$ rbenv rehash # doesn't help
$ 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 ...
最后,这是
passenger-status
的输出。请注意 me.mio
应用程序(有问题的应用程序)与其他应用程序之间的区别。
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/wd/current (production):
App root: /var/www/wd/current
Requests in queue: 0
* PID: 129234 Sessions: 0 Processed: 11 Uptime: 1h 15m 45s
CPU: 0% Memory : 77M Last used: 13m 40s
/var/www/me.hou/current (production):
App root: /var/www/me.hou/current
Requests in queue: 0
* PID: 139227 Sessions: 0 Processed: 1 Uptime: 16m 15s
CPU: 0% Memory : 68M Last used: 16m 15s ag
/var/www/me.sta/current (production):
App root: /var/www/me.sta/current
Requests in queue: 0
* PID: 132177 Sessions: 0 Processed: 1 Uptime: 56m 53s
CPU: 0% Memory : 52M Last used: 56m 53s ag
乘客生成的
/tmp/.../passenger-error-*.html
文件中没有任何有用的信息。
有人有任何想法或建议如何进一步调查吗?
Rubygems (3.5.17) 和 Bundler (2.5.11) 的版本不同步。这并不影响开发测试,但在部署时造成了问题。
删除
Gemfile.lock
中的bundler版本,运行bundle update
,提交并重新部署修复它。
帮助注意到不同步版本的一种方法是运行
bin/cap production doctor
(或 bundle exec cap production doctor
)。