我有一个运行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
,站点就启动了。