在全新安装的Nginx/Passenger 上运行 Rails 应用程序会导致错误"no such file to load -- bundler/setup (LoadError)"



我有一个运行Ubuntu 12.04的VPS。我已经按照这些和这些说明安装了Nginx和Passenger,并且根据说明,我已经添加到/etc/nginx/nginx.conf文件的http块以下行:

passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/bin/ruby;

和下面的块(我用www.example.com代替了实际的域名):

server {
    listen 80;
    server_name www.example.com;
    root /srv/rails/myapp/public;
    passenger_enabled on;
}

Rails应用程序位于目录/srv/rails/myapp/中,这也是一个Git项目目录。该目录及其所有内容归用户rails所有。我已将该目录设置为全球可写目录,并以用户rails的身份在其中运行以下命令:

git pull
gem install bundler
bundle install
rake db:migrate
RAILS_ENV=production bundle exec rake assets:precompile

在此之后,在开发模式下运行应用程序成功:当我命令rails s并打开http://www.example.com:3000时,应用程序工作正常。

然而,在完成上述所有操作并命令sudo service nginx restart后,打开http://www.example.com会显示乘客错误屏幕,其中显示:

no such file to load -- bundler/setup (LoadError)
  /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `gem_original_require'
  /usr/lib/ruby/vendor_ruby/1.8/rubygems/custom_require.rb:36:in `require'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:245:in `run_load_path_setup_code'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:348:in `running_bundler'
  /usr/lib/ruby/vendor_ruby/phusion_passenger/loader_shared_helpers.rb:243:in `run_load_path_setup_code'
  /usr/share/passenger/helper-scripts/rack-preloader.rb:100:in `preload_app'
  /usr/share/passenger/helper-scripts/rack-preloader.rb:158

下面有很多调试输出,我不确定哪些是有用的,但这里有一个摘录:

Application root
    /srv/rails/myapp
Environment (value of RAILS_ENV, RACK_ENV, WSGI_ENV and PASSENGER_ENV)
    production
Ruby interpreter command
    /usr/bin/ruby
User and groups
    uid=1001(rails) gid=1002(rails) groups=1002(rails)
Environment variables
    SHELL = /bin/bash
    PASSENGER_DEBUG_DIR = /tmp/passenger.spawn-debug.XXXX2fPMPM
    USER = rails
    PWD = /srv/rails/myapp
    SHLVL = 0
    HOME = /home/rails
    LOGNAME = rails
    SERVER_SOFTWARE = nginx/1.4.6
    IN_PASSENGER = 1
    PYTHONUNBUFFERED = 1
    NODE_PATH = /usr/share/passenger/node
    RAILS_ENV = production
    RACK_ENV = production
    WSGI_ENV = production
    NODE_ENV = production
    PASSENGER_APP_ENV = production
    SERVER_PROTOCOL = HTTP/1.1
    SCGI = 1
    DOCUMENT_ROOT = /srv/rails/myapp/public
    QUERY_STRING =
    SERVER_NAME = www.example.com
    REMOTE_PORT = 49316
    REMOTE_ADDR = [redacted]
    SERVER_PORT = 80
    REQUEST_METHOD = GET
    SERVER_ADDR = [redacted]
    REQUEST_URI = /
...
General Ruby interpreter information
    RUBY_VERSION = 1.8.7
    RUBY_PLATFORM = x86_64-linux
    RUBY_ENGINE = nil
    RubyGems version = 1.8.15

应用程序使用Ruby v2.0.0p353,而乘客似乎使用v1.8.7;我不确定那是否与这个问题有关。(应用程序使用的Ruby位于/home/rails/.rvm/rubies/ruby-2.0.0-p353/中)

我已经搜索了乘客输出此错误的其他问题,但到目前为止我没有尝试解决这个问题。

我不知道这是否有帮助,但是试试,在你的projects文件夹中:

which ruby # for example /home/rails/.rvm/rubies/ruby-2.0.0-p353/bin/ruby

这将输出你的bundle正在使用哪个ruby。输入该值,替换为:

passenger_ruby /usr/bin/ruby;

passenger_ruby /home/rails/.rvm/rubies/ruby-2.0.0-p353/bin/ruby

结束编辑:

这个Linux命令:

echo $MY_RUBY_HOME/bin/ruby

可能是找到你的ruby二进制文件的最简单和最正确的方法。

在尝试了各种方法之后,我放弃了从Debian软件包安装nginx。我删除了它,也删除了我的红宝石和RVM,然后重新安装了所有的东西,按照这些说明。本文建议如何使用附带的passenger-install-nginx-module命令安装nginx。它检查所有依赖项,如果可以继续,就下载并编译nginx。默认情况下,它安装在/opt/nginx/中。

这没有立即工作。我还必须创建一个nginx启动脚本;指令。此外,我必须编辑/opt/nginx/conf/nginx.conf文件以向我的应用程序添加引用,并且还必须注释掉location /块。完成所有这些操作后,命令sudo service nginx restart,站点就启动了。

相关内容

最新更新