BETA

Rails6でpumaとnginxを連携

投稿日:2020-01-12
最終更新:2020-01-14

pumaとnginxを連携させて、

  • 静的ファイルはnginxから配信
  • 動的処理はrailsアプリケーションに

こうなるようにしていきます。
1からrailsアプリケーションを作成し、さくらVPS上で作業します。

Webサーバとアプリケーションサーバの違いについては以下の記事が分かりやすいです。
Rails開発におけるwebサーバーとアプリケーションサーバーの違い(翻訳) - Qiita
よくわかんないっていう人は目を通しておいてください。

環境
・OS Debian 10.2
・Rails 6.0.2.1
・nginx 1.14.2

Railsアプリを作成

railsをインストールする手順は以下を参考にしてください。

一つだけ注意点。
Rails6からはアセットのプリコンパイルにwebpackerを使用するので、node.jsとyarnが必要になってきます。
Linuxbrewを使えば、以下のようにMacと同じ要領でインストールできます。
さらにanyenvを使用することでさらに便利にインストールできます。

# node.jsをバージョン管理するnodenvをインストール  
$ anyenv install nodenv  

# node.jsをインストール  
$ nodenv install 13.6.0  
$ nodenv global 13.6.0  
$ nodenv versions  
  system  
* 13.6.0 (set by /home/bruno/.anyenv/envs/nodenv/version)  

# nodeコマンドが使えるか確認  
$ node -v  
v13.6.0  
$ npm -v  
6.13.4  

# yarn インストール  
$ brew install yarn  
$ yarn -v  
1.12.1  

# webpackerインストール  
$ rails webpacker:install  

railsアプリケーションは/srv/ディレクトリ以下に作成します。
DBはpostgresqlを使用します。

$ cd /srv/  
$ sudo bin/rails new sample -d  postgresql  
$ sudo chown -R ユーザ名:グループ名 sample  
$ cd sample/  
$ bundle  

これでセットアップ完了です。
サンプルとしてMemoモデルを作成します。

$ bin/rails g scaffold Memo title:string content:text  

DB設定

次にDBの設定です。
まずは本番環境用のDBを作成して、マイグレートします。
なお、config/database.ymlのproductionに書いてあるusernameのユーザーを予め作成しておいてください。
でないと、「Roleがありません」と怒られます。

postgresqlの操作に関しては以下記事を参照してください。
postgresqlをインストール&SQLの基本

以下を実行します。

$ bin/rails db:create RAILS_ENV=production  
$ bin/rails db:migrate RAILS_ENV=production  

puma設定

pumaの設定行っていきます。
config/puma.rbを以下を追加します。

# 以下の部分をコメントアウト  
# port  ENV.fetch("PORT") { 3000 }  

bind "unix://#{Rails.root}/tmp/sockets/puma.sock" # socketの設定  
daemonize # デーモン化  
stdout_redirect "#{Rails.root}/log/stdout", "#{Rails.root}/log/stderr" # 標準主力とエラー出力先を指定  

どんな設定ができるかは以下の公式ドキュメントにあるファイルに書いてあります。
puma/puma

nginx設定

自分のサーバーでは各サイト用の設定は/etc/nginx/sites-available/* に書いてあります。
ですのでそこにsample.comファイルを作成し、/etc/nginx/sites-enabled/*の方にそのファイルのシンボリックリンクを作成します。
またSSLに対応します。

nginxのバーチャルホストの設定、SSL化の仕方については下記記事を参照してください。
nginxでVirtualHostを使って複数ドメインサイトを構築&SSLに対応する

/etc/nginx/sites-available/sample.com

upstream puma {  
  # さっきpuma.rbに書いたものと同じものを記述  
  server unix:///srv/sample/tmp/sockets/puma.sock fail_timeout=0;  
}  

server {  
    # httpをhttpsにリダイレクト  
    listen 80;  
    server_name sample.com  
    return 301 https://$host$request_uri;  
}  

server {  
  listen 443 ssl;  
  server_name sample.com;  
  ssl on;    
  ssl_certificate /etc/letsencrypt/live/sample.com/fullchain.pem;    
  ssl_certificate_key /etc/letsencrypt/live/sample.com/privkey.pem;  

  keepalive_timeout 10;  

  root /srv/sample/public;  
  access_log /srv/samplet/log/nginx.access.log;  
  error_log /srv/sample/log/nginx.error.log;  

  try_files $uri/index.html $uri @puma;  

  location @puma {  
    proxy_read_timeout 300;  
    proxy_connect_timeout 300;  
    proxy_redirect off;  
    proxy_set_header Host $host;  
    proxy_set_header X-Forwarded-Proto $scheme;  
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
    # upstreamの名前を記述  
    proxy_pass http://puma;  
  }  

  error_page 500 502 503 504 /500.html;  
}  

最後にリンクを張ります。

$ ln -s /etc/nginx/sites-available/sample.com /etc/nginx/sites-enabled/sample.com  

サーバ起動

最後に両方のサーバを起動します。
サーバを起動する前に、アセットのコンパイルを行っておきます。
本番環境ではデフォルトで、アセットの自動コンパイルが無効となっているらしいです。

$ bin/rails assets:precompile  

次にそれぞれのサーバの起動方法についてみていきます。

pumaの場合

# -Cオプションで設定ファイルを指定して起動  
$ bin/rails puma -C config/puma.rb  

# 下記でも可能  
$ bin/rails pumactl start  

# 停止  
$ bin/rails pumactl halt  

# 再起動  
$ bin/rails pumactl restart  

ただ、上記の二つのコマンドではuninitialized constant #<Class:#<Puma::DSL:0x000000024dec00>>::Railsがでてうまくいきませんでした・・。
おそらくpumaコマンドを使うとRailsクラスが読み込まれないのだと思います。

ですので、以下の方法で起動・停止します。

# 起動  
$ bin/rails s -e production  

# 停止(pidを見つけてkill)  
$ kill `cat tmp/pids/server.pid`  

nginxの場合

# 設定ファイルに問題がないかチェック  
$ sudo nginx -t  

# 起動  
$ sudo nginx  

# 停止  
$ sudo nginx -s stop  

# 再起動  
$ sudo nginx -s reload  

結論

以下二つのコマンドで完了です。

$ sudo nginx  
$ bin/rails s -e production  

これでhttp://sample.com/にアクセスして表示されれば成功です!!
お疲れ様でした。

次はCapistrano

近日中にCapistranoでのデプロイについての記事を書く予定です。

参考にしたサイト等

puma/puma
Rails5でpuma + nginx連携 - Qiita
Amazon Linux2+Rails5+Nginx+pumaインストール
RackサーバーのPumaについて調べてみる - ゆーじのろぐ
CentOSでRailsアプリをデプロイする手順 - Kei178's blog
nginx コマンド超シンプル早見表 - Qiita

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

BЯunoの技術ブログ。日々学んだことを記録していくよ。

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう