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]