CentOS8にNginxとRails、Passengerを導入する方法

投稿者: | 2020-09-13

今回はCentOS8にNginxとRails、Passengerを導入し、サンプルのアプリケーションを表示するところまで説明します。

実施環境

OS CentOS8 最小のインストール
Nginx 1.18.0
Ruby 2.7.1
Rails 6.0.3.2
yarn 1.22.5
Node.js 14.9.0
Passenger 6.0.6

事前準備

初めにRuby用のユーザーの作成、必要なコマンド等のインストールを行います。

・Rails用ユーザー・railsを作成しパスワードを設定する
# useradd rails
# passwd rails

・git等のコマンドをインストールする
# dnf groupinstall -y "Development Tools"

・Ruby、Railsのインストールに必要なものをインストールする
# dnf -y install bzip2 gcc openssl-devel readline-devel zlib-devel sqlite-devel libcurl-devel pcre-devel 

Rubyのインストール

次にRubyをインストールします。今回は複数のRubyのバージョンを管理できるrbenvからRubyをインストールします。

・Ruby用ユーザー・railsに変更する
$ su - rails

・rbenvをダウンロードする
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

・ruby-buildをダウンロードする
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build 

rbenv、ruby-buildのダウンロード後、rbenvコマンド用に環境変数を設定します。

・rbenvコマンドの環境変数を設定する
$ vi .bash_profile

■.bash_profile
------------------------------------------------------------
    --- 省略 ---
# User specific environment and startup programs
# rbenv setting
export PATH="$HOME/.rbenv/bin:$HOME/.rbenv/versions/2.7.1/bin:$PATH" 
eval "$(rbenv init -)"
------------------------------------------------------------

・.bash_profileを反映させる
$ source .bash_profile

・rbenvコマンドが使用できることを確認する
$ rbenv -v
rbenv 1.1.2-34-g0843745

rbenvのダウンロード後、rbenvコマンドを使用しRubyをインストールします。今回はRuby 2.7.1をインストールします。Rubyのインストール後、rubyコマンドでバージョンが表示されれば成功です。

・インストール可能なRubyのバージョンを確認する
$ rbenv install -l
2.5.8
2.6.6
2.7.1
jruby-9.2.13.0
maglev-1.0.0
mruby-2.1.2
rbx-5.0
truffleruby-20.2.0
truffleruby+graalvm-20.2.0

・Ruby 2.7.1をインストールする(多少時間がかかります)
$ rbenv install 2.7.1

・切替可能なRubyのバージョンを確認する
$ rbenv versions
* system
  2.7.1

・Rubyのバージョンを切り替える
$ rbenv global 2.7.1

・Rubyのバージョンを確認する
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]

Node.jsとyarnのインストール

Rubyのインストール後、Rails6用のNode.jsとサンプルアプリケーション用にバージョンの新しいyarnを導入します。

・Node.jsの14.xをyumリポジトリに追加
# curl --silent --location https://rpm.nodesource.com/setup_14.x | bash - 

・yarnの最新版をyumリポジトリに追加
#  curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo 

・Node.js、yarnをインストールする
# dnf -y install nodejs yarn

・Node.jsとyarnのバージョンを確認する
$ node -v
v14.10.1

$ yarn -v
1.22.5

※注意
yarnはgemからインストールすることも可能ですが、gemのyarnはバージョンが古いため、サンプルアプリケーション作成時にyarnでエラーが出てしまいます。

PassengerとNginxのインストール

Node.jsとyarnのインストール後、PassengerとNginxをインストールします。NginxはPassengerのモジュールをインストールする際に自動インストールするNginxを使用します。

PassengerのインストールについてはRuby用ユーザー・railsで、PassengerのモジュールおよびNginxのインストールはrootユーザーで行います。

・Passengerのインストール
$ gem install passenger

・Passengerのバージョンを確認する
$ passenger -v
Phusion Passenger 6.0.6

・Passenger実行用のアクセス権を付与する
$ chmod o+x "/home/rails"

・Nginx用のPassengerモジュールをインストールする
# passenger-install-nginx-module

1.最初の手順確認はEngerを押す
-----------------------------------------------------------
Welcome to the Phusion Passenger Nginx module installer, v6.0.6.

This installer will guide you through the entire installation process. It
shouldn't take more than 5 minutes in total.

Here's what you can expect from the installation process:

 1. This installer will compile and install Nginx with Passenger support.
 2. You'll learn how to configure Passenger in Nginx.
 3. You'll learn how to deploy a Ruby on Rails application.

Don't worry if anything goes wrong. This installer will advise you on how to
solve any problems.

Press Enter to continue, or Ctrl-C to abort.
-----------------------------------------------------------

2.言語選択画面はRubyを選択しEnterを押す
-----------------------------------------------------------
Which languages are you interested in?

Use  to select.
If the menu doesn't display correctly, press '!'

 ? ?  Ruby
   ?  Python
   ?  Node.js
   ?  Meteor
-----------------------------------------------------------

3.必須ソフトウェアの確認が行われる(不足しているとエラーで終了する)
-----------------------------------------------------------
* Checking for C compiler...
      Found: yes
      Location: /usr/bin/cc
 * Checking for C++ compiler...
      Found: yes
      Location: /usr/bin/c++
 * Checking for A download tool like 'wget' or 'curl'...
      Found: yes
      Location: /usr/bin/wget
 * Checking for Curl development headers with SSL support...
      Found: yes
      curl-config location: /usr/bin/curl-config
      Header location: somewhere, not sure where
      Version: libcurl 7.61.1
      Usable: yes
      Supports SSL: yes
 * Checking for OpenSSL development headers...
      Found: yes
      Location: true
 * Checking for Zlib development headers...
      Found: yes
      Location: true
 * Checking for Rake (associated with /usr/local/rbenv/versions/2.7.1/bin/ruby)...
      Found: yes
      Location: /usr/local/rbenv/versions/2.7.1/bin/ruby /usr/local/rbenv/versions/2.7.1/bin/rake
 * Checking for OpenSSL support for Ruby...
      Found: yes
 * Checking for RubyGems...
      Found: yes
 * Checking for Ruby development headers...
      Found: yes
      Location: /usr/local/rbenv/versions/2.7.1/include/ruby-2.7.0/ruby.h
 * Checking for rack...
      Found: yes
-----------------------------------------------------------

4.Nginxのインストールについて聞かれるため1を選択する
-----------------------------------------------------------
Automatically download and install Nginx?

Nginx doesn't support loadable modules such as some other web servers do,
so in order to install Nginx with Passenger support, it must be recompiled.

Do you want this installer to download, compile and install Nginx for you?

 1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.18.0 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

 2. No: I want to customize my Nginx installation. (for advanced users)
    Choose this if you want to compile Nginx with more third party modules
    besides Passenger, or if you need to pass additional options to Nginx's
    'configure' script. This installer will  1) ask you for the location of
    the Nginx source code,  2) run the 'configure' script according to your
    instructions, and  3) run 'make install'.

Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.

Enter your choice (1 or 2) or press Ctrl-C to abort:1
-----------------------------------------------------------

5.インストール先を指定する。今回は「/usr/local/nginx」を指定する
-----------------------------------------------------------
Where do you want to install Nginx to?

Please specify a prefix directory [/opt/nginx]:/usr/local/nginx
-----------------------------------------------------------

6.Nginxのインストール成功後、Enterを押す
-----------------------------------------------------------
Nginx with Passenger support was successfully installed.

The Nginx configuration file (/usr/local/nginx/conf/nginx.conf)
must contain the correct configuration options in order for Phusion Passenger
to function correctly.

This installer has already modified the configuration file for you! The
following configuration snippet was inserted:

  http {
      ...
      passenger_root /usr/local/rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/passenger-6.0.6;
      passenger_ruby /usr/local/rbenv/versions/2.7.1/bin/ruby;
      ...
  }

After you start Nginx, you are ready to deploy any number of Ruby on Rails
applications on Nginx.

Press ENTER to continue.
-----------------------------------------------------------

※参考
PassengerのNginxのインストールで特定のバージョンを指定したい、configureオプションをカスタマイズしたい場合は、事前にNginxのソースファイルをダウンロードしておき、Nginxのインストール時に2を選択することでカスタマイズすることができます。

NginxのUnitファイルの作成、nginx.confの設定

Nginxをソースインストールした場合、Unitファイルがインストールされないため手動で作成します。

・NginxのUnitファイルを作成する
# vi /lib/systemd/system/nginx.service

■nginx.service
------------------------------------------------------------
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target 
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target
------------------------------------------------------------

・NginxのUnitファイルを反映させる
# systemctl daemon-reload

Unitファイル作成後、Nginxの設定ファイルを編集します。今回はserver部分を別ファイルとして作成するため、nginx.confのデフォルトで設定されているserver { … }部分はコメント化もしくは削除してください。

・Nginx用ユーザーを作成する
# useradd nginx

・nginx.confを編集する
# vi /usr/local/nginx/conf/nginx.conf

■nginx.conf
------------------------------------------------------------
user    nginx;

http {
         --- 省略 ---

         # testapp用のサーバ情報ファイルを読み込む
         include    /usr/local/nginx/conf/testapp.conf;
}
------------------------------------------------------------

・サンプルアプリ用のサーバの設定ファイルを作成する
# vi /usr/local/nginx/conf/testapp.conf

■testapp.conf
------------------------------------------------------------
server {
        listen       80;
        server_name  localhost;

        # Application Root
        root    /var/www/testapp/sample/public;

        # Passenger enable
        passenger_enabled    on;
        passenger_app_env development;
}
------------------------------------------------------------

Nginxの設定ファイルの編集後、設定ファイルの構文が問題ないかどうかを確認します。

・Nginxの設定ファイルの構文をチェックする
# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 

Nginxの設定後、Nginxを起動します。

・Nginxを起動し、自動起動を設定する
# systemctl start nginx
# systemctl enable nginx

Nginx起動後、FirewallでHTTPを許可します。

・FirewallでHTTPを許可する
# firewall-cmd --add-service=http --zone=public --permanent
# firewall-cmd --reload

Railsとbundlerのインストール

Nginxの設定後、Railsとbundlerをインストールします。どちらもRuby用ユーザー・railsで行うため、事前にユーザーを切り替えておいてください。

・Railsとbundlerをインストール
$ gem install rails bundler

サンプルアプリケーションの作成

Railsのインストール後、Railsのサンプルアプリを作成します。

・Webサーバのrootディレクトリを作成し、ディレクトリに移動する
# mkdir -p /var/www/testapp && cd /var/www/testapp

・Railsのサンプルアプリケーションを作成する
# rails new sample

・Nginxのrootディレクトリの所有者を変更する
# chown -R nginx.nginx /var/www

動作確認

サンプルアプリケーション作成後、ブラウザを開き「http://<サーバのIPアドレス>」を実行します。以下のRailsのトップページが表示されれば成功です。