Ubuntuにmozshotのインストール
Webページのサムネイルを外部サービスに頼るのもいやなのでソースを公開してくれているmozshotをインストールしてみる。 だいぶハマりながらやったけどとりあえず動かすことができた。とりあえず動いたけど結構てこずった。おかげでタプルとかapcheとかいろいろ勉強になったけどね。ruby読んだの6年ぶりだ・・・
1. ソースのダウンロード
まずはsvnを使えるようにする。でもってsvnでmozshotをダウンロード
sudo aptitude install subversion svn checkout 'http://svn.arege.jp/repos/mozshot/trunk'
これでtrunk以下にダウンロードされる。
2. 実行環境の構築
Xをメモリ上で動かして,rubyからfirefoxを起動したり,画像処理したりとできるようにする。以下をインストールした。
- ruby関係
- ruby-gnome2, librmagick-ruby, libdrb-ruby,libfcgi-ruby
- 仮想フレームバッファ とブラウザ
- xvfb, libgl1-mesa-dri, firefox
(xvfb にバグがあるので libgl1-mesa-driをインストールしないと無限ループになるので注意,09/03)
- apache
- apache2
- fastcgi(apache) 使わなくてもおけ
- libapache2-mod-fastcgi
wget http://rubyforge.org/frs/download.php/34207/fcgiwrap-0.1.6.tgz
3. 試しに起動してみる
Xの起動と試しどり。
Xvfb :1 -screen 0 1024x1024x24 &
でもって
mozshot.rb http://www.google.com
これでmozshot.pngというファイルが作成されて入ればオッケ。
4. デーモンプロセスの起動
動作はこんな感じだった。まず直下にある ts.rb がdruby://7524にキューを作成している。そしてshot.cgiとかexample以下にあるclient.rbとかがこいつに接続して URLとか画像サイズとかの情報を書き込む。でもって、デーモンモードで起動したmozshot.rbが書き込まれているものをキューから読み出してスク リーンショットをとって画像を返す。いろいろあってよく分からないけど結局起動するのに関係するプロセスはこんな感じ。
ts.rb : 単体起動可能
mozshot.rb : ts.rb, Xvfb 依存
shot.cgi, shot.fcgi : ts.rb 依存
標準でexample以下にサーバを起動するrun-serverがあるのでこれを利用して起動してもいいかも。なかを見るとわかるけど、
- Xvfbの起動
- ts.rbの起動(おちたら自動的に再起動)
- run-mozshotの起動 (mozshot.rbをサーバーモードで起動)
を行っている.ただこいつだとデフォルトだとプロセスを5つ起動して、run-mozshot中でログファイルをリダイレクトで書き込むのでログ ファイルの作成先のフォルダを作るかrun-mozshot中のリダイレクト先を変更するかしないとエラーになる。個人的には大量にプロセスを起動する必 要がないので行頭のnum_server=1に設定したりする。
でもって変更したら
example/run-server
で起動。logファイルには多少エラーは出るがx11vncとかで接続して画面を見てfirefoxの白い画面が起動していればちゃんと動いてるので大丈夫だった。
5. クライアント?CGIの設定
最後にcgiの設定を行ってweb上から利用可能にする。必要なのはapache2, librmagick-ruby。利用したければfastcgiを設定しても可だけど利用しなくても大丈夫。とりあえずここでは利用しない。そうすると必要なファイルはshot.cgiのみ。このファイルをcgiでアクセス可能なところに設置する。そして、書き込み可能なところにcacheディレクトリ を作成すれば動作する。ただデフォルト設定だと筆者の環境ではうまく動かなかった。動作に関係するファイルはshot.cgi, flush-result.rbの二つのみ。動作は、
- shot.cgiがリクエストを受け付ける。キャッシュがあれば画像を表示、なければtp.rbで開いたタプルに要求を書き込み、Now Printing...を表示。
- mozshotがタプルから要求を読み出したらスクリーンショットをとり画像をタプルに書き込む。
- utils/flush-result.rbを実行するとタプルに書き込まれた画像を読み出しキャッシュファイルに書き出す
パーミッションとファイルの位置関係をちゃんと考えないとうまく動かないので注意。
注意点と変更点は以下のとおり
- shot.cgi中の :retry => 0, 0以上だとmozshot.rb中のタイムアウト後リトライするタイミング(mozshot.rbのq.clear)でフリーズする。retryを0に設定するか mozshot.rb中のq.clearとretryをコメントアウトしてretryしないようにする。。
-
shot.cgi中の shot_background = true, これでキャッシュがない場合はNow Printing...の表示になりバックグラウンドでスクリーンショットをとるようになる。この設定をしないと画像を取り終わるまで応答が帰ってこないので注意。(動作確認時にはいいけど本番はやめたほうがよい)
- cacheファイルが作成されるディレクトリ(shot.cgi直下にcache)は自分で作成する必要がある。cgiから書き込みできるように(Ubuntuではwww-data)パーミッションを設定する
- クライアント関係のプロセス(shot.cgi, flush-result.rb)はcgiの動作するユーザ(Ubuntuはwww-data)で実行する事に注意。というのもキャッシュファイルにcgiからもflush-resultからも書き込むため。
筆者は cgi-binへアクセスするとtrunk/web-ui が見えるようにシンボリックリンクを張って動作させた。でもって以下のファイルをcronとかwatchとかで定期的にwww-dataで実行する。
DIR=.../trunk/web-ui # web-uiへのパスを設定 cd $DIR && nice -19 timeout 60 ruby -r ../timestamp.rb ../utils/flush-result.rb
ログをとりたければ出力をリダイレクトをするのがいいかも。
おまけ(動作確認用)
x11vnc, tightvncviewer
Xvfb で起動したXは通常見ることができない。このままだと動いてるかどうかすらよく分からないのでVNCを使って接続して見えるようにする。x11vncを利用すると既に起動している画面をリモート操作できるのでこいつをインストールして実行。
サーバ側 aptitude install x11vnc export DISPLAY=:1.0 (Xvfbを起動したスクリーンを設定) x11vnc (セキュリティがヤバいところでは起動する前にパスワードを忘れずに設定) クライアント側 aptitude install xtightvncviewer vncviewer サーバアドレス
これでサーバで起動した見えないXの画面が見えるようになる。これで見ているとmozshotの起動と同時にfirefoxが起動してる事が分かる。たまにダイアログが出たりするとフリーズすることがわかる。