Hatena::ブログ(Diary)

ARCHIVESDRIVE HD

2012-05-29

Asset Pipeline とはいったい…

| 16:28

「うごごごご(CVエクスデス)」

英語は人よりできないので日本語の資料読んでから本家のドキュメントよんだ。

  • まずここ(日本語)

[Rails]Asset Pipelineとはなんなのか調べてみた | Fujitaiju Blog -There is no border in the Internet!-

  • つぎにここ(日本語)

ASCIIcasts - “Episode 279 - Asset Pipelineを理解する”

  • そしてここ(英語)

Ruby on Rails Guides: Asset Pipeline

とりあえず、Asset Pipeline の守備範囲はいまんとこ、ローカルの開発中のプロジェクトで開発したら以下の様な感じでした。

/app/assets/images
/app/assets/javascripts
/app/assets/stylesheets
/vendor/assets/stylesheets
/vendor/bundle/ruby/1.9.1/gems/jquery-rails-X.X.X/vendor/assets/javascripts
/vendor/bundle/ruby/1.9.1/gems/coffee-rails-X.X.X/lib/assets/javascripts

どこが対象になっているか確認したい場合は、対象の rails プロジェクトの root ディレクトリから、bundle exec rails console して、Rails.application.config.assets.paths を発射すれば確認できると思うよ!

2012-05-18

ndb_restore を使う

| 18:35

MySQL Clusterバックアップには ndb_mgm -e "START BACKUP" を用いるとオンラインバックアップしてくれて素敵というか、それ以外だと mysqldump しかないんですが、こいつは確かテーブルのロックとかしまくって危なかった気がする。

と言うことで、取得したバックアップを ndb_restore する時の手順と注意。むっちゃハマった。

というか、試しに mysqldump してリストアしなおしてみたんだけど、700Mbyte ちょっとのリストアに10分以上かかって禿げ上がりそうだったので……。

続きを読む

2012-05-09

Pound のリダイレクトの扱い

| 08:36

Pound ちゃんのリダイレクトのお話。パラメータ引き継げるのと引き継げないのがある。

Service
  HeadRequire "Host: www.example.com"
  Redirect "http://redirect.example.com"
END

例)
http://www.example.com/example -> http://redirect.example.com/example
Service
  HeadRequire "Host: www.example.com"
  Redirect "http://redirect.example.com/"
END

例)
http://www.example.com/example -> http://redirect.example.com/

man pound で redirect のところに書いてあるの見つけなかったらやばかった。

2012-05-03

NAS 領域の CIFS をアンマウントした時の動作

| 22:55

NAS 側から強制的に切り離す(共有解除)すると、

  • 所有者情報やら size が全部 ? になって ls しても「そのようなデバイスやアドレスはありません」になる(即座にエラーが返される)。
  • マウントしっぱだからタイムアウトまで待つとかじゃなくてアクセス即時エラー返してくれる、意外と親切。

なんらかの理由でハングアップして、CIFS VFS のエラーとしてカーネルに通知されると

  • echo 0 > /proc/sys/kernel/hung_task_timeout_secs” disables this message.
  • /proc/sys/kernel/hung_task_timeout_secs に記述された数値秒だけ待ってくれる、超過するとタイムアウトデフォルト 120 秒)。
  • マウントポイントを(再帰的に)含む位置から ls とか発行すると、hung_task_timeout_secs 秒数分待たされ地獄。
  • dmesg にエラーが出る。

普通に umount コマンドを発行すると、

  • マウント先が動作しているかどうかにかかわらずマウント解除されて、ただのマウントポイント跡地になる。

というわけで、ファイル名変換を考えなくてよかったので CIFS 使ってましたが、サーバNASエンコード合わせてなるべく NFS 使うようにします。

追記

そもそも CIFS VFSカーネルに通知されるレベルでぶっ壊れるのがおかしいので、普通に CIFS 使えばいいだろってレベルだった。

マウントポイント以下にマルチバイト文字が

  • 含まれる可能性があるなら CIFS
  • 含まれる可能性がないなら NFS

と使いわけよう。

Freshclam の rc スクリプト

| 18:15

ClamAV 0.97.4/14872 で確認。

./configure --prefix=/usr/local でインストールして、pid ファイル設置先を /var/run/clamav/ として設定した場合、RHEL 系なら以下のスクリプトで動くはずです。configtest は、freshclam にないっぽいから諦めた。

#!/bin/sh
#
# Freshclam.
#
# chkconfig:   - 85 15 
# description:  Freshclam is update virus databases for clamav;
# processname: freshclam
# config:      /usr/local/etc/freshclam.conf
# pidfile:     /var/run/clamav/freshclam.pid
 
# Source function library.
. /etc/rc.d/init.d/functions

freshclam="/usr/local/bin/freshclam"
prog=$(basename $freshclam)

FRESHCLAM_CONF_FILE="/usr/local/etc/freshclam.conf"

lockfile=/var/lock/subsys/freshclam

start() {
    [ -x $freshclam ] || exit 5
    [ -f $FRESHCLAM_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $freshclam -d --config-file=$FRESHCLAM_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}
 
stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}
 
restart() {
    stop
    sleep 1
    start
}

rh_status() {
    status $prog
}
rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    status)
        rh_status
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|}"
        exit 2
esac

2012-05-01

Pound で IP sticky な環境作っててハマった

| 14:45

仕方ないと言えば仕方ないんだけどこの仕様なんとかできねーかな、ってレベル。アプリケーションでやれよクズ!って言われたらそれまでなんだけど。

(前略)
Alive   30
(中略)
Service
    HeadRequire "Host: www.example.com"
    BackEnd
        Address 192.168.1.11
        Port    80
        TimeOut 60
    End
    BackEnd
        Address 192.168.1.12
        Port    80
        TimeOut 60
    End
    Session
        Type IP
        TTL 600
    End
End
(後略)

こんな感じで、Session に Type IP を書いておくと、IP による静的振り分けを行うようになります。簡単に言っちゃうと、

  1. 192.168.1.100 のパソコンが、.1.11 or .1.12 のサーバアクセスする
  2. 192.168.1.100 のパソコンは、1 でアクセスしたサーバにだけアクセスするよう IP ベースで関連付けられる
  3. アイドル時間(サーバアクセスしなかった時間)が 600 秒を超えると、セッションを破棄して、1 に戻る

基本ですな。これを行わない場合、たとえばログイン周りのセッション管理で、バランシングされてるサーバ間で物理的にセッション共有(NAS とかで)してないと、サーバまたいで繊維しちゃって、ログインしている状態が失われたりすます。

んでこの場合、.1.11 か .1.12 どちらか死んだ時、Alive の秒数だけ経過したら、片方のホストに振られて片肺運転になると思うじゃん?じゃん?実際には IP で判断してるから、死んだサーバ側に TTL の秒数経過するまでアクセスされ続けて延々死んだ画面見るハメになる。たぶん TTL 更新病数経過する前に、アクティブな接続繰り返すとずっとダウンしたホスト見続けると思う(試した限りではそうだった)。

Session の記述コメントアウトしたら別の鯖に振られたのでよくやく原因が分かったんだけど、Session 句はバックエンドの動作状況を顧みないのかね……。