我对Rails没有多少经验。星期三我被告知要升级Redmine,并升级插件。我已经为此工作了3天了,看看Rails在进入现代包装管理时代还需要走多远才能令人震惊。
我在Centos 6.3上。起初我升级到Ruby 1.8.7,因为这是Centos存储库中的内容,这足以升级Redmine。但是当我进入redmine_backlogs插件时,我意识到我需要一个更新版本的Ruby。在Centos上获取Ruby 1.9.3并不容易。在我得到一些有效的东西之前,我尝试了4个不同的教程。我有很多奇怪的路径,我不得不手动修复。
我尝试使用Passenger的Nginx并且无法使其工作,所以后来我做了Phusion Passenger Standalone。
现在我已经运行了Rails 3.2.11。考虑到过去几周Rails所有的安全问题,我想我必须修补这个问题。
我刚升级到最新的Redmine,应该是2.2。
我认为我的Nginx使用的是不同版本的Ruby,而不是我想要的版本。如果我这样做:
/opt/nginx/sbin/nginx -V
然后我看到了:
built by gcc 4.4.6 20120305 (Red Hat 4.4.6-4) (GCC)
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-http_gzip_static_module --with-cc-opt=-Wno-error --with-pcre=/tmp/root-passenger-14193/pcre-8.31 --add-module=/usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/ext/nginx
看起来它使用的是Ruby 1.8而不是Ruby 1.9.3,是吗?
如果我这样做:
/opt/nginx/sbin/nginx -s stop
然后:
/opt/nginx/sbin/nginx
我重新启动nginx,但如果我在浏览器中刷新,我会得到:
Passenger encountered the following error:
The application spawner server exited unexpectedly: Unexpected end-of-file detected.
Exception class:
PhusionPassenger::Rack::ApplicationSpawner::Error
Backtrace:
# File Line Location
0 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/rack/application_spawner.rb 135 in `start'
1 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/spawn_manager.rb 253 in `spawn_rack_application'
2 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/abstract_server_collection.rb 132 in `lookup_or_add'
3 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/spawn_manager.rb 246 in `spawn_rack_application'
4 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/abstract_server_collection.rb 82 in `synchronize'
5 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/abstract_server_collection.rb 79 in `synchronize'
6 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/spawn_manager.rb 244 in `spawn_rack_application'
7 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/spawn_manager.rb 137 in `spawn_application'
8 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/spawn_manager.rb 275 in `handle_spawn_application'
9 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/abstract_server.rb 357 in `__send__'
10 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/abstract_server.rb 357 in `server_main_loop'
11 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/lib/phusion_passenger/abstract_server.rb 206 in `start_synchronously'
12 /usr/lib64/ruby/gems/1.8/gems/passenger-3.0.19/helper-scripts/passenger-spawn-server 99
我看到here与此问题相关的评论:
我在检查了几个安装程序后解决了这个问题 (上帝保佑vm和快照)。正常的useraccount和apache 用户使用另一个ruby版本(1.8)然后root用户(1.9.3)。现在 一切正常。
但我不知道如何在我的服务器上修复它。
我试着查看我的Nginx日志:
tail /var/log/nginx/error.log
但是最近的错误发生在2月5日,所以我怀疑一旦我切换到使用Phusion Passenger,错误日志就会被移到新的位置,但我不知道如何找到Nginx存储它的位置错误日志,现在Phusion Passenger正在控制它。有什么建议?
更新
我在这里找到了新的Nginx错误日志:
/opt/nginx/logs/error.log
错误是:
2013/02/11 17:02:15 [notice] 25295#0: signal process started
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
2013/02/11 17:06:23 [notice] 25360#0: signal process started
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
2013/02/11 17:10:47 [notice] 25433#0: signal process started
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
2013/02/11 17:13:35 [notice] 25522#0: signal process started
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
2013/02/11 17:16:31 [notice] 25598#0: signal process started
/usr/local/rvm/gems/ruby-1.9.3-p385/gems/mysql2-0.3.11/lib/mysql2/mysql2.so: [BUG] Segmentation fault
ruby 1.8.7 (2011-06-30 patchlevel 352) [x86_64-linux]
如果我这样做:
echo $PATH
,然后:
/usr/local/rvm/gems/ruby-1.9.3-p385/bin:/usr/local/rvm/gems/ruby-1.9.3-p385@global/bin:/usr/local/rvm/rubies/ruby-1.9.3-p385/bin:/usr/local/rvm/bin:/sbin:/bin:/usr/sbin:/usr/bin
来自Passenger文档页面:
默认值为ruby,这意味着将根据PATH环境变量查找Ruby解释器。
所以你会认为它会使用ruby 1.9.3而不是1.8
如果我查看config.ru
,我会看到:
require::File.expand_path('../config/environment', __FILE__)
run RedmineApp::Application
有什么建议吗?
答案 0 :(得分:0)
Ruby解释器完全由passenger_ruby指令决定。没有其他的。改变它,它将按预期工作。即使您最初使用属于不同Ruby版本的RubyGems安装Phusion Passenger也可以。
在4.0.0之前的版本中,整个Nginx实例只支持一个Ruby版本,因此passenger_ruby
可能只出现在全局服务器配置中。
自version 4.0.0(目前在Release Candidate中)以来,Phusion Passenger在同一个Nginx实例中支持多个Ruby或Python解释器。因此,从版本4.0.0开始,此选项可能出现在以下位置:
passenger_ruby
块中的http
- 即passenger-install-nginx-module
输出的那个 - 被用作Ruby Web应用程序的默认Ruby解释器。您没有 在passenger_ruby
块中指定http
,因为默认情况下使用ruby
中的$PATH
命令}。
如果要为该Web应用程序使用不同的Ruby解释器,还可以在特定上下文中覆盖passenger_ruby
或passenger_python
。例如:
http {
passenger_root ...
# Use Ruby 1.8.7 by default.
passenger_ruby /usr/bin/ruby1.8
# Use Python 2.6 by default.
passenger_python /usr/bin/python2.6
server {
# This Rails web app will use Ruby 1.8.7
listen 80;
server_name www.foo.com;
root /webapps/foo/public;
}
server {
# This Rails web app will use Ruby 1.9.3, as installed by RVM
passenger_ruby /usr/local/rvm/wrappers/ruby-1.9.3/ruby;
listen 80;
server_name www.bar.com;
root /webapps/bar/public;
# If you have a web app deployed in a sub-URI, customize
# passenger_ruby/passenger_python inside a `location` block.
# The web app under www.bar.com/blog will use JRuby 1.7.1
passenger_base_uri /blog;
location /blog {
passenger_ruby /usr/local/rvm/wrappers/jruby-1.7.1/ruby;
}
}
server {
# This Flask web app will use Python 3.0
passenger_python /usr/bin/python3.0;
listen 80;
server_name www.baz.com;
root /webapps/baz/public;
}
}
Ruby解释器完全由您用于启动passenger
命令的Ruby解释器决定。改变它,它将按预期工作。即使您最初使用属于不同Ruby版本的RubyGems安装Phusion Passenger也可以。