如何解决Ruby版本不匹配问题?Phusion Passenger+NGINX部署RoR报错
解决Phusion Passenger + NGINX部署RoR应用的Ruby版本不匹配问题
这个问题我碰到过好多次了——核心原因就是Phusion Passenger没有使用你通过rbenv安装的Ruby 2.5.1,而是默认调用了系统自带的Ruby 2.3.1。本地rails s能正常运行是因为你的终端加载了rbenv的环境变量,但Nginx/Passenger作为系统服务启动时,并不会继承这些用户级的环境配置。
下面是具体的解决步骤:
1. 确认rbenv管理的Ruby 2.5.1的实际路径
在你的终端里(也就是能正常运行rails s的那个环境),执行以下命令获取Ruby 2.5.1的绝对路径:
rbenv which ruby
输出会类似这样:
/home/your-username/.rbenv/versions/2.5.1/bin/ruby
把这个路径记下来,后面要用到。
2. 配置Passenger使用指定的Ruby版本
有两种可靠的方式让Passenger使用正确的Ruby版本,选其中一种即可:
方式一:直接在Nginx配置中指定Ruby路径
找到你的Nginx站点配置文件(通常在/etc/nginx/sites-available/或/etc/nginx/conf.d/目录下),打开后在server块中添加passenger_ruby指令,指向刚才获取的路径:
server { listen 80; server_name your-domain.com; # 替换成你的域名或IP root /path/to/your/rails/app/public; # 替换成你的Rails应用public目录路径 passenger_enabled on; # 添加这一行,使用rbenv管理的Ruby版本 passenger_ruby /home/your-username/.rbenv/versions/2.5.1/bin/ruby; }
保存配置后,重启Nginx服务:
sudo systemctl restart nginx
方式二:让Passenger加载rbenv的环境变量
如果你的服务器上有多个Rails应用,且都用rbenv管理Ruby版本,可以让Passenger加载rbenv的环境配置:
- 在你的Rails项目根目录创建一个
config/passenger_env_vars.conf文件,内容如下(替换成你的用户名):
PATH=/home/your-username/.rbenv/shims:/home/your-username/.rbenv/bin:$PATH
- 在Nginx的站点配置中添加以下指令,指向这个文件:
server { # 其他配置... passenger_env_vars_file /path/to/your/rails/app/config/passenger_env_vars.conf; }
同样,保存后重启Nginx。
3. 确保Gemfile与Ruby版本一致且依赖安装正确
- 打开你的Rails项目根目录下的
Gemfile,确认里面的Ruby版本声明是:
ruby '2.5.1'
- 在终端的项目根目录下,重新安装依赖(确保用的是rbenv的Ruby):
bundle install
这会把gem安装到rbenv管理的Ruby路径下,而不是系统Ruby的/var/lib/gems/2.3.0目录。
4. 验证配置是否生效
执行以下命令查看Passenger当前使用的Ruby版本:
passenger-config about ruby-command
如果输出的Ruby版本是2.5.1,说明配置成功了。此时再访问你的应用,版本不匹配的错误应该就消失了。
内容的提问来源于stack exchange,提问作者Jasjeet Singh
相关产品推荐
相关产品推荐

