Ruby on Railsの欠点と言えば,デプロイ作業が若干面倒くさいところかもしれません.
コンテンツを公開ディレクトリに設置してパーミッションを設定するだけでは動作しません.
ここではRailsのデプロイ方法について簡単に紹介します.
RackはRuby系のWebサーバやWebアプリケーションフレームワークで主に使われています. Rackは,WebサーバとWebアプリケーションをつなぐインターフェースの役割を果たすライブラリです.
サーバ,アプリ共にRackで共通化してしまえば,どちらかを差し替えても問題なく動作します. つまり,Rackに対応していればどんなサーバでも,どんなフレームワークでも組み合わせることができるというわけです.
RailsもこのRackを使用しているので,Rackに対応したサーバを使わないといけません.
今回はフレームワークの題材としてRailsを使いますが,Rackに対応したものならだいたいどれでも通用する内容になります.
ここでは,以下のような構成でデプロイをします.
- サーバマシン
- Web, App, DBサーバはすべて1台で動作
- Nginx
- リバースプロキシに利用する
- Unicorn
- Rackサーバ
- Ruby on Railsアプリケーション
クックパッドやGithubなどでも採用されているRackサーバです. 特徴としては,
- メモリを比較的食わない
- デプロイ時のダウンタイムが無い
などなど...
詳しくは他のサイトを参考にしてみてください.
- https://github.com/blog/517-unicorn
- http://techracho.bpsinc.jp/piichan1031/2010_07_09/2075
- http://d.hatena.ne.jp/techmedia-think/20120922/1348240737
- アプリケーションを設置(nginxがアクセスできるパーミッションで)
- データベースの作成,nginxの設定など.
- unicornのGemをインストール
- Bundlerを使っている場合はGemfileに追加
- unicornの起動
- リバースプロキシとして動作
- 静的ファイルには直接アクセス(Unicornに問い合わせない)
upstream app-server { server 127.0.0.1:8080; } server { listen 80; server_name hogehoge.falconsrv.net; root /PATH/TO/APP/public; try_files $uri $uri/index.html @unicorn; location @unicorn { proxy_pass http://app-server; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_read_timeout 20; } }
worker_processes 2 listen 8080 pid 'tmp/pids/unicorn.pid' stdout_path 'log/unicorn.log' stderr_path 'log/unicorn.log' timeout 30 preload_app true before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! old_pid = "#{server.config[:pid]}.oldbin" if old_pid != server.pid begin sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU Process.kill(sig, File.read(old_pid).to_i) rescue Errno::ENOENT, Errno::ESRCH end end sleep 1 end after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end
production環境でデーモンとして動作
> cd PATH_TO_APP > unicorn -c config/unicorn.rb -D -E production
config/unicorn.rbを変更した時などに実行
例)ワーカー数を増やしたときなど
> kill -HUP `cat tmp/pids/unicorn.pid`
プログラムコードの変更を適用する
ダウンタイムゼロ
> kill -USR2 `cat tmp/pids/unicorn.pid`
すべてのリクエストを処理し終えてから終了する
> kill -QUIT `cat tmp/pids/unicorn.pid`
リクエストの処理をすべて中断し,直ちに終了する
> kill -INT `cat tmp/pids/unicorn.pid`