Ruby on Rails

【Rails】EC2環境下でのRails 5.2+Nginxで動かしてブラウザで確認

・Rails 5.2 + Puma + Nginx でRailsアプリケーションを動かす方法の紹介

Ruby on RailsにはWEBサーバーとしてPumaが用意されています。
rails sコマンドによってPumaが実行されアプリケーションとしての機能が果たせます。

Pumaのみでもブラウザでの確認は出来ますがやはりWEBサーバーのため本格的なアプリケーションの運用を考えるとアプリケーションサーバーを用意して、負荷分散した方が良いです。

今回はアプリケーションサーバーでは有名のNginxを使いRailsアプリケーションが動かせる方法を紹介します。

環境情報

環境自体はタイトルにもあるようにEC2です。
Ruby、Rails、Puma、Nginxのバージョンは以下となります。

Ruby:2.6.3
Rails:5.2.1
Puma:3.11(Gemfile記載)
Nginx:1.12.2

例によってRailsアプリケーションはrails newコマンドで作成されたプロジェクトを使っています。
作成したRailsアプリケーションは「/var/www/」直下に配置しています。

RubyやRailsのインストールは省略します。

Nginxのインストール

まずはNginxのインストールです。
EC2環境でのNginxは下記コマンドでインストールします。

sudo amazon-linux-extras install nginx1.12

参考サイト
https://qiita.com/kazehiki03/items/7712660dd0401186ac4d

余談ですが、Nginxのアンインストールは「yum remove nginx」で可能です。

Nginx nginx.conf ファイル修正

Nginxインストール後、「/etc/nginx/nginx.conf」を動かすRailsアプリケーションのプロジェクトに合わせて修正します。
下記のファイルのうち、カッコ([])の部分を利用する環境、Railsのプロジェクト名に合わせて修正してください。

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile            on;
    keepalive_timeout   65;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    upstream [rails プロジェクト名] {
      server unix:///var/www/[rails プロジェクト名]/tmp/sockets/puma.sock;
    }

    server {
        listen       80;
        server_name  [EC2 パブリックIPアドレス] ;
        access_log /var/log/nginx/app_access.log;
        error_log /var/log/nginx/app_error.log;
        try_files $uri/index.html @rails_app;
        root home/ec2-user/var/www/[rails プロジェクト名]/public;
        client_max_body_size 15M;
        client_body_temp_path /tmp/client_body;

        location @rails_app {
          proxy_pass http://[rails プロジェクト名];
        }
        location ~ ^/assets/ {
          root /var/www/[rails プロジェクト名]/public;
        }

        error_page 404 /404.html;
            location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
}

環境に合わせて修正する箇所は6個です。
[rails プロジェクト名] はrails newコマンド等で設定したRailsプロジェクト名を。
[EC2 パブリックIPアドレス]はEC2インスタンスのパブリックIPアドレスを入力します。

その他、Railsアプリケーションの置き場が「/var/www/」以外の場合、27行目と44行目のパスを修正してください。

Rails puma.rb追記

Rails(Puma)とNginxを連携させるためにPumaの設定ファイル([rails プロジェクト名]/config/puma.rb)に下記bind項目を追記します。

bind "unix:///#{Rails.root}/tmp/sockets/puma.sock"

Nginx実行・ブラウザで動作確認

nginx.confファイルとpuma.rbファイルを修正したら完了です。
下記コマンドからNginxを実行してください。

sudo systemctl restart nginx

メッセージが返却されなければ正常稼働中です。
何かしらのメッセージが返却されている場合は失敗している場合があるため上記設定に誤りが無いことを確認してください。

nginxが正しく起動したらブラウザで確認します。
EC2パブリックIPアドレスをブラウザで入力して、Railsスタートページが表示されていれば完了です。

URL:http:// [EC2 パブリックIPアドレス]

最後に

以上でRails+Puma+Nginxでデプロイ出来る環境が完了しました。

最初にも伝えましたが本格的なアプリケーション運用を考えるとNginxは必須ですが学習レベルの、常駐しないアプリケーションであるならPumaのみでも問題無いかと思います。

今回、NginxはEC2環境での導入となりましたが最初はDockerのコンテナ環境での導入を考えました。
ただうまくNginxが立ち上がらないためEC2で実施した次第です。

AWS CodePipelineを使ったEC2のデプロイは下記を参照ください。