CentOS Install Passenger for ROR
简介
本篇文章涉及到的内容都是基于阿里云主机上面操作的,具体系统和软件版本如下:
- CentOS
- LSB Version: :core-4.1-amd64:core-4.1-noarch
- Distributor ID: CentOS
- Description: CentOS Linux release 7.9.2009 (Core)
- Release: 7.9.2009
- Codename: Core
- Ruby:2.7.4
- Rails:7.0.4
- Nginx:1.20.1,云服务已经默认安装了
- Passenger:Phusion Passenger(R) 6.0.15
本篇文章主要目的:
- 如何在 CentOS 上安装 Passenger
- 如何通过 Passenger 运行、访问 ruby on rails 应用
安装 ruby
如果直接使用 yum install -y ruby
安装 ruby,其版本是 2.0.x,而我需要安装 2.7.x 版本。
成功安装 ruby 是接下来一切操作的基础,使用 root 账号登录云主机,按照下面步骤操作即可。如果使用非 root 账号安装,需要在下面命令前加 sudo。
1 | 安装源 |
检查 ruby 版本,如果不是 ruby-2.7
,可以重新执行如下命令
1 | yum install -y rh-ruby27 |
安装完成后,执行
1 | scl enable rh-ruby27 |
配置开机自动切换到 ruby27,新建并编辑文件
vim /etc/profile.d/rh-ruby27.sh
1 | source /opt/rh/rh-ruby27/enable |
安装后的 ruby 在 /opt/rh/rh-ruby27/root/usr/bin/ruby
下。
安装 rails
安装 ruby 稍微麻烦一点,接下来我们安装 rails
1 | gem install rails |
我在安装 rails 遇到了一个问题(报错)
gem install rails
Building native extensions. This could take a while…
ERROR: Error installing rails:
ERROR: Failed to build gem native extension.current directory: /opt/rh/rh-ruby27/root/usr/local/share/gems/gems/racc-1.6.0/ext/racc/cparse
/opt/rh/rh-ruby27/root/usr/bin/ruby -I /opt/rh/rh-ruby27/root/usr/share/rubygems -r ./siteconf20221029-17728-1uvh5rb.rb extconf.rb
mkmf.rb can’t find header files for ruby at /opt/rh/rh-ruby27/root/usr/share/include/ruby.hYou might have to install separate package for the ruby development
environment, ruby-dev or ruby-devel for example.extconf failed, exit code 1
Gem files will remain installed in /opt/rh/rh-ruby27/root/usr/local/share/gems/gems/racc-1.6.0 for inspection.
Results logged to /opt/rh/rh-ruby27/root/usr/local/lib64/gems/ruby/racc-1.6.0/gem_make.out
卸载已经安装的 ruby-devel,一般都是其版本和 ruby 版本不一致导致的,重新安装对应版本。
1 | 安装源 |
安装 Passenger
安装 Passenger 比较简单,如果你不是使用 root 账号登录,下面命令需要加上 sudo。
1、enable EPEL
EPEL:Extra Packages for Enterprise Linux
1 | yum install -y yum-utils |
2、repair potential system issues
避免在安装 Passenger 时,由于一些系统限制导致安装失败
1 | Ensure curl and nss/openssl are sufficiently up-to-date to talk to the repo |
3、install Passenger packages
1 | Install various prerequisites |
4、restart Nginx
重启 nginx
1 | systemctl restart nginx |
5、check installation
检查是否安装成功
1 | sudo /usr/bin/passenger-config validate-install |
显示如下信息表示成功
1 | * Checking whether this Phusion Passenger install is in PATH... ✓ |
使用如下命令看下运行状态
1 | sudo /usr/sbin/passenger-memory-stats |
显示类似如下状态表示正常
1 | Version: 6.0.15 |
至此,Passenger 安装完成。
创建 ROR 应用
通过 rails 创建应用比较简单,在这一步我是用非 root 账号创建的即普通账号(ptyh) 创建的应用。
您可以去了解一下如何在 CentOS 中添加用户(添加用户adduser ptyh
、设置密码passwd ptyh
)。
创建 articles 应用,如下
1 | rails new articles |
创建成功后的工程 articles
在目录 /home/ptyh/rails_projs
下。
我们可以启动一下这个工程,确保它本身是正常的。
1 | rails s -b 0.0.0.0 -p 8080 |
我在阿里云上面是开放了 8080 端口的,这样你可以通过 云主机公网IP:8080
访问到,看到如下界面表示成功。
确保您的工程运行和访问没有问题后,停止该服务的运行(ctrl+c)。
我们继续往下看~
配置 Nginx + Passenger
这一步至关重要,关系到是否能通过 passenger 成功运行和访问 ROR 应用。
我们去检查一下 passenger 配置,该配置文件在 /etc/nginx/conf.d/passenger.conf
下,内容如下:
1 | passenger_root /usr/share/ruby/vendor_ruby/phusion_passenger/locations.ini; |
可以看出 ruby 路径不对,修改如下
1 | passenger_root /usr/share/ruby/vendor_ruby/phusion_passenger/locations.ini; |
如果不做修改(ruby 版本不一致),后续在通过 passenger 启动的 ror 应用程序会报类似 cannot load such file -- bundler/setup (LoadError)
的错误。
接下来,我们配置一下 nginx,其配置文件在 /etc/nginx/nginx.conf
1 | #user nginx; |
修改的地方在文件中都有注释,修改完成后保存,记得重新 reload 该配置文件
1 | nginx -s reload |
访问 ROR Web 应用
到这里,基本搞定了,还剩最后一公里,冲。。。
之前说过,修改了 nginx 配置后需要重新 reload,另外我们不需要单独去启动 articles 这个项目。
如果我的云主机公网IP是 12x.x12.13.10x,我们在浏览器上打开 http://12x.x12.13.10x:80,大概率是无法正常显示应用的首页的。
查看 nginx error log 可以发现这样的错误:
Error opening ‘/home/ptyh/rails_projs/articles/Passengerfile.json’ for reading: Permission denied (errno=13);
This error means that the Nginx worker process (PID 7991, running as UID 99) does not have permission to access this file.
Please read this page to learn how to fix this problem:
https://www.phusionpassenger.com/library/admin/nginx/troubleshooting/?a=upon-accessing-the-web-app-nginx-reports-a-permission-denied-error;
我们修改一下工程目录权限,命令如下:
1 | sudo chmod -R g+x,o+x /home/ptyh/rails_projects/articles |
再次访问 http://12x.x12.13.10x:80 即可。
关键文件
我在这里给大家罗列一下用到的配置文件及其路径。
nginx 配置文件:/etc/nginx/nginx.conf
nginx 日志文件:/var/log/nginx
ruby 可执行文件: /opt/rh/rh-ruby27/root/usr/bin/ruby
passenger 配置文件: /etc/nginx/conf.d/passenger.conf
通过 nginx -t
可以找到 nginx 配置文件路径,在其配置文件中可以看到日志文件路径。