在新安装的Nginx / Passenger上运行Rails应用程序会导致错误“没有这样的文件加载 – 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.comreplace了实际的域名):

 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会产生一个Passenger错误屏幕,其中显示:

 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 

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

 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而Passenger似乎使用v1.8.7; 我不确定这与这个问题有什么关系。 (应用程序使用的Ruby居住在/home/rails/.rvm/rubies/ruby-2.0.0-p353/ 。)

我已经search乘客输出这个错误的其他问题,但迄今为止我没有尝试过修复这个问题。

我不知道这是否会有所帮助,但请尝试在您的项目文件夹中:

 which ruby # for example /home/rails/.rvm/rubies/ruby-2.0.0-p353/bin/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命令来passenger-install-nginx-module 。 它检查所有的依赖关系,如果可以继续下载并编译nginx。 默认情况下,它安装在/opt/nginx/

这并没有立即奏效。 我也必须创建一个nginx启动脚本; 说明在这里 。 此外,我不得不编辑/opt/nginx/conf/nginx.conf文件来添加一个引用到我的应用程序,也不得不注释掉的location /块。 毕竟这一点,并命令sudo service nginx restart ,该网站已经启动。