【问题标题】:The application spawner server exited unexpectedly: Unexpected end-of-file detected应用程序生成器服务器意外退出:检测到意外的文件结尾
【发布时间】:2013-09-07 19:30:06
【问题描述】:

我对 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 的与此问题相关的评论:

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

有什么建议吗?

【问题讨论】:

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


    【解决方案1】:

    Nginx 的 Phusion 乘客

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

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

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

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

    http 块中的passenger_ruby(即passenger-install-nginx-module 输出的那个)用作Ruby Web 应用程序的默认Ruby 解释器。不过,您必须http 块中指定 passenger_ruby,因为默认是使用在 $PATH 中找到的第一个 ruby 命令。

    如果您想为该网络应用程序使用不同的 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 乘客独立

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 2020-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 2012-07-07
      • 1970-01-01
      相关资源
      最近更新 更多