Сервер программы-приложения неожиданно завершил работу: обнаружен неожиданный конец файла

У меня нет большого опыта работы с Rails. В среду мне сказали обновить Redmine и обновить плагины. Я работаю над этим уже 3 дня, и я был шокирован, увидев, как далеко Rails еще предстоит пройти, чтобы войти в современную эру управления пакетами.

Я на Centos 6.3. Сначала я обновился до Ruby 1.8.7, потому что это то, что находится в репозитории Centos, и этого было достаточно для обновления Redmine. Но когда я добрался до плагина redmine_backlogs, я понял, что мне нужна более новая версия Ruby. Получить Ruby 1.9.3 на Centos непросто. Я пробовал 4 разных урока, прежде чем получил что-то, что сработало. У меня есть тонна странных путей, которые мне пришлось исправить вручную.

Я попробовал Nginx с Passenger и не смог заставить его работать, поэтому позже я сделал 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

но самая последняя ошибка - с 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, что означает, что интерпретатор Ruby будет найден в соответствии с переменной среды PATH.

Таким образом, вы думаете, что он будет использовать ruby ​​1.9.3 вместо 1.8

Если я посмотрю в config.ru, Я вижу:

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

Какие-либо предложения?

1 ответ

Phusion Passenger для Nginx

Интерпретатор Ruby определяется исключительно директивой passenger_ruby. Ничего больше. Измените это, и это будет работать как ожидалось. Это работает, даже если вы изначально установили Phusion Passenger, используя RubyGems, принадлежащий другой версии Ruby.

В версиях до 4.0.0 для всего экземпляра Nginx поддерживалась только одна версия Ruby, поэтому passenger_ruby может происходить только в глобальной конфигурации сервера.

Начиная с версии 4.0.0 (в настоящее время находится в версии-кандидате), Phusion Passenger поддерживает несколько интерпретаторов Ruby или Python в одном экземпляре Nginx. И так, начиная с версии 4.0.0, эта опция может появляться в следующих местах:

  • В блоке конфигурации http.
  • В блоке конфигурации "сервер".
  • В блоке конфигурации "местоположение".
  • В области конфигурации "если".

passenger_ruby в http блок - то есть тот, который passenger-install-nginx-module output - используется в качестве интерпретатора Ruby по умолчанию для веб-приложений Ruby. Вам не нужно указывать passenger_ruby в http хотя блок, потому что по умолчанию используется первый ruby команда найдена в $PATH,

Вы также можете переопределить passenger_ruby или же passenger_python в определенных контекстах, если вы хотите использовать другой интерпретатор Ruby для этого веб-приложения. Например:

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 определяется исключительно интерпретатором Ruby, который вы использовали для запуска passenger команда. Измените это, и это будет работать как ожидалось. Это работает, даже если вы изначально установили Phusion Passenger, используя RubyGems, принадлежащий другой версии Ruby.

Другие вопросы по тегам