muninをインストールする

 普段はzabbixを利用しているのですが、設定がわりと面倒だということで、muninはどうかとう話が挙がったので、検証してみることにしました。一応切り分けとしては、zabbixのような統合監視ツールで警告をメールで通知して、muninでリソースの使用状況を確認する、という切り分けです。zabbixでもきちんと設定すれば取得できる情報なのですが、muninは標準で取得できる情報量がかなり有用なので、調査にかかる時間を考えると、とりあえず利用してみる、でも良いと思います(perlだから早いし、DB使わないから設定も楽だし)。

 資料として、こちらといくつかのブログを参考にさせてもらいました。

 

Software Design (ソフトウェア デザイン) 2012年 11月号 [雑誌]

Software Design (ソフトウェア デザイン) 2012年 11月号 [雑誌]

 

環境

CentOS 6.2

 

インストール手順

 必要なライブラリがかなりあるので、epelリポジトリで公開されているものを使用しました。資料では1系だと書いてますが、現在では2系が公開されてます(これを時点だと最新が2.0.10で、リポジトリでは2.0.9が公開されています)。

 

  1. epelリポジトリを登録する
    rpm -Uvh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
  2. インストールする
    yum install munin
  3. アクセス権限の設定をする
    ファイル /var/www/html/munin/.htaccess を作成して、次の内容を記述します。
    AuthUserFile /etc/munin/munin-htpasswd
    次のコマンドを実行します。引数にユーザ名を指定し、そのあとパスワードを設定します。
    htpasswd -c /etc/munin/munin-htpasswd fedora
  4. サービスの起動設定をする
    chkconfig munin-node on
    service munin-node start
  5. 暫く待つ

 

 このあと、ブラウザから次のアドレスにアクセスするとmuninの画面が表示されます。インストール直後にアクセスしても表示されません。muninが情報を取得するまで暫く待つ必要があります(かなり悩みました)。

 今後、nginx起動とか、nginx, mysqlの情報を取得するのを調べる予定です。

nginxをソースコードからインストールする

 以前の記事でもソースコードからインストールする方法を書いたけど、別の方法があったから、改めて書きます。

 ソースコードからインストールする場合、いろんなところにインストールされてて、削除が難しいとか、起動スクリプトを書くのが面倒だったりするのであまり気が進まなかったのですが、nginxはわりと分かりやすい構成だったので楽でした。 

 また、モジュールの組み込むためにリビルドしなくてはいけかったり、バージョンアップの速度がかなり速いため(1.2.6/1.3.11が公開されてる時点で公開されているRPMのバージョンは1.0.15)、nginxを扱うならソースコードからインストールできることは必須ともいえるでしょう。

 

環境

インストール手順

  1. 必要なパッケージのインストール
    yum install pcre-devel
  2. ソースコードの取得・ビルド・インストール
    cd /usr/local/src
    git clone https://github.com/nginx/nginx.git
    cd nginx
    ./configure --user=nobody --group=nobody --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module
    make | make install
  3. 起動スクリプトの作成
    サンプルがwikiに公開されているので、これを /etc/init.d/nginx で保存する。
    http://wiki.nginx.org/InitScripts
    保存したら実行権限を付与し、次の箇所を修正する。
    nginx="/usr/sbin/nginx"
    NGINX_CONF_FILE="/etc/nginx/nginx.conf"
    ビルド時にprefixの指定をしていないのなら、/usr/local/nginx にインストールされているので、次のようになる。
    nginx="/usr/local/nginx/sbin/nginx"
    NGINX_CONF_FILE="/usr/local/nginx/conf/nginx.conf"

 この方法でインストールされるnginxはmasterブランチで、これを書いてる時点だと開発版の1.3.11です。安定版の1.2.xが欲しい場合はブランチを切り替えてインストールすれば良いす。

 

CentOSにnode.jsをインストールする

RoRでアプリケーションを作ろうとしたらnode.jsを要求されたので、インストールしました。ぐぐると、githubのnodejsのwikiにyumでインストールする手段があるよーっていうブログを良く見かけたのですが、2012年12月にFedraだけになってるようなので、ソースからビルドすることにしました。

https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager

パッケージ管理にはcheckinstallを利用しています。checkinstallのインストールについてはこちらのブログを参考にしてください。

http://www.ryuzee.com/contents/blog/5779
 

インストール手順

git clone https://github.com/joyent/node
cd node
./configure
make
checkinstall --fstrans=no
rpm -ivh /root/rpmbuild/RPMS/x86_64/node-20121231-1.x86_64.rpm

Redmine2.2をnginx+unicornで動かす

alminiumを利用すると、apache+passengerで動作するのですが、さらの状態だとレスポンスが少し悪いときがあります。対策としてFastCGIを組み込むなどがあるのですが、今回は別の理由もあって、nginx+unicornを利用することにしました。
設定ファイルはこちらのブログを参考にさせていただきました。
http://d.hatena.ne.jp/kaz_shu/20120520/1337527540
unicornの設定についてはこちらの方がコメント付きなので参考になるかもしれません。
http://www.cocoalife.net/2010/10/post_77.html

 

実行環境

設定手順

unicornのインストール

RAILS_ROOTに移動して、追加のgemを定義します。

cd /opt/alminium

Gemfile.local ファイルを作成して、次の内容を記述します。

gem 'unicorn'

記述後、インストールを行います。

bundle install --without development test postgresql sqlite

 

unicornの設定ファイルの作成

RAILS_ROOT/config/unicorn.rbに次の内容を記述します。これは http://www.cocoalife.net/2010/10/post_77.html を参考にさせていただきました。

# ワーカーの数
worker_processes 2

# ソケット
listen '/tmp/redmine.sock'

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

# ダウンタイムなくす
preload_app true

before_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!

old_pid = "#{ server.config[:pid] }.oldbin"
unless old_pid == server.pid
begin
# SIGTTOU だと worker_processes が多いときおかしい気がする
Process.kill :QUIT, File.read(old_pid).to_i
rescue Errno::ENOENT, Errno::ESRCH
end
end
end

after_fork do |server, worker|
defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end

nginxのインストール

以前のブログで書いたので省略します。リポジトリからインストールしました。
http://wankomagic.hatenablog.com/entry/2012/12/10/024356

 

nginx-unicornの連携の設定

/etc/nginx/conf.d/redmine.conf を作成し、次の記述をします。

upstream redmine {
server unix:/tmp/redmine.sock;
}
server {
  listen 80;
server_name localhost;
server_name $HOSTNAME;
root /opt/alminium/public;
error_log /opt/alminium/log/nginx_error.log;
try_files $uri @unicorn;
location @unicorn {
if (-f $request_filename) { break; }
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_pass http://redmine;
}
}

 起動設定

unicornの起動スクリプトとして、 /etc/init.d/redmine を作成します。

こちらのサイトを参考にさせていただきました。ひとまず動かすのはRedmineだけなので、複数アプリケーション対応部分は削ってます。

http://www.02.246.ne.jp/~torutk/swetools/redmine/setupCentOS6.html#SEC121

# chkconfig: 345 83 17
# description: Redmine on unicorn

set -e

sig () {
test -s "$PID" && kill -$1 `cat "$PID"`
}

RAILS_ROOT=/opt/alminium
RAILS_ENV=production

echo -n "$RAILS_ROOT: "
cd $RAILS_ROOT || exit 1
export PID=$RAILS_ROOT/tmp/pids/unicorn.pid
export OLD_PID="$PID.oldbin"
CMD="bundle exec unicorn_rails -c config/unicorn.rb -E $RAILS_ENV -D"

case $1 in
start)
sig 0 && echo >&2 "Already running" && exit 0
echo "Starting"
$CMD
;;
stop)
sig QUIT && echo "Stopping" && exit 0
echo >&2 "Not running"
;;
force-stop)
sig TERM && echo "Forcing a stop" && exit 0
echo >&2 "Not running"
;;
restart)
sig QUIT && echo "Restarting"
$CMD
;;
*)
echo >&2 "Usage: $0 <start|stop|force-stop|restart>"
exit 1
;;
esac

自動起動設定をして、起動します。

chkconfig --add redmine
chkconfig nginx on

service start redmine
service start nginx

これで今までどおりのアドレスでアクセスできると思います。ホスト名の設定などでうまくいかない場合は、 /etc/nginx/conf.d/redmine.conf ファイルの server_name を追加してみてください。IP、ホスト名どちらでも指定可能です。

nginxをCentOSリポジトリからインストールしてる場合は、/etc/nginx/conf.d/default.confを削除しておくと良いです。

 

alminiumを入れたあと、Redmineを2.2にバージョンアップする

  Redmineを導入するにはalminiumを利用するのがとても容易だけど、お一人で管理されてる?ためかRedmineのバージョンがなかなかあがらず、これを書いてる時点では2.2.0が出たのに、alminiumがサポートするのは2.0.3であるため、バージョンアップ作業をどうするか悩んでしまいます。

  alminiumは公開された当初から利用していましたが、alminiumが新しいRedmineをサポートしてくれたときは再インストールして、そうでない場合はRedmineのソースを取得してalminiumで設定した内容をコピーする、という方法をとってきました。今回は後者について記録します。

 

前提

CentOS 6.2

alminiumインストール済み commit de5431ddeeecb8cfbcff2a9546ae6cf31e8b56ee

Ruby 1.9.3, rails 3.2.6

 

概要
 Redmineの最新版を取得して、alminiumの設定をコピーする。

 

バージョンアップ手順

1. サービスを停止する

service httpd stop

 2. 古いRedmineのバックアップをとって、新しいRedmineを取得する

Redmineのバックアップを取ります。

mv /opt/alminium /opt/alminium.base
mysqldump -ualminium -p alminium > alminium.dump

これを書いている時点ではBacklogsプラグインが2.2に対応していないため、Backlogsプラグインのアンインストールを行います。ひとまずデータベースを削除するだけです。(データベースの差し戻し)を行います。

cd /opt/alminium.base/
bundle exec rake redmine:plugins:migrate NAME=redmine_backlogs VERSION=0 RAILS_ENV=production

新しいRedmineを取得します。

cd /opt/
git clone https://github.com/redmine/redmine
ln -s redmine alminium
chown apache:apache -R redmine
chonw apache:apache -R alminium

以降、次のフォルダで作業します。

cd /opt/alminium

3. alminiumの設定をRedmineにコピーする

# スクリプトなど
cp -rp alminium.base/hooks alminium
cp -rp alminium.base/bin alminium
# 設定ファイル
cp -p alminium.base/config/configuration.yml alminium/config
cp -p alminium.base/config/database.yml alminium/config
cp -p alminium.base/config/scm.yml alminium/config
# テーマ
cp -rp alminium.base/public/themes/gitmike/ alminium/public/themes/
cp -rp alminium.base/public/themes/railsgun/ alminium/public/themes/
# プラグイン
cp -rp alminium.base/plugins/* alminium/plugins
# 一部のプラグインを削除する(rake db:migrateでエラーになる)
rm -rf alminium/plugins/redmine_redcarpet_formatter # db:migrateでエラーになる
rm -rf alminium/plugins/redmine_backlogs # rake db:migrateでエラーになる
rm -rf alminium/plugins/redmine_drafts # チケット作成画面でエラーになる
rm -rf alminium/plugins/redmine_banner # バナー設定画面でエラーになる

4. Redmineのgem管理をする

cd /opt/alminium

alminiumはproductionで動作させるだけなので、Gemfileからtest-unitに関する以下のコードをコメントアウトする。

group :test do
-- 中略 --
# It seems to need test-unit explicitely.
-- 中略 --
end

Redmine 2.2.0はrails 3.2.9を必要とするため、railsのバージョンアップを行う。alminiumはMySQLで動作するので、他のDBは除外する。

bundle install --without development test postgresql sqlite

もしこれを実行したときにエラーが出た場合は次のコマンドを実行するとうまくいく。エラーが出なかったなら実行する必要はない。

bundle update

5. 秘密鍵の生成を行う

rake generate_secret_token

6. データの移行を行う

rake db:migrate RAILS_ENV=production
rake db:migrate_plugins RAILS_ENV=production
cp -p ../alminium.base/files/* files

 7. セッションをクリアする

rake tmp:cache:clear
rake tmp:sessions:clear

8. サービスを起動する

service httpd start

 

 バージョンが2.2になって、Rails3.2.9対応になったためか、一部のプラグインが動かなくなるので、十分な検証が必要のようです。一定条件で、チケット一覧画面を開いたとき、SCMプラグインでエラーが出ました。

 

Nginxインストール

これを見ながらインストールした内容です。今回はインストールのみ。CentOS6.2です。

Software Design (ソフトウェア デザイン) 2012年 12月号 [雑誌]

Software Design (ソフトウェア デザイン) 2012年 12月号 [雑誌]

 

nginxのリポジトリ設定

http://nginx.org/en/download.html に書いてある内容を参考にします。

/etc/yum.repos/nginx を作成し、以下の内容を書き込みます。このとき、OSをcentos、OSRELEASEを6に書き換えます(CentOS6.xの場合)。

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/
gpgcheck=0
enabled=1

nginxのインストールと起動

yum install nginx
chkconfig nginx on
service nginx start

本には動的モジュール組み込みに対応していないためビルドしなおす必要があるから、ソースコードからのインストール方法も書かれていました。一応試してみましたが、yum installでインストールされる /etc/init.d/nginx が有用だし、yum installを一度やっておくのも良いと思います。

 ソースコードをビルドするために必要なパッケージを取得して、ビルド、インストールをします。この記事を書いてる時のstable最新版は1.2.5でした。

yum install gcc make pcre-devel openssl-devel
curl http://nginx.org/download/nginx-1.2.5.tar.gz | tar zx
./configure --prefix=/usr/local/nginx-1.2.5 --user=nobody --group=nobody --with-http_ssl_module --with-http_realip_module --with-http_stub_status_module
make | make install

curlコマンド、今まで積極的に使ったことなかったけど、結構便利なんですね。