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]