EC2内のサーバーの役割
ユーザーが送るリクエストに対して、何らかのレスポンスを返す、これがサーバーの役割です。
サーバには複数の種類があり、ここではクローンしたアプリケーションを起動するために必要な「Webサーバー」と「アプリケーションサーバー」について理解を深めます。
「Webサーバー」
とは、静的コンテンツのみをリクエストとしてクライアントに返します。ここでいう「クライアント」とは、サイトを閲覧するブラウザのことを示します。
「静的コンテンツ」
とは、リクエストのたびに内容が変更されないファイルのことです。例として、表示するものが定まっているCSSや、画像ファイルなどがあります。
「アプリケーションサーバー」
は、動的コンテンツを生成し、処理結果をWebサーバーに返すという役割を果たします。具体的には、アプリケーションサーバーが、アプリケーションサーバ内に設置されているアプリケーション本体にリクエスト処理の指令を出します。アプリケーション本体が処理を完了すると、アプリケーションサーバーはその処理結果をレスポンスとしてWebサーバーに返します。
「動的コンテンツ」
とは、リクエストのたびに内容が変更されるファイルのことです。送られてくるリクエスト毎にデータベースから検索条件に該当するデータ取得し、表示する役割を果たしています。
アプリケーションサーバーとアプリケーション本体は、使用している言葉が違うので、連携することができません。この問題を解決してくれるのが「Rack」というプログラムです。
Rack
「Rack」とは、いわば翻訳プログラムになります。Rackが翻訳をすることにより、アプリケーションサーバーとアプリケーション本体がコミュニケーションを取ることができ、処理結果をWebサーバーに返すことができます。
一連の流れ↓
アプリケーションサーバーに動的コンテンツの生成を依頼し、生成されたコンテンツがレスポンスとして返ってくるので、Webサーバはその結果をクライアントに返します。```
# Nginx(エンジン・エックス)
「Nginx」とは、Webサーバーの一種です。ユーザーのリクエストに対して静的コンテンツのみ取り出し処理を行い、動的コンテンツの生成はアプリケーションサーバに依頼します。
### Nginxを導入
[ec2-user@ip-172-31-25-189 ~]$ sudo amazon-linux-extras install nginx1
***Is this ok [y/d/N]:と出てきたら、yを選択して決定してください。***
無事に完了すれば、Nginxがインストールできています。
次に、Nginxが正しく動くように設定しましょう。
Nginxの設定は「設定項目X 設定値x;」という形式で入力します。
[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf
うまくターミナル上でファイルを開けたら次のように編集してください。
```/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;
}
「アプリケーション名」と「Elastic IP」の部分は適宜ご自身のものに置き換えましょう。
アプリケーション名 3 , 17行目
Elastic IP 11行目
入力を終えたら「escキー」→「:wq」の順で実行し、保存しましょう。
次は、Nginxの権限を変更しましょう 。
設定が完了したら、POSTメソッドでもエラーが出ないようにするために、下記のコマンドも実行してください。
[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の設定を変更
Nginxを介した処理に変更したため、Unicornの設定も修正します。
(省略)
listen 3000
(省略)
これを以下に修正
(省略)
listen "#{app_path}/tmp/sockets/unicorn.sock"
編集したら、リモートリポジトリへ「commit→push」しましょう。
次は、GitHubの変更点を本番環境へ反映させましょう。
[ec2-user@ip-172-31-25-189 ~]$ cd /var/www/開発中のアプリケーション
# GitHubの内容をEC2に反映させる
[ec2-user@ip-172-31-23-189 <レポジトリ名>]$ git pull origin master
次は、Unicornを再起動しましょう。
再起動の手順は、
[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します。
上記の例だと「7877」
[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でアクセスしましょう。
IPアドレスにアクセスしてもエラーが出る時
「502 but gateway」と出た時の対処方法
こちらのエラーはnginxのlogの確認が必要になります。
以下のコマンドを実行し、ログを確認しましょう。
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ sudo less /var/log/nginx/error.log
この中からエラーログを探しましょう。
次回はデプロイ作業を自動化です。