Xvfb 仮想フレームバッファ・サーバ

VNC をいじったついでに,かねてからやろうやろうと思っていた Xvfb の導入もやった。Xvfb はディスプレイのないサーバ機などで X Window System の画面入出力をシミュレートする X11 のサーバ・ソフトウェアである。例えば,あるサイトのリンクにそのページ画面のサムネイル画像を掲げているのをよく目にするが,これをサーバで自動的にやろうとすると,JavaServlet などでサイトのページを取得し,ブラウザと同様にレンダリングし,画面イメージを生成するわけだ。このとき Awt などの「ディスプレイ」の存在を仮定するライブラリを使うのが常である。そこで,ディスプレイ・レスの UNIX サーバ機でもそれをエミュレートする,仮想フレームバッファなるインタフェースを提供するのが Xvfb である。

私はサイト・ページのアクセスカウンタを自作の JavaServlet WebCountServlet で取得している。このサーブレットは,カウンタ画像を生成する関係で Java Awt クラスライブラリを使っており,ディスプレイ環境を必要とする。これまで,普通にメインコンソールで X11 を起動して使っていたのだけれど,Tomcat 再起動のたびにディスプレイのある場所に行かねばならなかった(というのも,Tomcat が DISPLAY:0.0 を当て込んでいるので,:0.0 の端末から操作しなければならなかったから)。リソース的にも X11 を常駐させるのは好ましくなかった。Xvfb ならこのあたりの不都合が減らせる。

FreeBSD の ports を使って Xvfb をインストールした。cd /usr/ports/x11-servers/xorg-vfbserver && make install clean で完了。

# Xvfb :5 -screen 0 1024x768x24 &

を投入して Xvfb サーバを起動させておき,Tomcat が参照する環境変数 DISPLAY に,この場合は :5.0 を設定しておけばよい。通常はディスプレイ.スクリーン番号を :1.0 とするようだが,うちでは ssh,VNC その他でもアクセスするので,:5.0 とした。私のように FreeBSD Tomcat5.5 で使うなら,Tomcat 起動スクリプト /usr/local/etc/rc.d/tomcat55 のどこか,起動時に動く関数のはじめのほうに,次を入れておくとよいと思う。各オペランド指定の仕方は man Xvfb で確認いただきたい。

DISPLAY=:5.0
export DISPLAY
/usr/local/bin/Xvfb :5 -screen 0 1024x768x24 > /dev/null 2> /dev/null &

サーバ設置場所に行かなくても,Tomcat 再起動の必要な作業を書斎(自称)でできるようになったのが,私にとっては何よりうれしい。