こんにちは。Enjoy IT Life管理人の仁科(@nishina555)です。
Railsアプリケーションを実際にサービスとして稼働させるためにはWebサーバーとの連携は必須です。
今回はPumaを利用してWebサーバー(nginx)とRailsアプリケーションを連携させる手順について紹介します。
Pumaの設定方法や、Railsとnginxの連携方法について知りたい方の参考になればと思います。
検証サーバーはConoHaのVPSを利用して作成をし、OSはCentOS8とします。
目次
今回の検証環境について
各種バージョンは下記の通りです。
$ cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)
$ node -v
v12.18.0
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
$ rails -v
Rails 6.0.3.1
$ gem list | grep puma
puma (4.3.5)
$ nginx -v
nginx version: nginx/1.14.1
Railsアプリケーション名はrails-app
とし、/srv
ディレクトリ配下にアプリケーションを配置します。
事前準備: 開発環境で起動できるRailsアプリケーションの用意
今回はbin/rails s
でRailsアプリケーションを起動できる環境がすでに用意されている前提で話を進めます。
Rails6の開発環境をCentOS8に構築する手順については『Rails6 + MySQL8の開発環境をCentOS8に構築する手順』で紹介していますので参考にしていただければと思います。
nginxの準備
Webサーバーとして利用するnginxの準備をします。
### インストール
$ sudo yum install -y nginx
### nginxの起動
$ sudo systemctl start nginx
### プロセス確認
$ ps -ef |grep nginx
→ nginxのプロセスがあればOK
### (必要であれば) 自動起動設定
$ sudo systemctl enable nginx
nginxがlistenしている80番ポートでに接続できるようにするためVPSのファイアウォール設定を変更します。
### 80番ポートの開放
$ sudo firewall-cmd --add-port=80/tcp --zone=public --permanent
### 設定を反映
$ sudo firewall-cmd --reload
### 設定確認
$ sudo firewall-cmd --list-all
http://[パブリックIP]
でアクセスし、ブラウザに以下の画面が表示されればOKです。

Pumaの設定ファイルの編集
PumaとはRails(Rubyフレームワーク)用のWebサーバーです。
PumaのWebサーバーとしての機能は貧弱なので、実際のサービスでは専用のWebサーバーを用意するのが一般的です。
WebサーバーとPumaを連携させることにより、Webサーバーが受けたリクエストをRailsアプリケーションに送ることができます。
PumaとWebサーバーが連携できるようにPumaの設定を編集していきます。
Webサーバーとの連携にはソケット通信が利用されるため、ソケットを生成する設定を行います。
$ vim /srv/rails-app/config/puma.rb
puma.rb
# 以下の部分をコメントアウト
# port ENV.fetch("PORT") { 3000 }
# socketの設定
bind "unix://#{Rails.root}/tmp/sockets/puma.sock"
# デーモン化(バックグラウンドでRailsを起動)したい場合は追記する
daemonize
nginxの設定ファイルの編集
nginxの設定ファイルを編集し、Pumaと連携できるようにします。
nginxの設定ファイルには2種類あります。
- /etc/nginx/nginx.conf: Nnginx全般に関わる設定を記述するファイル
- /etc/nginx/conf.d/[アプリ名].conf: アプリごとの設定を記述するファイル
今回は/etc/nginx/conf.d/rails-app.conf
というファイルを作成し、rails-app
アプリケーションに関するnginxの設定を行っていきます。
$ sudo vim /etc/nginx/conf.d/rails-app.conf
rails-app.conf
upstream rails-app {
# UNIXドメインソケット通信の設定
server unix:///srv/rails-app/tmp/sockets/puma.sock fail_timeout=0;
}
server {
# 80番ポート(HTTP)を許可
listen 80;
# ホスト名
server_name xxxxxx;
# 静的ファイル(画像など)のパスをドキュメントルートに設定
root /srv/rails-app/public;
location / {
# ドキュメントルート配下を以下の順で検索
# URIのパスに対するファイル(静的コンテンツ)が存在すれば、そのファイル返す。
# 存在しなければ、動的コンテンツとして@rails-appに内部リダイレクト。
try_files $uri @rails-app;
}
# nginxのリバースプロキシ設定
# 上記の@rails-appが呼び出された場合のみ以下の設定が読み込まれる
location @rails-app {
# サーバの指示通りにリダイレクト
proxy_redirect off;
# proxy_set_headerを利用することでサーバーに情報を転送できる
proxy_set_header Host $http_host; # ホスト名
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 送信元の経路情報
proxy_set_header X-Real-IP $remote_addr; #送信元のIPアドレス
# upstreamの名前を記述
proxy_pass http://rails-app;
}
}
上記の設定を行うことにより、nginxがリバースプロキシとして機能します。
public/
配下に配置されている静的ファイルはnginxが、動的ファイルはPumaを経由してRailsアプリケーションがサバくようになります。
起動確認
実際にWebサーバー経由でRailsアプリケーションにアクセスできるか確認してみます。
### nginxの設定を反映させるため再起動
$ sudo systemctl restart nginx
### Railsアプリケーションの起動
$ bin/rails s
WebサーバーとRailsアプリケーションがうまく連携できていれば、80番ポートでRailsアプリケーションの画面が表示されるようになっています。
http://[パブリックIP]
でアクセスし、RailsアプリケーションのWelcomeページが表示されればOKです。

まとめ
以上でnginxとPumaを連携し、nginx + Puma + Rails6の開発環境を構築する手順の紹介を終わります。
- Pumaの設定ファイルにソケット通信の情報を追加
- nginxの設定ファイルにリバースプロキシの情報を追加
- Rackサーバー名を指定してRailsを起動
なお、今回検証サーバーを用意するために利用したConoHa VPSは、1ヶ月に満たない利用の場合は時間単位で料金が請求されるので、数十円くらいでサーバーの勉強や検証環境が用意できるオススメのVPSです!
この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!