実践で学ぶRuby on rails 〜仮説千本ノック〜

プログラマーとして独立するため日々スキルアップに励んでいます。優れたプログラマは仮説を立てるのがうまい。そこを目指して仮説を立てては検証する日々です!!

AWSを使ったデプロイ〜WEBサーバーNginxの導入〜

サーバにはWEBサーバとアプリケーションサーバがあります。

ブラウザからサーバにリクエストがあった場合、

静的コンテンツならWEBサーバがレスポンスとして返して終わり。

動的コンテンツなら、WEBサーバがアプリケーションサーバに生成を依頼する。アプリケーションサーバは、アプリケーションに、その生成を依頼し、処理結果をWEBサーバーに渡し、WEBサーバーはそれをレスポンスとしてブラウザに返している。

 

ここではWEBサーバーの1つNginx(エンジンエックス)について学ぶ。

 

Nginxのインストール

[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nginx

 

 

Nginxの設定

設定ファイルrails.confをvimで編集しましょう。

etcディレクトリ配下のファイルは各種設定関連ファイルであり、強い権限を持つsudoで操作しないと編集できません。

[ec2-user@ip-172-31-25-189 ~]$ sudo vim /etc/nginx/conf.d/rails.conf

 

rails.confを次のように書き換えましょう。

upstream app_server {
  # アプリケーションサーバUnicornと連携させるための設定。
ソケットというインターフェイスを繋げばクライアント・サーバ間、サーバ同士で通信(連携)できる
server unix:/var/www/<アプリケーション名>/tmp/sockets/unicorn.sock; } # {}で囲った部分をブロックと呼ぶ。Nginxサーバの設定ができる server { # このプログラムが接続を受け付けるポート番号 listen 80; # 接続を受け付けるリクエストURL ここに書いていないURLではアクセスできない server_name <Elastic IP>; # クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく client_max_body_size 2g; # 接続が来た際のrootディレクト root /var/www/<アプリケーション名>/public; # assetsファイル(CSSJavaScriptのファイルなど)にアクセスが来た際に適用される設定 location ^~ /assets/ {
# cssなどを圧縮しあgzipファイルがあれば、それを配信する。(負担軽減) 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; }

 

次にlibディレクトリに移動して、nginxの権限を設定する。

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

権限775の中身

あなた、仲間はすべてできる。他人は書き込み以外はできる。

4=読み出し許可

2=書き込み許可

1=実行許可

 

設定ファイルの変更を反映させるため、Nginxを再起動する。

[ec2-user@ip-172-31-25-189 lib]$ cd ~
[ec2-user@ip-172-31-25-189 ~]$ sudo service nginx restart

 

 

Unicorn.rbがNginxと連携できるように設定する

クライアントX、サーバーY間で通信する際、Yはポートを受け口にして通信する。(異なるPC間の通信)
 
Yが内部に持つWEBサーバー、アプリサーバー間で通信する場合、
アプリサーバーはソケットを受け口にして通信する。(同一PC内での通信はポートではなくソケットを受口にした通信が都合がいい)
 
よって、アプリケーションサーバーたるuicornの受口を、ポートからソケットへ変更する。(WEBサーバーを置かない段階ではクライアントXとサーバY(unicorn)の通信であり、異なるPC間の通信であった。
 
なお、通信はブラウザ→Nginx(Webサーバー)→Unicorn(アプリサーバー)→アプリと流れていく。
 
Nginxがブラウザから受け取るのは、PC間の通信のため、先ほどNginxの受け口はポートで設定した。
listen 3000

↓以下のように修正

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

 

ローカルでの変更をサーバーに反映させるため、まずはローカルリポジトリからコミット、プッシュし、EC2からgithubのリモートリポジトリの情報をpullする。

# まず、chat-spaceのディレクトリに移動
[ec2-user@ip-172-31-25-189 ~]$ cd /var/www/chat-space
[ec2-user@ip-172-31-23-189 <レポジトリ名>]$ git pull origin master