У меня классический «монолитный» сервер, на котором запущено несколько Ruby-приложений под Passenger.В соответствии с документацией Пассажира это должно работать нормально, но я нашел несколько проблем, с которыми мне нужно разобраться.
В документации говорится:
Пассажир может быть установлен слюбой переводчик Ruby.После установки вы можете запускать компоненты Ruby Пассажира под любым интерпретатором Ruby, который вы хотите, даже если этот интерпретатор Ruby не был тем, с которым вы изначально установили Passenger.
[---]
Passenger isтакже может запускать веб-приложения Ruby под любым интерпретатором Ruby, который вы хотите.Поэтому не важно, какой Ruby вы используете для установки Passenger: он будет работать независимо.Пожалуйста, обратитесь к документации по директиве passenger_ruby, чтобы узнать, как запускать различные веб-приложения под разными интерпретаторами Ruby.
Я установил Passenger и модуль Apache, используя официальный пакет для моего дистрибутива SLES.Это довольно старая версия (5.0.18), но, поскольку дистрибутив все еще поддерживается, он исправлен для исправления любых известных уязвимостей безопасности.Этот Пассажир, конечно, установлен в системе Ruby.
У меня также есть несколько других установленных Ruby.Если я указываю на новую установку с использованием директивы PassengerRuby, она жалуется, что пассажир не найден.Я понял, Мне нужно установить Passenger под каждым интерпретатором Ruby , чтобы иметь возможность запустить приложение.(Я не видел этого объясненного в документации.) Это создает проблему, хотя.При установке Passenger под мой новый Ruby я использую rubygems напрямую, а не RPM.Я могу попытаться выбрать ту же версию, что и RPM (5.0.18), но тогда это будет не исправленная версия.Я также могу просто позволить команде gem выбрать самую последнюю (наиболее исправленную) версию, но тогда приложение не запустится:
App 21959 stderr: /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:941:in `try_write_file': undefined method `try_write_file' for #<Hash:0x0000560031e58c88> (NoMethodError)
App 21959 stderr: from /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:522:in `dump_envvars'
App 21959 stderr: from /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:464:in `dump_all_information'
App 21959 stderr: from /opt/rubies/ruby-2.5.1/lib/ruby/gems/2.5.0/gems/passenger-5.3.0/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb:394:in `about_to_abort'
App 21959 stderr: from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:89:in `rescue in init_passenger'
App 21959 stderr: from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:72:in `init_passenger'
App 21959 stderr: from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:152:in `<module:App>'
App 21959 stderr: from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:29:in `<module:PhusionPassenger>'
App 21959 stderr: from /usr/lib64/passenger/5.0.18//helper-scripts/rack-preloader.rb:28:in `<main>'
Это выглядит как вспомогательный скрипт из "основных" перехватчиков Passenger вновый пассажирИ я предполагаю, что ошибка в том, что som API мог измениться?
Итак, это моя первая проблема - требует ли установленный Пассажир, чтобы каждый использованный интерпретатор Ruby имел собственную установку точно такой же версии Пассажира?Как вы справляетесь с этим?
Теперь предположим, что я выполнил первый шаг и установил совместимых Пассажиров.Затем я пытаюсь снова запустить приложение:
App 1407 stdout:
[ 2018-05-15 21:34:57.4890 1367/7f1eda77b700 App/Implementation.cpp:303 ]: Could not spawn process for application /myApp: An error occured while starting up the preloader.
Error ID: 5a8f172f
Error details saved to: /var/run/passenger/passenger-error-XwWBnN.html
Message from application: You have already activated rack 2.0.5, but your Gemfile requires rack 2.0.3. Prepending `bundle exec` to your command may solve this. (Gem::LoadError)
Оказывается, что у самого Пассажира есть зависимость от Rack.Драгоценный камень высосал в последней версии, которая была Стойкой 2.0.5.Пассажир загружает эту версию, а затем выполняет настройку Bundler.Но приложение заблокировано до версии 2.0.3.Предварительное добавление пакета exec к директиве PassengerRuby не решает эту проблему, так как тогда сам Passenger не будет доступен - если я не добавлю его в Gemfile, что в документации совершенно ясно гласит, не должно быть необходимым.
Так что я могу синхронизировать эти версии, но тогда мне нужно будет синхронизировать версию Rack между всеми приложениями под конкретным интерпретатором Ruby.Это значительно уменьшает выгоду от упаковщика, это должно было решить такие проблемы.Или мне нужно связать мои приложения с текущим методом развертывания.Каков наилучший (наименее плохой) способ решить эту проблему?