wwwsrv

本拠地(日本語のみ)

<URL:http://www.freedom.ne.jp/toki/ruby.html#ruby:script:wwwsrv>

リリース版(英語)

<URL:http://www.ruby-lang.org/en/raa-list.rhtml?name=wwwsrv>

開発版(英語)

<URL:http://218.219.149.23/wwwsrv/>

CVS (英語)

<URL:http://218.219.149.23/cvsweb/>

使い方

デフォルトのポート番号は8888なので、次に説明する例ではwwwsrvを起動する とhttp://localhost:8888/...にアクセスできるようになります。設定 ファイルを使ってwwwsrv起動するときは-fオプションを使って設定ファ イルのパスを指定します。

ローカルのファイル・ディレクトリを見せる

ウェブサーバのルートディレクトリ(/)にローカルディレクトリの $HOME/public_htmlをマウントします。

コマンドラインオプションの例

wwwsrv --mount-local=/:$HOME/public_html

設定ファイルの例

__SERVER__

require 'wwwsrv/local'
local_path = File::join(ENV['HOME'], 'public_html')
local_doc = WWWsrv::LocalFileDocument::new(local_path)
SERVER.mount(local_doc, '/')

CGIを実行する

ウェブサーバのCGIディレクトリ(/cgi)にローカルディレクトリの $HOME/cgiをマウントします。

コマンドラインオプションの例

wwwsrv --mount-cgi=/cgi:$HOME/cgi

設定ファイルの例

__SERVER__

require 'wwwsrv/cgi'
cgi_path = File::join(ENV['HOME'], 'cgi')
cgi_doc = WWWsrv::CGIdocument::new(cgi_path)
SERVER.mount(cgi_doc, '/cgi')

ローカルのファイル・ディレクトリとCGI実行の組み合わせ

ウェブサーバのルートディレクトリ(/)にローカルディレクトリの $HOME/public_htmlをマウントし、CGIディレクトリ(/cgi)にロー カルディレクトリの$HOME/cgiをマウントします。

コマンドラインオプションの例

wwwsrv --mount-local=/:$HOME/public_html --mount-cgi=/cgi:$HOME/cgi

設定ファイルの例

__SERVER__

require 'wwwsrv/local'
local_path = File::join(ENV['HOME'], 'public_html')
local_doc = WWWsrv::LocalFileDocument::new(local_path)
SERVER.mount(local_doc, '/')

require 'wwwsrv/cgi'
cgi_path = File::join(ENV['HOME'], 'cgi')
cgi_doc = WWWsrv::CGIdocument::new(cgi_path)
SERVER.mount(cgi_doc, '/cgi')

CGIの実行をサフィックスが.cgiのファイルだけに限定する

$HOME/public_htmlの中のファイルのうち、サフィックスが.cgiの ファイルだけをCGIとして実行されるようにマウントします。サフィックスが .cgi以外のファイルはローカルのファイルの内容がそのまま見えるよう にします。

コマンドラインオプションの例

wwwsrv --mount-local=/:$HOME/public_html --mount-cgi=/:$HOME/public_html:'\.cgi(/|$)'

設定ファイルの例

__SERVER__

local_path = File::join(ENV['HOME'], 'public_html')

require 'wwwsrv/local'
local_doc = WWWsrv::LocalFileDocument::new(local_path)
SERVER.mount('/', local_doc)

require 'wwwsrv/cgi'
cgi_doc = WWWsrv::CGIdocument::new(local_path)
SERVER.mount('/', cgi_doc, :mask => %r!\.cgi(/|$)!)
# 注意: 正規表現の`($|/)'はPATH_INFOを得るために必要です。

サフィックスが.shtmlのファイルでSSIを実行する

$HOME/public_htmlの中のファイルのうち、サフィックスが .shtmlのファイルでSSIを実行するようにマウントします。

コマンドラインオプションの例

wwwsrv --mount-local=/:$HOME/public_html --attach-ssi=/:'\.shtml$'

設定ファイルの例

__SERVER__

# 注意: 先にローカルファイルをマウントする必要があります。
require 'wwwsrv/local'
local_path = File::join(ENV['HOME'], 'public_html')
local_doc = WWWsrv::LocalFileDocument::new(local_path)
SERVER.mount(local_doc, '/')

require 'wwwsrv/ssi'
SERVER.attach('/', :mask => %r!\.shtml$!) { |document|
  WWWsrv::SSIdocument::new(document)
}

ローカルファイル・CGI・SSIの組み合わせ

$HOME/public_htmlの中のファイルのうち、サフィックスが.cgi のファイルをCGIとして実行するようにマウントし、サフィックスが.shtml のファイルでSSIを実行するようにマウントします。それ以外のファイルはロー カルのファイルがそのまま見えるようにします。

コマンドラインオプションの例

wwwsrv --mount-local=/:$HOME/public_html --mount-cgi=/:$HOME/public_html:'\.cgi(/|$)' --attach-ssi=/:'\.shtml?$'

設定ファイルの例

__SERVER__

local_path = File::join(ENV['HOME'], 'public_html')

require 'wwwsrv/local'
local_doc = WWWsrv::LocalFileDocument::new(local_path)
SERVER.mount(local_doc, '/')

requre 'wwwsrv/cgi'
cgi_doc = WWWsrv::CGIdocument::new(local_path)
SERVER.mount(cgi_doc, '/', :mask => %r!\.cgi(/|$)!)

require 'wwwsrv/ssi'
SERVER.attach('/', :mask => %r!\.shtml?$!) { |document|
  WWWsrv::SSIdocument::new(document)
}

FastCGIを使う

ローカルホストの5678のポート番号で動いているFastCGIアプリケーションを ウェブサーバのルートディレクトリ(/)にマウントします。

コマンドラインオプションの例

wwwsrv --mount-fcgi=/::inet:localhost:5678

設定ファイルの例

__SERVER__

require 'socket'
require 'wwwsrv/fastcgi'
# 注意: keep_connがtrueだと動かないFastCGIアプリケーションもあるようです。
fcgi_doc = WWWsrv::FastCGIDocument::new(:keep_conn => true) {
  TCPsocket::new('localhost', 5678)
}
SERVER.mount(fcgi_doc, '/')

FastCGIアプリケーションが自力でサーバソケットをオープンできないときは、 wwwsrv配布アーカイブのmiscディレクトリの下にある補助ツールの run_fcgi.rbを使ってFastCGIアプリケーションを起動します。 run_fcgi.rbはインストーラを使ってwwwsrvをインストールすると、 PATHの通ったディレクトリにコピーされます。

run_fcgi inet 5678 '[FastCGIアプリケーションを起動するコマンド]'

コマンドライン・オプション

-m ホスト名, --hostname=ホスト名

ホスト名をホスト名に設定します。デフォルトはlocalhostです。 HTTPではHostヘッダーでブラウザーの認識しているホスト名をサーバへ送る ので、このオプションはデフォルトのホスト名を設定しておくぐらいの意味 しかありません。ただし--strictオプションを設定している場合には、 少し意味があります。

-n ポート番号, --port=ポート番号

ポート番号をポート番号に設定します。デフォルトは8888です。

-t, --strict

--hostnameで設定したホスト名に対応するネットワークインターフェー スに限定して、サーバソケットをオープンします。例えばループバックに対 応するlocalhostにホスト名を設定してこのオプションを使うと、サー バには127.0.0.1というループバックに対応するIPだけからアクセスでまきす。 たとえサーバを起動したホストが別のIP(例えば192.168.0.1など)を持って いたとしても、127.0.0.1のIPアドレス以外からはサーバにアクセスできな くなります。

--not-strict

--strictの設定を解除します。

-l ログファイル, --log-file=ログファイル

ログファイルにログを出力します。

--no-log-file

ログをファイルに出力しません。

-q, --quiet

標準出力にログを出力しません。デフォルトでは標準出力にログを出力します。

--not-quiet

標準出力にログを出力します。

-v ログのレベル, --logging-level=ログのレベル

ファイルに出力するログのレベルをログのレベルに設定します。レベ ルはinternal, debug, system, message, warning, notice, alert, errorの 8種類です。internalはログに出力する情報量が最も多くなり、errorはログ に出力する情報量が最も少くなります。デフォルトのレベルはmessageです。

-p ログのレベル, --display-level=ログのレベル

標準出力に出力するログのレベルをログのレベルに設定します。デフォル トのレベルはmessageです。

--request-line-logging(=ログのレベル)

リクエスト行をログに記録するレベルをログのレベルに変更します。 デフォルトはmessageレベルでリクエスト行がログに出力されます。 オプションの引数を省略した場合はログのレベルがmessageに変更されます。

--request-header-logging(=ログのレベル)

リクエストのヘッダをログに記録するレベルをログのレベルに変更しま す。デフォルトはdebugレベルでリクエストのヘッダがログに出力されます。 オプションの引数を省略した場合はログのレベルがmessageに変更されます。

--request-body-logging(=ログのレベル)

リクエストの内容をログに記録するレベルをログのレベルに変更しま す。デフォルトはinternalレベルでリクエストの内容がログに出力されます。 オプションの引数を省略した場合はログのレベルがmessageに変更されます。

--request-trailer-logging(=ログのレベル)

リクエストのトレーラをログに記録するレベルをログのレベルに変更 します。デフォルトはdebugレベルでリクエストのトレーラがログに出力 されます。オプションの引数を省略した場合はログのレベルがmessageに変 更されます。

--status-line-logging(=ログのレベル)

レスポンスのステータス行をログに記録するレベルをログのレベルに 変更します。デフォルトはsystemレベルでレスポンスのステータス行がログ に出力されます。オプションの引数を省略した場合はログのレベルが messageに変更されます。

--response-header-logging(=ログのレベル)

レスポンスのヘッダをログに記録するレベルをログのレベルに変更し ます。デフォルトはdebugレベルでレスポンスのヘッダがログに出力されま す。オプションの引数を省略した場合はログのレベルがmessageに変更され ます。

--response-body-logging(=ログのレベル)

レスポンスの内容をログに記録するレベルをログのレベルに変更しま す。デフォルトはinternalレベルでレスポンスの内容がログに出力されます。 オプションの引数を省略した場合はログのレベルがmessageに変更されます。

--response-trailer-logging(=ログのレベル)

レスポンスのトレーラをログに記録するレベルをログのレベルに変更 します。デフォルトはdebugレベルでレスポンスのトレーラがログに出力さ れます。オプションの引数を省略した場合はログのレベルがmessageに変更 されます。

-e 実効ユーザID, --effective-user-id=実効ユーザID

rootユーザで起動したとき、実効ユーザIDを実効ユーザIDに変更しま す。実効ユーザIDはユーザ名または数値で設定できます。デフォルト はnobodyです。

-g 実効グループID, --effective-group-id=実効グループID

rootユーザで起動したとき、実効グループIDを実効グループIDに変更 します。実効グループIDはグループ名または数値で設定できます。デ フォルトはnobodyです。

--timeout=秒数

タイムアウトを秒数に設定します。デフォルトは300秒です。

--keep-alive=秒数

持続的接続でHTTPのリクエストを待つときのタイムアウトを秒数に設 定します。デフォルトは15秒です。

-d, --debug

デバッグモードで起動します。デバッグモードでは、ドキュメント内部で例 外を捕捉するとエラーレスポンスにバックトースが表示されます。デフォル トではデバッグモードは無効になっています。

--no-debug

デバッグモードを無効にします。

-f 設定ファイル, --config=設定ファイル

設定ファイルをロードします。

-b 基準ディレクトリ, --base-dir=基準ディレクトリ

設定ファイルのBASE_DIR定数に基準ディレクトリを設定します。 デフォルトはカレントディレクトリです。

-s, --daemon

デーモンプロセスとして起動します。デフォルトでは通常のプロセスとして 起動します。

--not-daemon

通常プロセスとして起動します。

-u umask, --umask=umask

プロセスのumask(2)をumaskに設定します。

--catch-sighup

HUPシグナルを受けるとサーバの設定ファイルをリロードします。デフォル トは無効ですが、デーモンプロセスとして起動したときは自動的に有効にな ります。

--connections=最大接続数

HTTP接続の最大接続数を最大接続数に設定します。デフォルトは64個 です。

--max-requests=最大リクエスト数

HTTPの一回の接続で連続して受け付けるこのできる最大のリクエスト数を 最大リクエスト数に設定します。デフォルトは64個です。

--access-allow-name=(!)正規表現

正規表現に一致するホストからの接続を許可します。正規表現 の前に!を付けると、一致しないホストになります。

--access-deny-name=(!)正規表現

正規表現に一致するホストからの接続を拒否します。正規表現 の前に!を付けると、一致しないホストになります。

--access-allow-address=(!)正規表現

正規表現に一致するIPアドレスからの接続を許可します。正規表 現の前に!を付けると、一致しないIPアドレスになります。

--access-deny-address=(!)正規表現

正規表現に一致するIPアドレスからの接続を拒否します。正規表 現の前に!を付けると、一致しないIPアドレスになります。

-a 別名のパス:元のパス, --alias=別名のパス:元のパス

パスの別名を定義します。元のパスの内容を別名のパスからア クセスできるようにします。

--mount-echo=HTTPパス

クライアントのリクエストの内容を返すドキュメントを、HTTPパスに マウントします。

--mount-local=HTTPパス:ローカルパス(:正規表現)

ローカルのファイルまたはディレクトリをHTTPパスにマウントします。 ローカルパスがファイルの場合、そのファイルをHTTPパスの直 下にマウントします。ローカルパスがディレクトリの場合、ディレク トリの中のファイル全てをHTTPパスにマウントします。正規表現 は省略できます。正規表現を設定すると、ディレクトリ内のファイル の内、正規表現に一致するファイルだけがHTTPパスからアクセ スできるようになります。

--mount-cgi=HTTPパス:CGIパス(:正規表現(:インタープリタ))

ローカルのファイルまたはディレクトリをHTTPパスにCGIとしてマウ ントします。CGIパスがファイルの場合、そのファイルをHTTPパス の直下にマウントします。CGIパスがディレクトリの場合、ディレク トリの中のファイルを全てHTTPパスにマウントします。正規表現インタープリタ)は省略できます。正規表現を設定すると、 ディレクトリ内のファイルの内、正規表現に一致するファイルだけが HTTPパスからアクセスできるようになります。インタープリタ を設定すると、インタープリタを使ってCGIスクリプトを実行します。 これはUNIX以外のOSで、スクリプトにインタープリタの設定を埋め込むこと ができない場合に、使うと便利です。インタープリタを設定しない場 合は、CGIスクリプトを実行ファイルそのものとして扱います。

--mount-nph-cgi=HTTPパス:CGIパス(:正規表現(:インタープリタ))

ローカルのファイルまたはディレクトリをHTTPパスにNone Parsed Header CGIとしてマウントします。各パラメータの意味は、 --mount-cgiオプションと同じです。

--attach-ssi=HTTPパス(:正規表現(:SSIタグ))

HTTPパスのドキュメントをSSIで処理します。SSIは既存のドキュメン トのフィルターとして動作するので、HTTPパスには先にSSIで処理す るドキュメントがマウントされている必要があります。正規表現SSIタグは省略できます。正規表現を設定すると、HTTPパス の下の正規表現に一致するドキュメントだけがSSIで処理されます。 SSIタグを設定すると、指定したタグだけが有効になります。複数の SSIタグは,で区切ります。SSIのタグはconfigincludeechofsizeflastmodexecなどがあります。

--mount-erb=HTTPパス:ローカルパス(:正規表現(:セーフレベル(:HTTPメソッド)))

ローカルパスのファイルまたはディレクトリをeRubyドキュメントと してHTTPパスにマウントします。Tiny eRubyが必要です。ローカ ルパスがファイルの場合、そのファイルをHTTPパスの直下にマウ ントします。ローカルパスがディレクトリの場合、ディレクトリの中 のファイル全てをHTTPパスにマウントします。正規表現セーフレベルHTTPメソッドは省略できます。正規表現 を設定すると、ディレクトリ内のファイルの内、正規表現に一致する ファイルだけがHTTPパスからアクセスできるようになります。セー フレベルにはeRubyを実行するセーフレベルを設定します。HTTPメソッ ドにはeRubyの実行を許可するHTTPメソッドを,で区切って指定し ます。デフォルトではGETHEADPOSTメソッドだけが 許されます。

--attach-erb=HTTPパス(:正規表現(:セーフレベル))

HTTPパスのドキュメントをeRubyで処理します。Tiny eRubyが必要で す。eRubyは既存の文書のフィルターとして動作するので、HTTPパス には先にeRubyで処理するドキュメントがマウントされている必要がありま す。正規表現セーフレベルは省略できます。正規表現 を設定すると、HTTPパスの下の正規表現に一致するドキュメン トだけがeRubyで処理されます。セーフレベルにはeRubyを実行するセー フレベルを設定します。

--mount-fcgi=HTTP path:(正規表現):unix or inet:socket path or hostname:port

FastCGIアプリケーションをHTTP pathにマウントします。マウントで きるFastCGIアプリケーションの種類(role)はresponderです。FastCGIアプ リケーションのサーバソケットがUNIXドメインソケットのときは3番目のパ ラメータにunixを設定し、4番目のパラメータにUNIXドメインソケッ トのパスを設定します。FastCGIアプリケーションのサーバソケットが TCP/IPのときは3番目のパラメータにinetを設定し、4番目のパラメー タにホスト名とポート番号を:で区切って設定します。2番目のパラメー タはオプションで、ここに正規表現を設定すると、HTTP path より深いパスの内、正規表現に一致するパスだけがFastCGIアプリケー ションに渡されます。FastCGIアプリケーションが自分自身でサーバソケッ トをオープンすることができなければ、wwwsrvに付属する補助ツールの misc/run_fcgi.rbが使えます。

-h, --help

オプションの簡単な説明を表示します。

--version

バージョンを表示します。

設定ファイル

wwwsrvには--configオプションでwwwsrvの設定を記述したファイルを渡 すことができます。設定ファイルは複数のセクションに分かれていて、それぞ れのセクションの記述は、無名のモジュールの中でrubyスクリプトとして実行 れます。

__INIT__

__INIT__セクションの記述は、wwwsrvがセットアップして実行を開始する前 に、一度だけ実行されます。wwwsrvをデーモンプロセスとして起動していて、 HUPシグナルで再起動をかけても、__INIT__セクションが複数回実行される ことはありません。

__WARM_UP__

__WARM_UP__セクションの記述は、wwwsrvがセットアップして実行を開始す る前に、実行されます。__WARM_UP__セクションは、__INIT__セクションよ り後で__HOST__セクションより前に、実行されます。wwwsrvがデーモンプロ セスとして起動していて、HUPシグナルで再起動をかけた場合は、再起動の 度に__WARM_UP__セクションが実行されます。__WARM_UP__セクションを実行 する無名モジュールは__INIT__セクションを実行した無名モジュールを includeしているので、__WARM_UP__セクションから__INIT__セクショ ンで定義した定数を参照できます。

__HOST__

__HOST__セクションでは、wwwsrvのサーバオブジェクトを初期化するパラメー タを、定数として記述します。__HOST__セクションは、__WARM_UP__セクショ ンより後で__SERVER__セクションより前に、実行されます。wwwsrvをデーモ ンプロセスとして起動していて、HUPシグナルで再起動をかけた場合は、再 起動の度に__HOST__セクションが実行されます。__HOST__セクションを実行 する無名モジュールは__WARM_UP__セクションを実行した無名モジュールを includeしているので、__HOST__セクションから__WARM_UP__セクショ ンで定義した定数を参照できます。

__SERVER__

__SERVER__セクションではwwwsrvのサーバオブジェクトがSERVER定数 に入っていて、このサーバオブジェクトを直接操作することによりサーバを 設定します。このセクションは、__HOST__セクションより後で__COOL_DOWN__ セクションより前に、実行されます。wwwsrvをデーモンプロセスとして起動 していて、HUPシグナルで再起動をかけた場合は、再起動の度に__SERVER__セ クションが実行されます。__SERVER__セクションを実行する無名モジュール は__HOST__セクションを実行した無名モジュールをincludeしている ので、__SERVER__セクションから__HOST__セクションで定義した定数を参照で きます。

__COOL_DOWN__

__COOL_DOWN__セクションの記述は、wwwsrvが終了する前に実行されます。 __COOL_DOWN__セクションは、__SERVER__セクションより後で__FINAL__セク ションより前に、実行されます。wwwsrvがデーモンプロセスとして起動して いて、HUPシグナルで再起動をかけた場合は、再起動の度に__COOL_DOWN__ セクションが実行されます。__COOL_DOWN__セクションを実行する無名モジュー ルは__SERVER__セクションを実行した無名モジュールをincludeして いるので、__COOL_DOWN__セクションから__SERVER__セクションで定義した定 数を参照できます。

__FINAL__

__FINAL__セクションの記述は、wwwsrvが終了する前に、最後に一度だけ実 行されます。__FINAL__セクションは、__COOL_DOWN__セクションより後に実 行されます。wwwsrvをデーモンプロセスとして起動していて、HUPシグナル で再起動をかけても、__FINAL__セクションが複数回実行されることはあり ません。__FINAL__セクションを実行する無名モジュールは__COOL_DOWN__モ ジュールを実行した無名モジュールをincludeしているので、__FINAL__ セクションから__COOL_DOWN__セクションで定義した定数を参照できます。

セクションを実行する無名モジュールのinclude関係

wwwsrvの設定ファイルには様々なセクションがあって、それぞれ異なるタイミ ングで異なる無名モジュールのスコープで実行されます。このままだと各セク ションは完全に独立して実行され互いに連携することができないので、wwwsrv では個々のセクションを実行する無名モジュールに、直前に実行されたセクショ ンの無名モジュールをincludeすることで、直前に実行したセクション で定義された定数を参照できるようにしています。

[__INIT__セクションを実行した無名モジュール]
                  ^
                  |
               include
                  |
[__WARM_UP__セクションを実行した無名モジュール]
                  ^
                  |
               include
                  |
[__HOST__セクションを実行した無名モジュール]
                  ^
                  |
               include
                  |
[__SERVER__セクションを実行した無名モジュール]
                  ^
                  |
               include
                  |
[__COOL_DOWN__セクションを実行した無名モジュール]
                  ^
                  |
               include
                  |
[__FINAL__セクションを実行した無名モジュール]

このように各セクションを実行する無名モジュールがincludeの連鎖に なっていると、例えば__WARM_UP__セクションから__INIT__セクションで定義 した定数を全て参照できます。別の例を挙げると、__SERVER__セクションから は__HOST__セクションで定義した定数を参照でき、また__HOST__セクションが 上書きしない限り__WARM_UP__セクションや__INIT__セクションで定義した定 数も参照できます(当然ながら__INIT__セクションで定義した定数を参照でき るのは__WARM_UP__セクションに上書きされない限りにおいて、という条件も 付きます)。

__HOST__セクションで定義できるサーバのパラメータ

__HOST__セクションではサーバのパラメータを定数で定義します。ほとんどの パラメータには、対応するコマンドラインオプションがあります。設定ファイ ルのパラメータとコマンドラインオプションが競合する場合は、コマンドライ ンオプションが優先されます。

HOSTNAME

ホスト名を文字列で設定します。省略したときは"localhost"にな ります。HTTPリクエストのHostヘッダーが省略されたときのホスト名とし て使われます。またSTRICTオプションがtrueのときにサーバ ソケットを開くネットワークインターフェースの名前として使われます。

PORT

ポート番号を数値で設定します。省略したときは8888であるとみなされま す。

STRICT

trueに設定すると、HOSTNAMEに対応するネットワークインター フェースに限定してサーバソケットを開きます。省略したときは falseになります。

UMASK

プロセスのumask(2)を数値で設定します。省略したときは親プロセスの umask(2)をそのまま引き継ぎます。

LOG_FILE

ログファイルを文字列で設定します。省略したときはログファイルを出力 しません。

LOGGING_LEVEL

ログファイルに出力するログのレベルを設定します。ログのレベルには

の種類があります。WWWsrv::Logger::INTERNALはログに出力する情 報が最も多くなり、WWWsrv::Logger::ERRORはログに出力する情報 が最も少なくなります。省略したときはWWWsrv::Logger::MESSAGE であるとみなされます。

DISPLAY_LEVEL

標準出力に出力するログのレベルを設定します。省略したときは WWWsrv::Logger::MESSAGEであるとみなされます。

REQUEST_LINE_LOGGING_PRIORITY

リクエスト行をログに記録するレベルを設定します。省略したときは WWWsrv::Logger::MESSAGEであるとみなされます。

REQUEST_HEADER_LOGGING_PRIORITY

リクエストのヘッダをログに記録するレベルを設定します。省略したとき はWWWsrv::Logger::DEBUGであるとみなされます。

REQUEST_BODY_LOGGING_PRIORITY

リクエストのメッセージボディをログに記録するレベルを設定します。省 略したときはWWWsrv::Logger::INTERNALであるとみなされます。

REQUEST_TRAILER_LOGGING_PRIORITY

リクエストのトレーラをログに記録するレベルを設定します。省略したと きはWWWsrv::Logger::DEBUGであるとみなされます。

STATUS_LINE_LOGGING_PRIORITY

レスポンスのステータス行をログに記録するレベルを設定します。省略し たときはWWWsrv::Logger::SYSTEMであるとみなされます。

RESPONSE_HEADER_LOGGING_PRIORITY

レスポンスのヘッダをログに記録するレベルを設定します。省略すると WWWsrv::Logger::DEBUGであるとみなされます。

RESPONSE_BODY_LOGGING_PRIORITY

レスポンスのメッセージボディをログに記録するレベルを設定します。省 略したときはWWWsrv::Logger::INTERNALであるとみなされます。

RESPONSE_TRAILER_LOGGING_PRIORITY

レスポンスのトレーラをログに記録するレベルを設定します。省略したと きはWWWsrv::Logger::DEBUGであるとみなされます。

EFFECTIVE_USER_ID

rootユーザで実行したときに使う実行ユーザIDを設定します。実行ユーザ IDは文字列か数値で指定します。省略したときはnobodyであるとみなされ ます。

EFFECTIVE_GROUP_ID

rootユーザで実行したときに使う実行グループIDを設定します。実行グルー プIDは文字列か数値で指定します。省略したときはnobodyであるとみなさ れます。

TIMEOUT

タイムアウトを数値で設定します。単位は秒です。省略すると300秒であ るとみなされます。

KEEP_ALIVE

持続的接続でHTTPのリクエストを待つときのタイムアウトを数値で設定し ます。単位は秒です。省略すると15秒であるとみなされます。

CONNECTIONS

HTTP接続の最大接続数を数値で設定します。省略すると64個であるとみな されます。

MAX_REQUESTS

HTTPの一回の接続で連続して受け付けるこのできる最大のリクエスト数を 数値で設定します。省略すると64個であるとみなされます。

WRITE_BUFFER

レスポンスのバッファリングのサイズを数値で設定します。単位はバイト です。省略すると32キロバイトであるとみなされます

QUIET

真値を設定すると、標準出力にログを出力しなくなります。省略するか偽 値を設定すると、標準出力にログを出力します。

DEBUG

真値を設定すると、デバッグモードで起動します。デバッグモードでは、 ドキュメント内部で例外を捕捉するとエラーレスポンスにバックトースが 表示されます。省略するか偽値を設定すると、デバッグモードでは起動し ません。

ALERT

エラーページ出力用の警告ドキュメントオブジェクトを設定します。ただ しデバッグモードで起動したときは、ALERTの設定如何にかかわら ず、WWWsrv::DebugAlertDocumentクラスのオブジェクトがつかわれ ます。省略したときはWWWsrv::AlertDocumentクラスのオブジェク トをつかいます。

LOGGER

ロギング用のオブジェクトを設定します。ロギング用のオブジェクトは、 WWWsrv::Loggerクラスかまたはその派生クラスのインスタンスです。

SCHEME

プロトコルのスキームを設定します。ここで設定したスキームは、例えば サーバ上のコンテンツをリダイレクトするために絶対URLを作るときなど に使います。省略するとhttpであるとみなされます。

SERVER_SOCKET

サーバソケットのオブジェクトを設定します。例えばSSL用のソケットを 特別にオープンするときなどに使います。省略するとHOSTNAMEPORTの設定を使って自動的にTCPserverをオープンして使い ます。

サーバオブジェクトのメソッド

__SERVER__セクションではSERVER定数にサーバオブジェクトが入ってい ます。サーバオブジェクトはWWWsrv::Serverクラスのインスタンスです。 ここではサーバオブジェクトの主なメソッドを説明します。

WWWsrv::Server#scheme

HTTPのスキームを返します。

WWWsrv::Server#scheme=(new_scheme)

HTTPのスキームを設定します。デフォルトは"HTTP"です。

WWWsrv::Server#timeout

HTTP接続のタイムアウト値を返します。単位は秒です。

WWWsrv::Server#timeout=(new_timeout)

HTTP接続のタイムアウト値を設定します。デフォルトは300秒です。

WWWsrv::Server#keep_alive

HTTPの次の接続を待つときのタイムアウト値を返します。単位は秒です。

WWWsrv::Server#keep_alive=(new_keep_alive)

HTTPの次の接続を待つときのタイムアウト値を設定します。デフォルト は15秒です。

WWWsrv::Server#connections

同時にHTTP接続できる最大数を返します。

WWWsrv::Server#connections=(new_conns)

同時にHTTP接続できる最大数を設定します。デフォルトは64個です。

WWWsrv::Server#max_requests

HTTPの一回の接続で連続して受け付けるこのできる最大のリクエスト数 を返します。

WWWsrv::Server#max_requests=(new_reqs)

HTTPの一回の接続で連続して受け付けるこのできる最大のリクエスト数 を設定します。デフォルトは64個です。

WWWsrv::Server#buffer_size

ネットワークにレスポンスを出力するときに、まとめ書きするサイズを 返します。単位はバイトです。

WWWsrv::Server#buffer_size=(new_size)

ネットワークにレスポンスを出力するときに、まとめ書きするサイズを 設定します。デフォルトは32キロバイトです。

WWWsrv::Server#hostname

サーバのホスト名を返します。

WWWsrv::Server#hostname=(new_name)

サーバのホスト名を設定します。

WWWsrv::Server#port

サーバのポート番号を返します。

WWWsrv::Server#alert

エラーレスポンス用のドキュメントオブジェクトを返します。

WWWsrv::Server#alert=(new_document)

エラーレスポンス用のドキュメントオブジェクトを設定します。デフォ ルトはWWWsrv::AlertDocumentクラスのオブジェクトが設定され ています。

WWWsrv::Server#document

通常レスポンス用のドキュメントオブジェクトを返します。

WWWsrv::Server#document=(new_document)

通常レスポンス用のドキュメントオブジェクトを設定します。デフォル トはWWWsrv::DocumentFolderクラスのオブジェクトが設定されて います。

WWWsrv::Server#add_access_control(action, logging=false) { |request| ... }

アクセス制御の設定を追加します。アクセス制御は追加した順番に適用 されます。action引数には:allowを渡すとアクセスを許可 し、:denyを渡すとアクセスを拒否します。logging引数に 真値を渡すと、アクセス許可/拒否をログに出力します。

WWWsrv::Server#alias(dst_path, src_path)

サーバ上のパスにsrc_pathの別名dst_pathを定義します。

WWWsrv::Server#mount(document, path, [[:page => page|:mask => mask], :host => host]))

ドキュメントオブジェクトをサーバ上のパスにマウントします。 document引数にはドキュメントオブジェクトを渡します。 path引数にはドキュメントオブジェクトをマウントするサーバ上 のパスを文字列で渡します。page引数、mask引数、 host引数はオプションです。page引数とmask引数 は同時には設定できません。page引数に文字列を渡すとドキュ メントオブジェクトはpathpageを合わせたパス (path + "/" + page)だけからアクセスできるようになります。 page引数を渡さなければ、ドキュメントオブジェクトは pathより深い任意のパスからアクセスできます。mask引数 に正規表現を渡すと、ドキュメントオブジェクトはpathより深 くて正規表現に一致するパスだけからアクセスできるようになります。 host引数は仮想ホスト名を文字列で渡します。pagemaskを変えることで、同一のpath上に複数のドキュメン トオブジェクトをマウントすることができます。

WWWsrv::Server#attach(path, [[:page => page|:mask => mask], :target => target, :host => host]) { |document| ... }

ブロックが返すドキュメントオブジェクトをサーバ上のパスにマウント します。このメソッドはSSIのように他のドキュメントオブジェクトの フィルターとして動作するドキュメントオブジェクトを、ブロックで初 期化してマウントするために使います。path引数にはドキュメン トオブジェクトをマウントするサーバ上のパスを文字列で渡します。 page引数、mask引数、host引数の意味は WWWsrv::Server#mountメソッドと同じです。target引数に はドキュメントオブジェクトを捜すための仮のパスを文字列で渡します。 target引数が渡されると、pathtargetを追加し てからドキュメントを捜します。target引数はpath上に pagemaskの異なる複数のドキュメントオブジェクトが マウントされているとき、どのドキュメントオブジェクトをブロックに 渡すのかを決めるために使います。ブロックにはサーバ上のpath にマウントされているドキュメントオブジェクトが渡されます。このた めWWWsrv::Server#attachメソッドを呼ぶより先にサーバ上の pathにドキュメントオブジェクトがマウントされてないとエラー になります。

ドキュメント

wwwsrvのコンテンツはサーバオブジェクトにマウントする様々なドキュメント オブジェクトとして提供されます。ここでは設定ファイルで使えるドキュメン トについて説明します。

wwwsrv/document.rb

このファイルはwwwsrv本体の一部です。wwwsrvを起動すると自動的に requireされるので、設定ファイルの中で明示的にrequireする必 要はありません。

WWWsrv::Documentクラス

WWWsrv::Documentクラスはサーバにマウントする全てのドキュメントの 基底クラスになります。

WWWsrv::Document#warm_up(log)

ドキュメントの前処理を行うメソッドです。サーバの起動時に呼ばれま す。logにはwwwsrv/logger.rbで定義される WWWsrv::Loggerクラスのオブジェクトが渡されます。

WWWsrv::Document#cool_down(log)

ドキュメントの後処理を行うメソッドです。サーバの終了時に呼ばれま す。logにはwwwsrv/logger.rbで定義される WWWsrv::Loggerクラスのオブジェクトが渡されます。

WWWsrv::Document#respond(srv_opt, prefix, request, response) { |arg, opts| ... }

HTTPのレスポンスを作成するメソッドです。作成したレスポンスはブロッ クに渡します。WWWsrv::Documentクラスの全ての派生クラスはこ のメソッドを上書きして各ドキュメント固有のレスポンスを作成します。 引数の説明は次のとおりです。

srv_opt

wwwsrv/srvopt.rbで定義される WWWsrv::ServerOptionクラスのオブジェクトが渡されます。 このオブジェクトはサーバの情報を管理しています。

prefix

ドキュメントがマウントされているパスが文字列として渡されま す。

request

wwwsrv/request.rbで定義されるWWWsrv::Requestク ラスのオブジェクトが渡されます。このオブジェクトはHTTPリク エストの情報を管理しています。

response

wwwsrv/response.rbで定義されるWWWsrv::Response クラスのオブジェクトが渡されます。このオブジェクトはHTTPレ スポンスの情報を管理していて、ドキュメントが返すレスポンス の雛型になります。

メソッドの中からブロックを複数回呼ぶことでHTTPレスポンスを作成し ます。レスポンス作成の流れは次のようになります。

  1. responseオブジェクトの設定をレスポンスの内容に合わせ て修正し、ブロックの第一引数argに渡してブロックを呼 び出します。第二引数optsは使いません。
  2. レスポンスの内容またはその一部を、文字列としてブロックの第 一引数argに渡してブロックを呼び出します。ブロックの 第二引数optsには必要ならHTTP/1.1のChunk-Extentionを渡 しますが、これはほとんどのアプリケーションでは不要でしょう。 レスポンスの内容は、複数回に分けてブロックに渡すこともでき ます。
  3. レスポンスにTrailerを付けるときは、レスポンスの内容を全て 送り出した後で、response.trailerにTrailerを設定しま す。これもほとんどのアプリケーションでは不要でしょう。
  4. 何らかの問題でレスポンスを作成できないときは、 http_errorメソッドにHTTPのステータスコードを渡して呼 び出し、レスポンスの作成をキャンセルします。 http_errorメソッドはWWWsrv::HTTPerrorモジュー ルのモジュール関数です。WWWsrv::Documentクラスは WWWsrv::HTTPerrorモジュールをincludeしています。
WWWsrv::Document#folder?

このメソッドがtrueを返すと、サーバはドキュメントがマウント されているパスをディレクトリとして扱います。デフォルトでは falseを返します。

WWWsrv::Document#internal_documents

ドキュメントが内部に子ドキュメントを含んでいるとき、子ドキュメン トのリストを返します。このメソッドはサーバにマウントされている全 てのドキュメントを巡回するために使うので、派生クラスが子ドキュメ ントを持つときは正しく再定義しなければなりません。

WWWsrv::DocumentFolderクラス

複数のドキュメントを束ねるフォルダーを定義します。サーバオブジェクトの mountメソッドとattachメソッドの実体は、このクラスで定義さ れています。

WWWsrv::DocumentFolder#mount(document, path, [[:page => page|:mask => mask], :host => host]))

WWWsrv::Server#mountメソッドの実体です。

WWWsrv::DocumentFolder#attach(path, [[:page => page|:mask => mask], :target => target, :host => host]) { |document| ... }

WWWsrv::Server#attachメソッドの実体です。

WWWsrv::DocumentDispatcherクラス

リクエストを与えられた条件に従って複数のドキュメントへ振り分けます。

WWWsrv::DocumentDispatcher.new(default_document=nil)

条件分岐用のドキュメントを作成します。default_documentはリ クエストが条件に一致しないときに振り分けられるドキュメントです。 リクエストが条件に一致せずかつdefault_documentも無い場合は、 404 Not Foundレスポンスを返します。

WWWsrv::DocumentDispatcher#add_cond(document, *vary_field_names) { |srv_opt, prefix, request| ... }

リクエストを振り分けるドキュメントとその条件を追加します。 ブロックは必須で、リクエストを振り分ける条件として使われます。リ クエストに対してブロックが評価され、ブロックが真を返すと登録され たdocumentドキュメントがレスポンスを返すのに使われます。 vary_field_namesにはリクエストの条件判断で使用するヘッダ フィールド名を与えます。vary_field_namesに与えたヘッダフィー ルド名は、レスポンスのVaryヘッダフィールドの値に使われます。 ブロックの引数の意味はWWWsrv::Document#respondメソッドの引 数と同じです。

WWWsrv::Pageクラス

固定された文字列をレスポンスの内容として返します。

WWWsrv::Page.new(message, type='text/html', mtime=nil, add_content_md5=false)

messageの文字列をレスポンスの内容として返すドキュメントオ ブジェクトを作成します。オプション引数の説明は次のとおりです。

type

レスポンスのContent-Typeヘッダフィールドに設定す値 を文字列で渡します。省略すると"text/html"になります。

mtime

レスポンスのLast-Modifiedヘッダフィールドに設定する 時刻をTimeオブジェクトで渡します。省略するとレスポン スヘッダからLast-Modifiedヘッダフィールドが無くなり ます。

add_content_md5

trueを設定するとmessageのMD5ハッシュ値を計算し て、レスポンスのヘッダにContent-MD5ヘッダフィールド を追加します。

WWWsrv::Page#content_md5

このメソッドがtrueを返すとき、ドキュメントはレスポンスのヘッ ダにContent-MD5ヘッダフィールドを追加します。

WWWsrv::Page#content_md5=(boolean)

booleanに真値を渡すとドキュメントはレスポンスのヘッダに Content-MD5ヘッダフィールドを追加するようになり、 booleanに偽値を渡すとContent-MD5ヘッダフィールドを追 加しなくなります。

WWWsrv::Redirectクラス

Locationヘッダでリクエストを別のURLへリダイレクトします。

WWWsrv::Redirect.new(status=301, page=REDIRECT_PAGE) { |srv_opt, prefix, request| ... }

リクエストをブロックが返すURLへリダイレクトするドキュメントオブ ジェクトを作成します。ブロックはリクエスト毎に評価され、リダイレ クト先のURLを文字列で返さなければなりません。オプション引数の説 明は次のとおりです。

status

リダイレクトレスポンスのステータスコードを数値で渡します。 省略すると301になります。

page

リダイレクトレスポンスのメッセージを返すドキュメントオブジェ クトを渡します。

ブロックの引数の意味はWWWsrv::Document#respondメソッドの引 数と同じです。

WWWsrv::DocumentModifierクラス

別のドキュメントオブジェクトの入出力を書き変えるフィルター型ドキュメン トの雛型になるクラスです。WWWsrv::DocumentModifierクラスは wwwsrv/delegate.rbで定義されるWWWsrv::Delegatableモジュー ルをincludeしているので、WWWsrv::DocumentModifierクラスに 無いメソッドの呼び出しはフィルター対象のドキュメントオブジェクトに委譲 されます。

WWWsrv::DocumentModifierクラスの派生クラスでは複数のメソッドを上 書きすることで動作を変更します。WWWsrv::DocumentModifierクラスは 一回のHTTPリクエストにつき、次の一連のメソッドを呼び出します。

  1. WWWsrv::DocumentModifier#front_guardメソッドはリクエスト の一番最初に必ず呼ばれます。ここで必要ならリクエストを処理する 準備をします。
  2. WWWsrv::DocumentModifier#modify_requestメソッドは子ドキュ メントにリクエストを渡す前に呼ばれます。
  3. WWWsrv::DocumentModifier#modify_responseメソッドは子ドキュ メントがレスポンスを返すと呼ばれます。
  4. WWWsrv::DocumentModifier#modify_message_bodyメソッドは子 ドキュメントがレスポンスの内容を返すと呼ばれます。
  5. WWWsrv::DocumentModifier#modify_terminalメソッドは子ドキュ メントがレスポンスを終了すると呼ばれます。
  6. WWWsrv::DocumentModifier#rear_guardメソッドはリクエスト の最後に必ず呼ばれます。ここで必要ならリクエストの後処理をしま す。

各メソッドでyieldを呼ぶことで、WWWsrv::Document#respondメ ソッドと同様にレスポンスを作成することができます。デフォルトでは子ドキュ メントのレスポンスをそのまま返すように定義されています。各メソッドには contextという引数にHashオブジェクトが渡されます。 contextハッシュはリクエスト毎に固有に作られるので、メソッド間で 情報をやりとりするために使うことができます。また WWWsrv::DocumentModifier#terminateメソッドを呼ぶことでリクエスト の処理を中断することができます。リクエストを中断するとそれ以降、リクエ ストを処理するためのメソッドは呼ばれなくなりますが、 WWWsrv::DocumentModifier#rear_guardメソッドだけは後処理のために 必ず呼ばれます。

WWWsrv::DocumentModifier.new(document)

documentの入出力を書き変えるフィルター型ドキュメントを作成 します。documentはフィルター型ドキュメントの子ドキュメント になります。

WWWsrv::DocumentModifier#document

フィルター対象の子ドキュメントを返します。

WWWsrv::DocumentModifier#front_guard(srv_opt, context)

リクエストを処理する準備をおこなうメソッドです。

WWWsrv::DocumentModifier#modify_request(srv_opt, context, prefix, request, response) { |arg, opts| ... }

リクエストを子ドキュメントに渡す前に呼ばれるメソッドです。このメ ソッドの中でyieldを呼ぶことでレスポンスを作成できます。

WWWsrv::DocumentModifier#modify_response(srv_opt, context, prefix, request, response) { |arg, opts| ... }

子ドキュメントがレスポンスを返すと呼ばれるメソッドです。このメソッ ドの中でyieldを呼ぶことでレスポンスを作成できます。

WWWsrv::DocumentModifier#modify_message_body(srv_opt, context, body_fragment, opts=nil) { |arg, opts| ... }

子ドキュメントがレスポンスの内容を返すと呼ばれるメソッドです。こ のメソッドの中でyieldを呼ぶことでレスポンスを作成できます。

WWWsrv::DocumentModifier#modify_terminal(srv_opt, context) { |arg, opts| ... }

子ドキュメントのレスポンスが終了すると呼ばれるメソッドです。この メソッドの中でyieldを呼ぶことでレスポンスを作成できます。

WWWsrv::DocumentModifier#rear_guard(srv_opt, context)

リクエストの最後に必ず呼ばれるメソッドです。リクエストの後処理を ここに記述します。

WWWsrv::DocumentModifier#terminate

このメソッドを呼ぶとリクエストの処理を中断します。プライベートメ ソッドです。

wwwsrv/local.rb

ローカルのファイルやディレクトリをウェブ上に公開します。

WWWsrv::LocalFileDocumentクラス

wwwsrv/cgi.rb

CGIスクリプトを使えるようにします。

WWWsrv::CGIdocumentクラス

wwwsrv/ssi.rb

SSIを使えるようにします。

WWWsrv::SSIdocumentクラス

wwwsrv/auth.rb

Basic認証を使えるようにします。

WWWsrv::BasicAuthenticationクラス

wwwsrv/erbdoc.rb

eRuby文書を使えるようにします。

WWWsrv::ERubyDocumentクラス

WWWsrv::ERubyFilterDocumentクラス

wwwsrv/filter.rb

コンテンツを書換えられるようにします。

WWWsrv::LineFilterDocumentクラス

wwwsrv/fastcgi.rb

FastCGIを使えるようにします。

WWWsrv::FastCGIResponderクラス

WWWsrv::FastCGIAuthorizerクラス

WWWsrv::FastCGIFilterクラス

wwwsrv/xmlrpc.rb

XML-RPCを使えるようにします。

WWWsrv::XMLRPCServerクラス

wwwsrv/echo.rb

HTTPリクエストの内容を表示します。このドキュメントは一番最初にデバッグ 用に作られました。

WWWsrv::Echoクラス