EC2にRailsアプリをデプロイ⑥ ~Webサーバーの設定~


はじめに

この記事は前回の続きです。

クライアントからのリクエストをまずはEC2内のWebサーバーに送られ、Webサーバーで処理ができるものはそのままブラウザにレスポンスを返します。

もしWebサーバーでは処理できないものであれば、アプリケーションサーバーへふって処理します。
そのWebサーバーを今回導入してデプロイ完了とします。

Nginxを導入

今回はNginxというWebサーバーの一種を導入します。
ターミナルで下記のコマンドを実行してインストールします。

ターミナル
[ec2-user@ip-172-31-25-189 ~]$ sudo amazon-linux-extras install nginx1

Is this ok [y/d/N]:と表示されたらyを押してエンター押してください。

Nginxの設定を編集

Nginxの設定ファイルはターミナルからコマンドを実行してファイルを開きます。

ターミナルでファイルを開けたら下記のように編集します。
しかし、3行目、17行目の「リポジトリ名」と書かれた部分と
11行目の「Elastic IP」と書かれた部分は自分のものに置き換えます。

/etc/nginx/conf.d/rails.conf
upstream app_server {
  # Unicornと連携させるための設定
  server unix:/var/www/リポジトリ名/tmp/sockets/unicorn.sock;
}

# {}で囲った部分をブロックと呼ぶ。サーバの設定ができる
server {
  # このプログラムが接続を受け付けるポート番号
  listen 80;
  # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない
  server_name Elastic IP;

  # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく
  client_max_body_size 2g;

# 接続が来た際のrootディレクトリ
  root /var/www/リポジトリ名/public;

# assetsファイル(CSSやJavaScriptのファイルなど)にアクセスが来た際に適用される設定
  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

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

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}

入力を終えたら「escキー」→「:wq」の順で実行し、保存します。

Nginxの権限を変更する

POSTメソッドでもエラーが出ないように下記のコマンドでNginxの権限を変更します。

ターミナル
[ec2-user@ip-172-31-25-189 ~]$ cd /var/lib
[ec2-user@ip-172-31-25-189 lib]$ sudo chmod -R 775 nginx  

これでNginxの設定は完了です。

Nginxの設定ファイルを再度読み込みさせます。↓

[ec2-user@ip-172-31-25-189 lib]$ cd ~
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl reload nginx
[ec2-user@ip-172-31-25-189 ~]$ sudo systemctl start nginx

Unicornの設定を変更する

Unicornの設定を変更します。
config/unicorn.rbのファイルのこの記述があると思います。

config/unicorn.rb
(省略)

listen 3000

(省略)

この記述を下記のように修正します。

config/unicorn.rb
(省略)

listen "#{app_path}/tmp/sockets/unicorn.sock"

できたらコミット、プッシュ

さらに本番環境にも反映させます。↓

ターミナル
# 開発中のアプリケーションに移動
[ec2-user@ip-172-31-25-189 ~]$ cd /var/www/開発中のアプリケーション

# GitHubの内容をEC2に反映させる
[ec2-user@ip-172-31-23-189 <レポジトリ名>]$ git pull origin master

Unicornを再起動させます。
⑤の記事でkillコマンドを使って行った作業と同じです。

まずプロセスを確認↓

ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ ps aux | grep unicorn

ec2-user 17877  0.4 18.1 588472 182840 ?       Sl   01:55   0:02 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 17881  0.0 17.3 589088 175164 ?       Sl   01:55   0:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
ec2-user 17911  0.0  0.2 110532  2180 pts/0    S+   02:05   0:00 grep --color=auto unicorn

そしてkill

ターミナル
# 上記の例だと「17877」
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ kill プロセス番号

そしてUnicornを起動↓

ターミナル
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

これで全てが完了です。
ブラウザからElastic IPでアクセスしてデプロイされているはずです。

最後に

区切って記事にしたので六つの記事になりました。
ただ、初めてAWSを使ってこの工程は一応残しておきたかったので記事にできてよかったです。

また、自分の作成したアプリがインターネットで公開されるのは少し感動しました。