前々回、前回と「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
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
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]$
~略~
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
[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;
}
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
[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アドレス/"へアクセスします。
ひとまず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 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]$
~略~
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'])
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]$
[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 件のコメント:
コメントを投稿