Apache-Passenger无法启动我的生产环境Rails应用程序。

3

我是部署Rails应用的新手,从许多网站上所阅读到的信息来看,Apache/Passenger组合是其中最简单的之一;但是在尝试使用Passenger启动我的应用时,遇到了以下错误消息,在输入sudo tail -50 /var/log/apache2/error.log命令后显示:

Could not spawn process for application /home/test/Documents/sites/depot:
An error occured while starting up the preloader.
Message from application: cannot load such file -- bundler/setup (LoadError)
/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:53:in `require'
/usr/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:53:in `require'
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:406:in
`activate_gem'
...
age/Cor/Req/CheckoutSession.cpp:252 ]: [Client 1-1] Cannot checkout session
because a spawning error occurred. The identifier of the error is 6ce15bbe.
Please see earlier logs for details about the error.

我怀疑这与我的Ruby安装有关,我使用了rbenv并获取了2.2.3版本,但错误消息链接到了一个我从未安装过的2.0.0版本。我还怀疑这与我使用另一个指南中的这两个命令有关:
 sudo rm /usr/bin/ruby
 sudo ln -s /usr/local/bin/ruby /usr/bin/ruby

https://www.digitalocean.com/community/tutorials/how-to-deploy-a-rails-app-with-passenger-and-apache-on-ubuntu-14-04

如果有人知道如何解决这个让人头疼的问题,我将不胜感激。

谢谢!


你是否运行了 gem install bundler 命令? - Camden Narzt
@CamdenNarzt 是的,我已经安装了,出现了相同的错误信息。 - Zero
1
如果说dimakura的想法是正确的,那么您需要将PassengerDefaultRuby设置为在rbenv中ruby shim的路径,它可能位于~/.rbenv/shims/ruby下面。 - Camden Narzt
@CamdenNarzt在passenger.conf文件中更改了PassengerDefaultRuby,确实将我的错误消息中的ruby版本更改为2.2.3;但是,现在我在浏览器中收到“应用程序接收到不完整的响应”消息,并且在日志中我看到:(缺少“production”环境的“secret_token”和“secret_key_base”,请在“config/secrets.yml”中设置这些值)我想我离解决这个问题很近了(希望如此)。 - Zero
现在只需在 /etc/apache2/envvars 中设置变量即可。 - Camden Narzt
2个回答

1

感谢 @dimakura 的线索。我阅读了指南中的内容,安装了一些缺失的依赖,但错误仍然完全相同 =/ 在Ubuntu 14.04上,Apache2不再使用httpd.conf文件。那么我该在apache2.conf文件中添加PassengerDefaultRuby吗? - Zero
1
请勿编辑PassengerDefaultRuby。请编辑PassengerRuby。请查看我对@Zero的评论。 - Hongli

1

在@dimakura和@CamdenNarzt留下的一些提示后,我成功地分两个阶段解决了这个问题。

  1. 正如我所怀疑的那样,Passenger使用了错误的ruby版本。为了解决这个问题,我修改了位于/etc/apache2/mods-available/下的passenger.conf文件,并将which ruby命令的输出添加到其中:

添加以下行(用你自己的which ruby输出替换)

PassengerRuby /home/test/.rbenv/shims/ruby
  1. 重启apache后收到"Incomplete response received from application"错误信息,检查日志发现正确版本的ruby正在被使用,但出现了错误信息:

    "Missing secret_token and secret_key_base for 'production' environment, set these values in config/secrets.yml"

按照此网站https://www.twilio.com/blog/2015/02/managing-development-environment-variables-across-multiple-ruby-applications.html上的说明安装了Figaro gem,然后使用以下命令生成了一个密钥:

rake secret

复制输出并打开config/application.yml文件,在其中输入:

SECRET_KEY_BASE: [output key from rake secret command]

重新启动了Apache,问题得到解决!!

2
“不要这样做”!你应该自定义PassengerRuby,而不是PassengerDefaultRuby。将PassengerDefaultRuby保留在其原始值上。阅读文档以了解PassengerRuby和PassengerDefaultRuby之间的区别。 - Hongli
1
我认为每次有人打开服务器的shell登录时更改secret_key_base不是一个好主意,而且我也不认为在同一台服务器上的任何应用程序共享secret_key_base是一个好主意。最好创建文件config/secrets.yml并在文件中设置值。还要记得不要将该文件提交到存储库中。 - Aguardientico
1
使用 rbenv-vars ,您可以将 ENV 变量存储在项目根目录下的 .rbenv-vars 中:echo "SECRET_KEY_BASE=\rake secret`" >> /path/to/project/root/.rbenv-vars,然后使用 ENV['SECRET_KEY_BASE']` 将其拉入配置中。 - Karl Wilbur
我的secrets.yml文件中默认已经有了开发和测试环境的secret_key_base值,但我仍然不断收到错误消息。 @KarlWilbur 我使用Figaro来设置生产数据库密码的环境变量,你知道是否可以像你使用rbenv-vars那样使用Figaro吗? - Zero
1
你需要编辑/etc/profile.d/st_env.sh文件并删除你添加的内容。然后将它移动到.rbenv-vars文件中。最后使用Figaro获取变量。 - Karl Wilbur
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接