maehachi08 Anything Blog

2013年02月28日
Webistranoを使ってみた ~ apache+Passenger化するまで

What's Webistrano?

Webitsranoとは、Capistranoでのデプロイメント管理を行うWebUIツールです。WebistranoはRailsアプリケーションですので、WEBRick、Passenger、Unicorn等のRackアプリケーションサーバで動くと思います。残念なのは、開発が止まっているのか、Gemfileに記載されたRailsバージョンが"2.3.11"と一昔前な状態なことでしょうか。

Environment infrastructure

Webistranoインストールを試した環境はVMWareServer上で動作するCentOS6.3-x86_64です。

# cat /etc/redhat-release
CentOS release 6.3 (Final)

# uname -an
Linux pachi 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

Installing MySQL / bundler / other

入っていれば不要です。
たまたま、検証に使ったVMがほぼ何も入れてないやつだったので入れる。

1. MySQL関連

# yum -y install mysql mysql-server mysql-libs mysql-devel
# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
# sed -i -e 's:/var/lib/mysql/mysql.sock:/tmp/mysql.sock:g' /etc/my.cnf

# service mysqld start
# chkconfig mysqld on

その他、入れておいた方が良いパッケージを入れておく

# yum -y install openssl-devel ruby-devel rubygems
# gem install bundler --version 1.0.10

Make "deploy" user for Webistrano

# groupadd -g 301 deployer
# useradd -g 301 -u 301 deployer
# passwd deployer

Make SSH Key for deploy user

今回はWebistranoサーバとアプリケーションサーバにdeployユーザを作成し、公開鍵認証方式を採用します。

$ su - deployer
$ ssh-keygen -t rsa # passphrase無しで作成
$ scp /home/deployer/.ssh/id_rsa.pub <相手のIP>:/home/deployer/.ssh/id_rsa.pub_<自分のIP>
$ cat /home/deployer/.ssh/id_rsa.pub_<相手のIP> >> /home/deployer/.ssh/authorized_keys
$ chmod 600 /home/deployer/.ssh/authorized_keys
$ rm /home/deployer/.ssh/id_rsa.pub_<相手のIP>

# /etc/hosts.allow,/etc/sysconfig/iptables等は環境に合わせて必要であれば適宜修正

Download Webistrano

Webistrano自体はgithubで公開されているので、git cloneコマンドで取得します。
後半でapache + Passenger化する予定なので、はじめから

$ sudo mkdir -p /var/www/app/
$ cd /var/www/app/
$ sudo git clone git://github.com/peritor/webistrano.git

Simple Start of Webistrano

まず、WEBRickサーバにて単体起動を行うことを目標に作業します。

1. Modify Gemfile

WebistranoのGemfileを編集します。最新のRakeだとrakeコマンドが動作しないので、バージョンを0.8.7に固定します。
capistrano_rsync_with_remote_cacheモジュールを使ってリモートのアプリケーションサーバにデプロイしたいのでbundlerでインストールされるように記述します。

$ cd webistrano/
$ sudo vim Gemfile
#gem "rake"
gem "rake", "0.8.7"
gem "capistrano_rsync_with_remote_cache"

2. Modify lib/webistrano/deployer.rb

WebistranoのWebUIで操作を行うとstage定義後に特定ページでRackエラーが表示されてしまいます。
解決策がgithub上で議論されてました。コメントの内容に沿ってlib/webistrano/deployer.rbを修正したところ、Rackエラーは解消しましたが、deploy::setupタスク実行時にエラーが出ました。
結局、修正コードはここを参考にしました

$ sudo vim lib/webistrano/deployer.rb

修正箇所は以下の箇所です。

# 25行目あたり
# if(@deployment.task && !@deployment.new_record?)
if(!@deployment[:task].nil? && !@deployment.new_record?)

3. Setup Webistrano

git cloneしてきたWebistranoが単体動作するところまでセットアップします。

$ sudo cp config/database.yml.sample config/database.yml
$ sudo cp config/webistrano_config.rb.sample config/webistrano_config.rb
$ sudo bundle install
$ sudo mysql -u root -e 'create database webistrano_production'
$ sudo RAILS_ENV=production bundle exec rake db:migrate

4. Start Webistrano

フォアグラウンドで起動します。

$ sudo ruby script/server -p 3000 -e production

ブラウザでアクセスし、Webistranoのログインページが表示されました。
そして、デフォルトユーザ(admin/admin)でログインできました。


http://<Webistrano Server's IP>:3000

Webistranoにログインすると、左側に"Projects","Hosts","Recipes","Users"という項目があります。
"Users"はWebistranoへのログイン、操作を行うユーザなので、今回は触れません。


## Configuration Project of Webistrano
"Projects"は、Capistranoでいうところの、config/deploy.rbへの設定をWebUIで行う箇所です。
<ol>
<li>"New project"をクリック</li>
<li>[Name]にプロジェクト名を入力(今回は"tools"を入力)</li>
<li>[Project Type]に該当する種別を指定(今回は"Pure File"を選択)</li>
<li>[Description]にプロジェクトの説明文を入力</li>
<li>"Create"をクリック</li>
<li>先ほど"New project"があった箇所に表示される"New stage"をクリック</li>
<li>[Name]に"Production"、"Alert these emails"に適当なアドレスを入力</li>
<li>"Create"をクリック</li>
<li>画面左上の"tools"をクリックし、画面中央の"Project configuration"を適宜修正</li>
</ol>


## Configuration Hosts of Webistrano
<ol>
<li>"New host"をクリック</li>
<li>[Name]にデプロイメント先のIPアドレスを入力して"create host"をクリック</li>
<li>Projects > Project tools > Stage production > Deployed hostsに登録したサーバを設定</li>
</ol>


## Configuration Recipes of Webistrano
deploy_to以下のオーナーを変更する処理をdeploy:setupタスク実行後に行うレシピを登録します。
<ol>
<li>"New recipe"をクリック</li>
<li>[Name]に"Deploy_to-Change-Owner"</li>
<li>[Description]に"deploy:setup実行後にdeploy_to以下のディレクトリのownerを変更"と入力</li>
<li>[Body]に以下コードを入力し、"Create recipe"をクリック</li>
```ruby
namespace :setup do
  task :fix_permissions do
    sudo "chown -R #{user}.#{user} #{deploy_to}"
  end
end
after "deploy:setup", "setup:fix_permissions"

  • Projects > Project tools > Stage production > Recipes managementで作成したレシピのチェックボックスにチェックを入れ、"Update used recipes"をクリックする


  • 細かい設定はCapistranoを使ったことあればある程度分かるかと思います。
    上記の流れでデプロイはできました。

    Start of Webistrano by Passenger

    WebistranoをApache + Passengerで動かしてみたいと思います。

    1. Installing Apache + Passsenger

    $ sudo yum -y install make gcc-c++
    $ sudo yum -y install curl-devel openssl-devel zlib-devel
    $ sudo yum -y install httpd httpd-devel ruby-devel rubygems mod_ssl
    
    ### 既定のhttpd起動ユーザであるapacheユーザでアクセス可能なように所有者を変更
    $ sudo chown -R apache:apache /var/www/app/webistrano/
    

    Gemfileにpassengerを追記しbundle installを実行します。

    $ sudo vim Gemfile
    gem "passenger"
    
    $ sudo bundle install
    

    bundler経由でpassenger-install-apache2-moduleを実行します。
    passenger-install-apache2-moduleコマンドはwebistranoの./vendorディレクトリ以下に配置されますが、環境によりpassengerバージョン等が若干異なることもありますので、find ./ -name "passenger-install-apache2-module"とかで探してください。

    $ sudo bundle exec ./vendor/bundler/ruby/1.8/gems/passenger-3.0.19/bin/passenger-install-apache2-module
    

    2. Configuration of Passenger

    apacheにpassengerモジュールをロードする設定ファイル"/etc/httpd/conf.d/passenger.conf"を作成します。

    #/etc/httpd/conf.d/passenger.conf
       LoadModule passenger_module /var/www/app/webistrano/vendor/bundler/ruby/1.8/gems/passenger-3.0.19/ext/apache2/mod_passenger.so
       PassengerRoot /var/www/app/webistrano/vendor/bundler/ruby/1.8/gems/passenger-3.0.19
       PassengerRuby /usr/bin/ruby
    

    Webistranoのvhost設定ファイル"/etc/httpd/conf.d/webistrano.conf"を作成します。

    # /etc/httpd/conf.d/webistrano.conf
    <virtualhost *:80>
            RackBaseURI /
            RackEnv production
            ServerName   192.168.146.10
            DocumentRoot /var/www/app/webistrano/public/
            CustomLog    /var/log/httpd/webistrano_access_log combined
            ErrorLog     /var/log/httpd/webistrano_error_log
    
            <directory "/public">
                    AllowOverride all
                    Options -MultiViews
            </directory>
    </virtualhost>
    

    3. Configuration of Rack

    RackアプリケーションをPassenger経由で起動させる場合に必須となる設定ファイル"config.ru"を作成します。

    # config.ru for Webistrano
    require File.dirname(__FILE__) + '/config/environment'
    run ActionController::Dispatcher.new
    

    4. Start apache

    apacheを起動します。

    $ sudo service httpd start
    
    $ sudo ps auxf
    root     32088  0.0  1.1 206664  5980 ?        Ss   17:30   0:00 /usr/sbin/httpd
    root     32090  0.0  0.3 213936  1852 ?        Ssl  17:30   0:00  \_ PassengerWatchdog
    root     32093  0.1  0.4 421652  2404 ?        Sl   17:30   0:00  |   \_ PassengerHelperAgent
    root     32095  0.4  1.8  52752  9340 ?        Sl   17:30   0:01  |   |   \_ Passenger spawn server
    apache   32116  2.1 15.1 174316 75896 ?        S    17:30   0:04  |   |       \_ Passenger ApplicationSpawner
    nobody   32098  0.0  0.7 148084  3712 ?        Sl   17:30   0:00  |   \_ PassengerLoggingAgent
    apache   32105  0.0  0.8 206792  4472 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32106  0.0  0.8 206792  4468 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32107  0.0  0.8 206796  4048 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32108  0.0  0.8 206796  4044 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32109  0.0  0.8 206796  4044 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32110  0.0  0.8 206796  4048 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32111  0.0  0.8 206796  4048 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32112  0.0  0.8 206792  4456 ?        S    17:30   0:00  \_ /usr/sbin/httpd
    apache   32123  0.0 14.7 176396 74320 ?        S    17:30   0:00 Rack: /var/www/app/webistrano
    
    

    これでPassenger経由でWebistranoが起動しました。