Rails

Rails5をNginx経由で接続させるためのNginxの設定。Nginx+Puma+Rails5

Nginx経由でPuma+Rails5へアクセスできるように設定してみた。
Rails5でアプリケーションは問題なく動いている前提で記載

Rails5でのデフォルトのアクセス方法は、http://接続IP:3000というもので、ポート3000にアクセスするようになっているけど、一般的にはポート3000でアクセスしているものなんてみたことない。
調べてみると、Railsの前にWebサーバがあって、Webサーバ経由でRailsへアクセスするのが一般的みたい。

例えば、
今まで、http://1.1.1.1:3000にアクセスするとPumaが受け取って、Railsに渡す!
という動きだったけど、
一般的には
http://1.1.1.1にアクセスすると、Webサーバ(Nginx)が受け取って、Nginxが1.1.1.1:3000に渡して、それをPumaが受け取って、Railsに渡す!
という動きになる。
アクセスした側からみるとhttp://1.1.1.1にアクセスしているけど、内部的にはhttp://1.1.1.1:3000にアクセスしている。という状態になる。
ちなみにこの動作をしているWebサーバ(Nginx)のことをリバースプロキシサーバと呼ぶみたい。

それではWebサーバ(Nginx)の設定をしていこう。
ちなみにPuma+Railsでちゃんと動いていることが前提です。

環境
■OS
# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

■Rails
# rails -v
Rails 5.1.6

■Puma
# gem list | grep puma
puma (3.11.4)

Nginxのインストール

sudo yum install -y nginx

これだけ

バージョン確認

# nginx -v
nginx version: nginx/1.12.2

Nginxを起動

systemctl start nginx

ちなみに停止

systemctl stop nginx

再起動

systemctl restart nginx

状態確認

systemctl status nginx

ブラウザでアクセスしてみる。
Nginxの初期状態のページが表示された。

Nginxの設定

バーチャルサーバの設定

Nginxにアクセスされたときの動作を記載する設定ファイルを作成する。
設定ファイルは、/etc/nginx/conf.dフォルダ配下に作成する。拡張子が.confのものがすべて読み込まれる設定になっている。
アプリ名をファイル名にしておくとわかりやすい

vim /etc/nginx/conf.d/test-app.conf
#サーバーグループ「test-app」を定義
upstream test-app{
  #転送先のURLを記載
  server test-app.com:3000;
}

#仮想サーバの設定
#接続ポート、サーバ名、ドキュメントルート(Railsのアプリフォルダ配下のpublicフォルダ)
server {
  listen 80;
  server_name test-app.com;
  root /home/app/test-app/public;
  
  #「/~」以下のリクエストに対する設定
  location / {
    #指定されたパスが存在すれば、そのファイルを応答
    #存在しない場合には、Railsアプリとして@test-appにリダイレクト
    #@test-appの設定は下のlocation @test-appに記載している。
    try_files $uri @test-app;
  }
  
  #リダイレクト受け付け用の@test-appの設定
  location @test-app {
    #ヘッダー情報を定義
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    #http://アプリ名 を記載
    proxy_pass http://test-app;
  }
  
  #エラーページの設定
  error_page 500 502 503 504 /500.html;
}

Nginx設定ファイルの更新

# vim /etc/nginx/nginx.conf

追加。
この1行がないと、400 Bad Request というエラーが発生した
large_client_header_buffers 4 256k;  

頭に#をつけてコメントアウト(この部分は先ほど作成したtest-app.confを使うため)
   # server {
   #     listen       80 default_server;
   #     listen       [::]:80 default_server;
   #     server_name  _;
   #     root         /usr/share/nginx/html;

   #     # Load configuration files for the default server block.
   #     include /etc/nginx/default.d/*.conf;

   #     location / {
   #     }

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

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

設定は以上

Nginxを再起動して、ポート3000ではなく、
http://アプリのIPアドレスもしくはドメイン でアクセス。

Nginx再起動

systemctl restart nginx

いけたーー!!

参考書籍
[adchord]

-Rails