Сервер программы-приложения неожиданно завершил работу: обнаружен неожиданный конец файла
У меня нет большого опыта работы с 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.