0

我对 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  

我从这里看到了与此问题相关的评论:

在检查了几个安装程序(上帝保佑虚拟机和快照)后,我解决了这个问题。普通用户帐户和 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

乘客文档页面:

默认值为 ruby​​,表示将根据 PATH 环境变量查找 Ruby 解释器。

所以你会认为它会使用 ruby​​ 1.9.3 而不是 1.8

如果我查看config.ru,我会看到:

require::File.expand_path('../config/environment',  __FILE__)
run RedmineApp::Application

有什么建议么?

4

1 回答 1

0

Nginx 的 Phusion 乘客

Ruby 解释器完全由passenger_ruby指令决定。没有其他的。更改它,它将按预期工作。即使您最初使用属于不同 Ruby 版本的 RubyGems 安装了 Phusion Passenger,这仍然有效。

在 4.0.0 之前的版本中,整个 Nginx 实例仅支持单个 Ruby 版本,因此passenger_ruby可能只出现在全局服务器配置中。

4.0.0 版本(目前处于候选版本中)开始,Phusion Passenger 在同一个 Nginx 实例中支持多个 Ruby 或 Python 解释器。因此,从 4.0.0 版本开始,此选项可能出现在以下位置:

  • 在“http”配置块中。
  • 在“服务器”配置块中。
  • 在“位置”配置块中。
  • 在“if”配置范围内。

passenger_ruby块中的http- 即输出的块 -passenger-install-nginx-module用作 Ruby Web 应用程序的默认 Ruby 解释器。不过,您不必块中指定 a passenger_rubyhttp因为默认情况下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;
    }
}

Phusion 乘客独立

Ruby 解释器完全由您用来启动passenger命令的 Ruby 解释器决定。更改它,它将按预期工作。即使您最初使用属于不同 Ruby 版本的 RubyGems 安装了 Phusion Passenger,这仍然有效。

于 2013-03-16T19:34:57.410 回答