nginxとPumaを連携し、nginx + Puma + Rails6の開発環境を構築する手順

Ruby

こんにちは。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 sRailsアプリケーションを起動できる環境がすでに用意されている前提で話を進めます。

Rails6の開発環境をCentOS8に構築する手順については『Rails6 + MySQL8の開発環境をCentOS8に構築する手順』で紹介していますので参考にしていただければと思います。

Rails6 + MySQL8の開発環境をCentOS8に構築する手順

2020年6月10日

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アプリケーションに送ることができます。

RubyでWebサーバーを立ち上げるインターフェースのことをRackと呼びます。

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種類あります。

Nginxの設定ファイル
  • /etc/nginx/nginx.conf: Nginx全般に関わる設定を記述するファイル
  • /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とRailsの連携手順
  1. Pumaの設定ファイルにソケット通信の情報を追加
  2. Nginxの設定ファイルにリバースプロキシの情報を追加
  3. Rackサーバー名を指定してRailsを起動

なお、今回検証サーバーを用意するために利用したConoHa VPSは、1ヶ月に満たない利用の場合は時間単位で料金が請求されるので、数十円くらいでサーバーの勉強や検証環境が用意できるオススメのVPSです!

この記事がいいなと思いましたらツイッター(@nishina555)のフォローもよろしくお願いします!

Rubyのオススメ参考書