サーバ

デプロイツールminaを使ってみた

いま複数あるPadrinoのアプリケーションのデプロイでmina を使ってみようと試した際のメモ。
仕事ではCapistrano(+ Webistrano)を利用していますが、RubyのプロジェクトなのとソースコードもGit管理されているので試してみました。

準備

  • プロジェクトのGemfileに gem 'mina' を追加した後、bundle install する
  • プロジェクトルートで以下のコマンド実行してデプロイ用の設定ファイルを生成します
  • 中身にかなりコメント等も含めたテンプレートが出力されるので非常にわかりやすいです
$ bundle exec mina init
-----> Created ./config/deploy.rb
Edit this file, then run `mina setup` after.

接続先側(リモート側)

  • あとデプロイ先のホスト(リモート側)に公開鍵認証のSSH接続をできる様にしておく必要があります
  • また、更にデプロイ対象のソースコード取得にGithubを利用するのであれば、その接続先ホストからcloneできる様にする必要があります。
  • リモート先の公開鍵をgithubに登録しておく。 ssh-keygen -t rsa で作成して https://github.com/settings/ssh で登録
  • 登録したら、リモート側のホストでssh -T git@github.com で接続チェックしてホスト登録。*1

実行

ここまでできれば、あとはminaからsetupコマンドを実行して、リモート側のディレクトリ構成等を準備します。

$ bundle exec mina setup
-----> Setting up /home/hideack/sample
total 16
drwxrwxr-x 4 hideack hideack 4096 Nov  2 05:03 .
drwxr-xr-x 5 hideack hideack 4096 Nov  2 05:02 ..
drwxrwxr-x 2 hideack hideack 4096 Nov  2 05:03 releases
drwxrwxr-x 2 hideack hideack 4096 Nov  2 05:03 shared
-----> Done.
-----> Be sure to edit 'shared/config/database.yml'.
Elapsed time: 0.00 seconds

引き続きデプロイしてみます。上に書いたタスクだと、

  • githubからclone
  • bundle install の実行

が順に行われます。

$ bundle exec mina deploy
-----> Creating a temporary build path
-----> Fetching new git commits
-----> Using git branch 'master'
Cloning into '.'...
done.
-----> Using this git commit
-----> Symlinking shared paths
-----> Installing gem dependencies using Bundler
Fetching gem metadata from http://rubygems.org/.......
Fetching gem metadata from http://rubygems.org/..
Using rake (10.0.4)
(略)
-----> Build finished
-----> Moving build to releases/1
-----> Updating the current symlink
-----> Launching
-----> Done. Deployed v1
Elapsed time: 32.00 seconds

意外とあっさりとデプロイできてしまった。デフォルトでCapistranoで差分をデプロイする様になっている様で2回目以降のデプロイは相当スムーズです。(リポジトリの丸ごと clone は最初だけ、次回以降は差分のみ)

ほとんど引っかかることがなかったけど、使い始めたらいろいろ引っかかるかもしれないので、都度整理。

但し、ここまでではunicornが起動していない状態なので、タスクを更に追加していきます。(また今度)

参考

*1:これをしておかないと、デプロイタスクを繋いだ際にgit cloneできないエラーが出るので...。

Ubuntu 11.10にMongov v2.0.6をインストール

諸般事情があって、mongoを新たにインストールすることに。
ほぼ、ここを参照した作業ですが、自分用のメモエントリとしてまとめておきます。
aptコマンドで最新版をインストールするために行った作業の手順。

sources.list編集

/etc/apt/sources.list を編集して、以下の一行を追加する。

deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

既にインストールされているmongo dbがあったら一旦削除

$ dpkg -l | grep mongo
ii mongodb-clients 1:1.8.2-1ubuntu1 An object/document-oriented database (client apps)
ii mongodb-server 1:1.8.2-1ubuntu1 An object/document-oriented database (server package)

$ sudo apt-get remove mongodb-server
$ sudo apt-get remove mongodb-clients

gpg鍵の設定をしてインストール

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
$ sudo apt-get update
$ sudo apt-get install mongodb-10gen
(中略)
Unpacking mongodb-10gen (from .../mongodb-10gen_2.0.6_i386.deb) ...
Processing triggers for man-db ...
Processing triggers for ureadahead ...
Setting up mongodb-10gen (2.0.6) ...
Installing new version of config file /etc/init/mongodb.conf ...
Installing new version of config file /etc/mongodb.conf ...
mongodb start/running, process 4748

インストール完了。

$ mongod --version
db version v2.0.6, pdfile version 4.5
Mon Jul 16 16:50:50 git version: e1c0cbc25863f6356aa4e31375add7bb49fb05bc

上記の手順でインストールが完了してデーモンが常駐した状態になっている。
ちなみに開始・終了は、

$ sudo /etc/init.d/mongodb [start / stop]

メモ

それぞれのファイルの保管場所は

  • 設定ファイル
    • /etc/mongodb.conf
  • DBファイルの保管先
    • /var/lib/mongodb
  • ログの保管先
    • /var/log/mongodb/mongodb.log

SinatraアプリをApache2のmod_proxy_balancerを通してThinで動かす(2) -mod_proxy_balancerの設定

続けて、Apache2の設定。ここでは、既にmod_proxyが入っているものとします。
フロントのApache2から複数起動しているThinのサーバに振るためにmod_proxy_balancerを入れます。
Ubuntuであれば、

$ sudo a2enmod proxy_balancer

で、mod_proxy_balancerが有効になるので、続けてconfファイルを編集。

$ sudo vi /etc/apache2/mods-available/proxy.conf

中身は以下の様な形。


ProxyRequests Off

ProxyPass /foo balancer://foo
ProxyPassReverse /api balancer://foo


BalancerMember http://127.0.0.1:4040 loadfactor=10
BalancerMember http://127.0.0.1:4041 loadfactor=10
BalancerMember http://127.0.0.1:4042 loadfactor=10
BalancerMember http://127.0.0.1:4043 loadfactor=10
BalancerMember http://127.0.0.1:4044 loadfactor=10

これで、自身のホスト内の4040番〜4044番ポートで動いているThinサーバにフォワードされる様になります。
設定を有効にするためにApacheを再起動します。

$ sudo /etc/init.d/apache2 restart

これで、apacheサーバの ~/foo にアクセスされたものがThinサーバにフォワードされます。
開発用にwebrickで動かしていたものと比べて体感的にも大分変わりました。

SinatraアプリをApache2のmod_proxy_balancerを通してThinで動かす(1) – Thinの設定

今、WebアプリケーションのAPIサーバをRubyフレームワークSinatraでつくっていて、これを本格的に動かすときにWebサーバをどうしよう。ということになって、Thinが良いらしいという情報を得たので導入してみた。
現状、動いているApacheサーバがあるので、reverse proxyを通して特定のエントリポイントに対してアクセスがあったもののみをフォワードし、Thinを通してSinatraアプリにつなぐことを目標にします。

f:id:hideack:20111103165746p:image

インストールは非常に簡単。

% gem install thin

これで準備OK。簡単ですね。
次にアプリケーションを呼び出すためのファイルを作ります。
ここでは、ファイル名をconfig.ruとします。内容的には以下の様な形。
ここでrequireされているapp.rbはSinatraアプリ本体です。

# config.ru
require 'rubygems'
require 'sinatra'
require './app.rb'
run Sinatra::Application

単純に呼び出してるだけですね。
続けて、Thin本体の設定ファイルを作ります。
まずは中身。

# thin.yaml
timeout: 30
log: log/thin.log
environment: production
servers: 5
daemonize: true
rackup: config.ru
port: 4040

おおよそ設定見てもらったままなのですが、上記の設定でThinサーバのデーモンプロセスが5本起動されます。
利用されるポート番号は4040〜4044までとなります。
続けて、ログファイルの保管先とプロセス管理用のファイル保管されるディレクトリを予め作っておきます。

$ mkdir log
$ mkdir tmp

これでThin本体の準備完了。実際に動かしてみます。

$ thin start -C thin.yaml
Starting server on 0.0.0.0:4040 ...
Starting server on 0.0.0.0:4041 ...
Starting server on 0.0.0.0:4042 ...
Starting server on 0.0.0.0:4043 ...
Starting server on 0.0.0.0:4044 ...

起動完了。試しに動作を確認したければ、wget等で起動したいずれかのポートに対してwgetを叩けば挙動を確認できますね。
止める場合は、$ thin stop -C thin.yaml でOKです。(restartも)
tmpディレクトリには、起動中のプロセスのpidファイルが、logディレクトリにはそれぞれのThinサーバへのアクセスログが記録されます。

$ ls -l tmp/pids/
total 40

  • rw-r--r-- 1 hideack staff 5 11 3 16:30 thin.4040.pid
  • rw-r--r-- 1 hideack staff 5 11 3 16:30 thin.4041.pid
  • rw-r--r-- 1 hideack staff 5 11 3 16:30 thin.4042.pid
  • rw-r--r-- 1 hideack staff 5 11 3 16:30 thin.4043.pid
  • rw-r--r-- 1 hideack staff 5 11 3 16:30 thin.4044.pid

$ ls -l log/
total 40

  • rw-r--r-- 1 hideack staff 585 11 3 16:30 thin.4040.log
  • rw-r--r-- 1 hideack staff 360 11 3 16:30 thin.4041.log
  • rw-r--r-- 1 hideack staff 360 11 3 16:30 thin.4042.log
  • rw-r--r-- 1 hideack staff 360 11 3 16:30 thin.4043.log
  • rw-r--r-- 1 hideack staff 360 11 3 16:30 thin.4044.log