2015年11月11日水曜日

AWS無料利用枠のインスタンスで、Ruby on Railsの環境を作成してみる③

こんにちは、井下です。

前々回前回と「AWS無料利用枠のインスタンスで、Ruby on Railsの環境を作成してみる」ことをテーマとしていましたが、今回は「デフォルトで入っているサーバの差し替え」について書いていきます。

ちなみにWebサーバは"Nginx"、アプリケーションサーバは"Unicorn"を導入する手順としています。

1.デフォルトのサーバ設定

サーバの差し替えを行う前の前提知識として、Railsでは"Webrick"というWebサーバが設定を行うことなく起動させることができ、RailsのWebアプリケーションの動作を確認することができます。

"Webrick"の起動はWebアプリケーションのルートディレクトリで"rails server"もしくは"rails s"コマンドで行えます。
※外部からブラウザでアクセスするには、さらにオプションとして"-b 0.0.0.0"を追加します。このオプションがないと、起動したマシンのlocalhostのURLでしかアクセスできません

試しに前回DBをSQLiteからPostgreSQLに差し替えたRailsのWebアプリケーション、"sample"で"Webrick"を起動してみます。
[ec2-user@ip-xxx ~]$ sudo service postgresql start

Redirecting to /bin/systemctl start  postgresql.service
[ec2-user@ip-xxx ~]$ cd sample/
[ec2-user@ip-xxx sample]$ rails s -b 0.0.0.0
=> Booting WEBrick
=> Rails 4.2.4 application starting in development on http://0.0.0.0:3000
=> Run `rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-11-08 19:48:46] INFO  WEBrick 1.3.1
[2015-11-08 19:48:46] INFO  ruby 2.2.3 (2015-08-18) [x86_64-linux]
[2015-11-08 19:48:46] INFO  WEBrick::HTTPServer#start: pid=1954 port=3000

これでブラウザからアクセス、する前に、EC2インスタンスのセキュリティグループを編集し、ポート3000へのアクセスを許可します。

ブラウザからのアクセス準備が整ったので、"http://EC2インスタンスのIPアドレス:3000/"へアクセスします。

Railsではおなじみの画面が開きます。
この画面はブラウザからのリクエストを処理するWebサーバと、Rails自体を動作させるアプリケーションサーバが連携して開くことができます。
"Webrick"はWebサーバに分類されますが、Railsではアプリケーションサーバの役割も与えられています。

"Webrick"は特に設定を行うことなく、手早くWebアプリケーションの動作させられるメリットがありますが、レスポンスや起動の所要時間はあまり早くないため、本番用としてはWebサーバ・アプリケーションサーバを別途用意するのが一般的です。

それでは、ここからWebサーバ"Nginx"、アプリケーションサーバ"Unicorn"を導入していきます。


2.Webサーバの差し替え

まず、yumを利用してNginxをインストールします。
…が、デフォルトのリポジトリにはNginxは含まれていないので、Nginxのリポジトリを追加します。
[ec2-user@ip-xxx sample]$ sudo vi /etc/yum.repos.d/nginx.repo

/etc/yum.repos.d/nginx.repoファイル
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/rhel/7/$basearch/
gpgcheck=0
enabled=1

Nginxのリポジトリを追加したら、yumを利用してNginxをインストールします。
[ec2-user@ip-xxx sample]$ sudo yum install nginx
~略~
Thanks for using nginx!

Please find the official documentation for nginx here:
* http://nginx.org/en/docs/

Commercial subscriptions for nginx are available on:
* http://nginx.com/products/

----------------------------------------------------------------------
  Verifying  : 1:nginx-1.8.0-1.el7.ngx.x86_64                                                            1/1

Installed:
  nginx.x86_64 1:1.8.0-1.el7.ngx

Complete!

[ec2-user@ip-xxx sample]$

次にNginxの設定を行います。
[ec2-user@ip-xxx sample]$ sudo cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/local.conf
[ec2-user@ip-xxx sample]$ sudo mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bk
[ec2-user@ip-xxx sample]$ sudo vi /etc/nginx/conf.d/local.conf

/etc/nginx/conf.d/local.confファイル(緑字の部分を追加・変更)
upstream unicorn {
    server unix:/tmp/unicorn.sock;
}

server {
    listen       80;
    server_name  マシンのIPアドレス;

    root /home/ec2-user/sample/public;

    try_files $uri @unicorn_sample;

    location @unicorn_sample {
        proxy_set_header Host $http_host;
        proxy_pass http://unicorn;
    }

    error_page 500 502 503 504 /500.html;
}

Nginxの設定が終わったら、Nginxを起動してみます。
なお、Nginxは起動成功時に特にメッセージを出さないため、プロセスが動作しているかで起動成功を確認します。
[ec2-user@ip-xxx sample]$ sudo ngin
[ec2-user@ip-xxx sample]$ ps -aux | grep nginx
root      4419  0.0  0.1  47512  1152 ?        Ss   20:41   0:00 nginx: master process nginx
nginx     4420  0.0  0.1  47888  1904 ?        S    20:41   0:00 nginx: worker process
ec2-user  4424  0.0  0.0 112640   960 pts/1    R+   20:41   0:00 grep --color=auto nginx

これでWebサーバとしてNginxが起動している状態となったので、ブラウザからアクセスしてみます。なお、Nginxはポート80でアクセスできるようにデフォルト設定されているので、Webrickの際と同様に、セキュリティグループを編集し、ポート80へのアクセスを許可しておきます。

では、"http://EC2インスタンスのIPアドレス/"へアクセスします。

local.confファイルで、アプリケーションサーバと連携するように設定していますが、アプリケーションサーバをまだ導入していないため、502エラーページが開きます。
ひとまずNginxの導入はこれで完了したので、次はアプリケーションサーバを導入し、Nginxと連携させます。

3.アプリケーションサーバの差し替え

Unicornはgemでインストールできるようになっているので、GemfileからUnicornをインストールするように記述します。
[ec2-user@ip-xxx sample]$ vi Gemfile

~/sample/Gemfileファイル(緑字の部分を追加・変更)
source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.4'
# Use sqlite3 as the database for Active Record
#gem 'sqlite3'

gem 'pg'

~略~
# Use Unicorn as the app server
gem 'unicorn'
~略~

bundle installでインストールを実行します。
[ec2-user@ip-xxx sample]$ bundle install
~略~

Installing unicorn 5.0.0 with native extensions
Using web-console 2.2.1
Bundle complete! 13 Gemfile dependencies, 56 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.

[ec2-user@ip-xxx sample]$

Unicornのインストールをし終えたら、Unicorn実行用設定ファイルを作成します。(Nginxと異なり、ベースとなるファイルはインストールされないので、新規に作成します)
[ec2-user@ip-xxx sample]$ vi config/unicorn.rb

~/sample/config/unicorn.rbファイル(新規作成)
# -*- coding: utf-8 -*-
worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true  # 更新時ダウンタイム無し

listen "/tmp/unicorn.sock"
pid "/tmp/unicorn.pid"

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

# ログの出力
stderr_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])
stdout_path File.expand_path('log/unicorn.log', ENV['RAILS_ROOT'])

設定ファイルを作成し終えたら、下記のコマンドでUnicornを起動します。
また、UnicornもNginxと同じく、実行成功時にメッセージを出力しないため、プロセスが立ち上がっているかを確認しています。
[ec2-user@ip-xxx sample]$ bundle exec unicorn_rails -c config/unicorn.rb -E development -D
[ec2-user@ip-xxx sample]$ ps aux | grep unicorn
ec2-user  2100  0.7  7.4 357136 75940 ?        Sl   19:19   0:01 unicorn_rails master -c config/unicorn.rb -E development -D
ec2-user  2104  0.0  7.0 357136 72092 ?        Sl   19:19   0:00 unicorn_rails worker[0] -c config/unicor .rb -E development -D
ec2-user  2106  0.0  7.0 357136 72104 ?        Sl   19:19   0:00 unicorn_rails worker[1] -c config/unicor .rb -E development -D
ec2-user  2109  0.0  7.0 357136 72124 ?        Sl   19:19   0:00 unicorn_rails worker[2] -c config/unicor .rb -E development -D
ec2-user  2120  0.0  0.0 112640   960 pts/0    R+   19:22   0:00 grep --color=auto unicorn
[ec2-user@ip-xxx sample]$

これでアプリケーションサーバのUnicorn導入も完了したので、再び"http://EC2インスタンスのIPアドレス/"へアクセスします。
冒頭でWebrickによって起動していた画面と同じ画面が開きました。
これでWebサーバ・アプリケーションサーバの差し替えは完了です。

後は環境・用途に応じてそれぞれの設定をカスタマイズしたり、起動・停止用スクリプトを作成してみたりすることで、より有効にサーバを活用できると思います。

前々回⇒AWS無料利用枠のインスタンスで、Ruby on Railsの環境を作成してみる①
前回⇒AWS無料利用枠のインスタンスで、Ruby on Railsの環境を作成してみる②

参考にしたサイト

UnicornとNginxの連携例。起動・停止用スクリプトの記述もあり
http://qiita.com/Salinger/items/5350b23f8b4e0dcdbe23#unicorn-%E3%81%AE%E8%A8%AD%E5%AE%9A

UnicornとNginxの連携例。Nginxで複数のWebアプリケーションを管理する方法の記述あり
http://blog.takkinoue.com/entry/2014/12/17/225522

0 件のコメント:

コメントを投稿