【问题标题】:Knowledge gap when setting up Passenger and Rails设置乘客和铁路时的知识差距
【发布时间】:2013-10-11 23:44:35
【问题描述】:

我正在尝试设置Passenger、Rails 和Nginx。 Nginx 正确路由到Passenger,但是当我加载页面时出现以下错误:

cannot load such file -- bundler/setup (LoadError)
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:219:in `block in run_load_path_setup_code'
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:333:in `running_bundler'
/usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:217:in `run_load_path_setup_code'
/usr/share/passenger/helper-scripts/rack-preloader.rb:96:in `preload_app'
/usr/share/passenger/helper-scripts/rack-preloader.rb:150:in `<module:App>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `<module:PhusionPassenger>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:28:in `<main>'

我不明白的是:

  • 为什么会有很多对 Ruby 1.9.1 的引用?我默认使用 1.9.3,并且在全局 1.9.3 和用户特定的 1.9.3 上都安装了 Bundler。
  • 如何更改在哪个用户上运行 Passenger?
  • 我是否也应该在Passenger 的用户中安装一堆gem?
  • 我是否需要授予 www-data(该乘客在 AFAIK 上运行)访问某个 gem 目录的权限?
  • 我应该增加 GEM_HOME 吗?如果是,我应该指向哪个 gem 目录?
  • 为什么在安装 nginx 乘客包时没有进行此设置?

我基本上在所有可以安装的地方都安装了 bundler,但肯定漏掉了一些重要的东西。

  • RVM 如何使事情复杂化?
  • 使用 RVM 时需要注意什么?
  • 系统中的每个用户是否都获得了我在 RVM 中设置的 Ruby 版本?如果没有,我该怎么做?

我觉得我现在已经接近掌握全部内容了,但我自己还没有读懂解决方案。

如果您转到http://privateering.me:8000/,您可以看到错误转储的其余部分。

【问题讨论】:

  • 据我所知,路径中使用了 1.9.1,即使您正在运行 1.9.3。这本身不是问题。不过,我想不出任何好的理由为什么有人认为在路径中有 1.9.1 是个好主意。另外,请阅读rvm wrapper,它会为您生成具有正确 gemset 和 ruby​​ 版本的二进制存根(例如乘客)。
  • 我知道乘客被配置为使用包装器somewhere,因为我在配置文件中看到了它。问题似乎是 www-data 没有所需的 ruby​​ 版本,也没有 gem。在这一点上,我觉得让乘客在 www-data 上运行会更好,或者将 GEM_PATH 更改为指向我用来安装所有内容的用户的 gem 目录
  • IIRC,早在几年前的黑暗时代,*nix 存储库的维护者之间有一个很大的恶臭,即 Ruby 开发进展过快并给他们造成了负担当他们试图跟上。结果,“他们”决定坚持使用 Ruby191 作为 Ruby 1.9+ 版本的名称。从源代码或映像安装的 RVM 不依赖 repos,因此它的版本号更加合理,因为它们来自 Ruby 开发人员自己,没有 repo 维护者。因此,我建议使用 RVM 或 rbenv。

标签: ruby-on-rails ruby ubuntu nginx ruby-on-rails-4


【解决方案1】:

现在是早上!我喝过咖啡!我们走吧!

我不明白为什么会有很多关于 ruby​​ 的引用 1.9.1?

正如 tessi 所述,路径中的 1.9.1 对于 Ruby 1.9.3 的某些构建是正常的。这很奇怪和令人困惑,但它就是这样。这本身并不会立即引起关注。

此外,我如何更改运行的用户乘客?

Phusion 有一些非常好的documentation for Phusion/Nginx,它包含了所有的配置参数。但这可能没有必要,因为user-related docs 会告诉你,Passenger 默认会尝试以拥有它的用户身份运行每个应用程序。

我是否也应该在乘客的用户上安装一堆 gem?

也许吧。可能不是。看上面。只要有可能,就没有一个“乘客用户”。只有当用户切换不可用时,Passenger 才会回退到以单个用户身份运行(无论 nginx 配置什么)。

为什么在安装 nginx 乘客包时没有进行此设置?

因为Passenger 只是一个多租户、多语言的应用服务器。它不知道您是在运行一个应用程序还是一百个应用程序,Ruby 或 Python,Rails 或 Sinatra 或 Merb 或自制的东西。乘客的工作是在你告诉它是什么后运行应用程序;你的工作是让每个应用程序进入可运行状态。

RVM 如何使事情复杂化?使用 RVM 时需要注意什么?系统中的每个用户是否都获得了我在 RVM 中设置的 ruby​​ 版本?不然怎么办?

RVM 使事情变得非常复杂。默认情况下,它以单用户为基础安装,并且仅影响单个用户。这正是它的预期用例:当我登录时,想要一个不同的 Ruby 并且不想污染系统。由于 RVM 工作的特殊方式,还有其他复杂性。

但 Phusion 意识到有些人会出于任何原因在生产中使用 RVM and covers that situation in the installation documentation

通过将 RVM 排除在图片之外,可以轻松避免大多数涉及 RVM 和乘客的痛苦。除非您在一个非常奇特的平台上,否则构建现代 Ruby 是 ./configure &amp;&amp; make &amp;&amp; make install 的问题。一行代码,您就可以在/usr/local 中获得一个稳定的、系统范围的 Ruby,您、Passenger 和其他所有人都可以轻松访问。

【讨论】:

  • 谢谢,这太棒了。我也对在生产机器上使用 rvm 持怀疑态度。我想限制出错的可能性,因此只使用我运行网站所需的内容。但是我读过的每个教程都推荐了它。我现在终于解决了,passenger_ruby(在站点 nginx 配置文件中)必须指向我想使用的 ruby​​ 版本。我会将此标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多