应用程序生成器服务器意外退出:检测到意外的文件结尾

时间:2013-02-11 22:34:38

标签: ruby-on-rails ruby nginx passenger ruby-1.8

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

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

Nginx的Phusion Passenger

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开始,此选项可能出现在以下位置:

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

passenger_ruby块中的http - 即passenger-install-nginx-module输出的那个 - 被用作Ruby Web应用程序的默认Ruby解释器。您没有 passenger_ruby块中指定http,因为默认情况下使用ruby中的$PATH命令}。

如果要为该Web应用程序使用不同的Ruby解释器,还可以在特定上下文中覆盖passenger_rubypassenger_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 Passenger Standalone

Ruby解释器完全由您用于启动passenger命令的Ruby解释器决定。改变它,它将按预期工作。即使您最初使用属于不同Ruby版本的RubyGems安装Phusion Passenger也可以。