WWWサーバの運用
和歌山大学経済学部
この文書の位置づけ
この文書は学内向けにWWWサーバの運用に関する情報をまとめたものです。
内容は既にかなり古くなっています。
また間違いも含んでいます。
コメントをお願いします。
目次
1.はじめに
インターネットが PC-VAN や Niftyserve 等のパソコン通信と本質的
に異なるのは、パソコン通信が VAN (Value Added Network) における
サービスの一形態で、通信ネットワークと電子掲示板等のサービスが一
体で提供されているのに対し、インターネットでは通信ネットワークの
提供者とサービスの提供者が独立して存在し得る点だと考えられます。
もともとインターネットは、研究機関の間で研究情報を交換するために
互いのコンピュータを通信回線で結んだところから出発しているので、
その成立において全体を総括するような機関が存在していたわけでは
ありません。
これは、言い換えれば、利用者が同時にサービスの提供者でもあるこ
とを示しています。サービス提供の機会がすべての利用者に均等に与え
られているのがインターネットの特色なのです。
ここではインターネットへの情報発信の手段として、WWW サーバの
運用について解説します。
WWW (World Wide Web) とは
CERN (Conseil Européenne pour la Recherche Nucléaire)
によって提唱されている、分散ハイパーメディアシステムの
構築を目標としたプロジェクトです。
この基本となるハイパーテキストとは、読者が文書のある部分に関連
する情報を容易に入手できるよう、文書のその部分に関連する情報への
「ポインタ」を埋め込んだものです。一般の文書なら、それが参照して
いる別の文書を入手するのにある程度の手間がかかりますが、ハイパー
テキストでは、それを「読む」ためのソフトウェア (ブラウザ、 NCSA
Mosaic 等) を使用することにより、例えばその部分をマウスで「クリッ
ク」する程度で関連する文書に「リンク」できます。
分散ハイパーメディアシステムとは、 インターネット上に散在する
様々な情報 (資源と呼びます) をハイパーテキストを使って互いに関連づ
けようとするものです。 この記述には HTML (HyperText Markup
Language) を用います。
WWW においてリンクされる情報は、インターネットを介してアクセ
ス可能なものなので、実際の所在は問いません。また種類もハイパーテ
キストやプレーンテキストに限らず、プログラムやデータベース、画像
や音声、動画なども含んだ、まさにハイパーなものです。
インターネット上の資源は、所在や種類だけでなくそのアクセス方法
も多岐にわたります。そこでこのような資源に対して統一的な命名法を
用意することが考えられています。それが URL (Uniform Resource
Locator) で、書式は以下のようなものです。WWW ではこれをポインタ
として用います。
アクセス方法://ホスト:ポート/パス
このアクセス方法には以下のようなものがあります。このほか whois
なども対象になります。
- file
- ローカルマシン上のファイル (ホスト名が localhost でな
ければ ftp と同じ)
- file://localhost/usr/local/src/X11R5/RELNOTE.TXT
- ftp
- anonymous ftp サーバ上のファイル
- ftp://luna.eco.wakayama-u.ac.jp/README
- telnet
- telnet によるログイン (パス名は付けない)
- telnet://dra.com
- news
- ネットワークニュースの記事 (ニュースグループ名や
Message-Id を使う)
- news:wadai.talk.misc, news:<Message-Id>
- wais
- WAIS のデータベース (ソース)
- wais://rfc-wais.dit.co.jp/rfc
- gopher
- gopher サービスのメニュー
- gopher://www.wakayama-u.ac.jp/
- http
- HTTP サーバ上の資源
- http://www.wakayama-u.ac.jp/img/gif/wadai_s.gif
ホストはサービスを提供しているホストの FQDN (Full Qualified Domain
Name) で、ポートはそのサービスをアクセスするのに用いる TCP/IP の
ポート、パスはその資源がファイルシステム上にあるときのパス名で
す。ポートは省略可能で、省略された場合はそのアクセス方法において
標準的に使用するポート (well known port) が使用されます。アクセス方
法によってはパスやホスト名を持たない場合があります。 news の場合
資源としての記事の所在は無数にあるので、別の方法でブラウザがアク
セス可能な NNTP サーバを指定しておいて、URL でニュースグループ
名等を指定します。
これらのアクセス方法のうち WWW の中心となるのは HTTP ですが、
WWW の目指しているものは HTTP に限らずインターネット上の様々な
資源を集約することです。WWW のサーバ、すなわち HTTP のサーバ自
体は当然 HTTP でしかアクセスできませんが、ブラウザがこれらのもの
に対する統一的なインタフェースを提供します。このためブラウザは非
常に大きなソフトウェアです。
但し、ブラウザが上に挙げたすべてのアクセス方法をサポートしてい
るとは限りません。例えば、 Macintosh や Windows 上のブラウザでは、
WAIS をサポートするためのパッケージ public domain に存在しないた
め、現時点ではそれらからは直接 WAIS のサーバにはアクセスできませ
ん。しかし UNIX 上に用意されている WAIS と HTTP のゲートウェイを
介すればアクセスすることができます。
HTTP (Hypertext Transfer Protocol) は、WWW においてハイパーテキ
ストデータの転送に用いる手順です。ブラウザは URL を見て、それが
HTTP でアクセスすべき資源なら、URL に示されたホストの HTTP 用の
ポートに TCP で接続し、"GET /URLのパスの部分" というリクエストを
送ります。サーバはこのリクエストに従って要求された資源 (データ) を
ブラウザに送ります。なお、この "/URLのパスの部分" のことを URI
(Uniform Resource Identifier) と呼びます (CrLf は復帰改行です)。
host: www.wakayama-u.ac.jp
http://www.wakayama-u.ac.jp/ → port: 80 (HTTP の well-known port)
uri: /
↓
request: "GET / CrLf"
このようなリクエストを Simple Request といいます。このほかに Full
Request があります。
Method URL ProtocolVersion CrLf
Header CrLf
CrLf
data ....
ProtocolVersion を省略すると HTTP/V0.9 が仮定されます。ここに
HTTP/V1.0 を指定すると FullRequest となり、ブラウザは次に
RFC822 (つまり電子メール) 形式のヘッダを送ることが可能になります。
ヘッダはブラウザ側の情報やサーバに対する指示
(キャッシュに置かれたデータを使うかどうかなど) を含みます。
ヘッダの終りは空行 (CrLf のみ) で示し、その後ろにデータが続きます。
Method には GET の他 HEAD や POST などいくつかのものがあります。
GET の応答は FullRequest に対してはデータの先頭にサーバの情報や
データの詳細 (作成時間や有効期限など) を示す RFC822 形式の
ヘッダを付加したものになります。
また HEAD はそのヘッダだけを取り出します。
すでに述べたように、HTTP 自体は簡単なプロトコルなので、それを
解釈するサーバプログラムもいろいろなところで開発されています。
"GET uri" の形式の Simple Request だけを実現するなら、
sh スクリプトでも簡単に書くことができます。
#!/bin/sh
read get docid version
cat /server_root/`echo $docid | tr -d '\015'` # strip trailing CR
これを inetd で起動するよう設定します。
- /etc/services
- www 80/tcp
- /etc/inetd.conf
- www stream tcp nowait nobody /this/script script
このようなサーバでも、このサーバ自身が管理する資源が (ISINDEX
や FORM を含まないような) 参照のみのハイパーテキスト (HTML 文書)
だけなら一応動きます。その他の機能は、エラー処理等を除けば、この
サーバで管理しようとする資源の内容に合わせて追加することになります。
追記:現実にこんな方法でサーバを動かしたら、
セキュリティ上とてつもなくでっかい穴を空けることになります。
決して真似しないでください :-P
以下は UNIX 用のサーバですが、ブラウザ同様 Macintosh や Windows
用のものあります。
基本的には gopher サーバですが、HTTP によるアクセスも可能です。
HTTP でアクセスされたときは、gopher サーバとしての応答を HTML
化して送ってくれます。gopher サーバとしてもオリジナルの gopherd に
はない機能を持っており、特に検索機能に関してはサーバ自身で grep 方
式による検索機能を持っているのに加え、WAIS のインデックスを使っ
た検索が行えるなど充実しています。また gopher のメニューを記述する
menu ファイルの中に HTML による記述を埋め込むことができるので、
HTTP でアクセスされたときだけインラインイメージを貼り込むような
こともできます。これを index.html のように使用すれば、本当の HTTP
サーバと同じ使い方ができます。CERN や NCSA の httpd に比べてスク
リプト機能が劣るとされていますが、基本的な使い方では不足を感じま
せん。
インストールは多分これが一番簡単で、筆者の luna に "すら" ほとん
ど手を加えずにインストールできました。ややこしい設定ファイルも
ありません。
もっとも人気のあるブラウザである Mosaic を作っているところが出し
ている HTTP サーバ。多機能な割に軽いという評判です。設定ファイル
がアクセス制御用のものを含めて三つもあるのと、その書き方が HTML
的で取っつきにくいのが難点と言えなくもないでしょう。現在 version
1.3 が emily0 で動いています。
WWW プロジェクトの中心である CERN で開発されたサーバ。現在
ryujin で使用している 3.0pre6 というバージョンでは、WAIS のゲート
ウェイの他 proxy (ゲートウェイ/代理応答) やキャッシュなどの機能を持
ちます。NCSA のものに比べてかなり大きいのですが、設定ファイルは
一つだけです。
perl で書かれたサーバ。機能は NCSA 版とほぼ同等だそうです。
パソコン上で稼働するものに KA9Q NOS (MS-DOS), NCSA httpd for
Windows, SerWeb, WEB4HAM (以上 Windows), HTTPS (Windows-NT),
MacHTTP (Macintosh) などがあります。インターネットに情報を発信す
るのに、必ずしも UNIX ワークステーションが必要なわけではないのです。
6.1.HTTPサーバのコンパイル
現在までに筆者は CERN httpd 3.0pre6 (ryujin)、ncsa-httpd 1.3 (emily0)、
gn 2.12 (luna) の3つの HTTP サーバのインストールを行いました。ここ
では CERN のものについて解説します。CERN のサーバは、Sun 等のポ
ピュラーなプラットホームに対しては、コンパイルされたバイナリが用
意されていますから、それを利用すればよいでしょう。ソースファイル
をコンパイルして作る場合は、以下のような手順になります。最初に
ソースファイルのパッケージを入手し、それを展開します。
% zcat cern_httpd.tar.Z | tar xf -
これによって WWW というディレクトリが作成されます。WWW/All
の中に、サポートしているプラットホームごとにディレクトリがありま
すから、インストールしようとするプラットホームが含まれているかど
うか調べてください。サポートされていれば、単に make するだけでコ
ンパイルできると思います。必要に応じて WWW/All/プラットホーム名
/Makefile.include を修正してください。
% cd WWW
% make
このとき、もしプラットホームの判別に失敗するようなら、make する
かわりに次の手順を用いてください。
% setenv WWW_MACH プラットホーム名
% ./BUILD
これで WWW/Daemon/プラットホーム名 に httpd ができるほか、htadm、
htimage、cgiparse、cgiutils といったユーティリティー群が作られま
す。
なお、サポートされていないプラットホームインストールしようとす
るとき、それが BSD 系の OS なら、上の手順の "プラットホーム名" を
unix に設定してみてください。なお SONY の NEWS-OS 4.x はリンク時
に strftime と mktime がないというエラーがでます。
これらは glibc などのパッケージに含まれているので、
持ってきて一緒にコンパイル/リンクすればいいでしょう。
httpd はデフォルトではコンフィギュレーションファイルとして
/etc/httpd.conf を読み込みます。これは httpd の起動時に -r オプションで
指定することによって変更できます。
httpd -r /usr/local/etc/httpd.conf
このサンプルが httpd のソースファイルと同じところに server_root.tar.Z
として用意されています。この中には次のようなファイルが含まれてい
ます。
- httpd.conf
- 標準的な HTTP サーバの設定
- prot.conf
- アクセス制御を行う場合の HTTP サーバの設定
- proxy.conf
- データのキャッシングをしない場合の proxy サーバの設定
- caching.conf
- データのキャッシングを行う proxy サーバの設定
この httpd.conf の設定 (ディレクティブ) について解説します。大文字/小
文字の区別はありません。
- ServerRoot /usr/local/lib/httpd
- httpd 関係の各種ファイルを置くディレクトリ。
server_root.tar.Z を展開して、そこを指定すればいいと思
います。
- Port 80
- http のサービスを受け付ける TCP のポート番号。80 が標
準ですが、proxy 専用のサーバにしたいときは、本来の
HTTP サーバと区別するために他の番号 (8080 など) が指
定されます。これは httpd の -p オプションで変更するこ
とができます。
- UserId nobody
- httpd が動作するときの user id。普通 nobody を指定しま
す。
- GroupId nogroup
- httpd が動作するときの group id。普通 nogroup を指定し
ます。
- AccessLog /var/log/httpd
- httpd のアクセス履歴を保存するファイル。サンプルでは
コメントアウトしてあるので、ログをとる必要があれば
設定します。wusun では /var/log/http。
- ErrorLog /var/log/httpd-err
- httpd のエラーを記録するファイル。これもサンプルでは
コメントアウトしてあるので、ログをとる必要があれば
設定します。wusun では /var/log/http.err。
- LogFormat Common
- ログファイルの書式。Common のままでいいと思いま
す。昔の形式にする場合は Old に設定します。
- LogTime LocalTime
- ログファイルに記載する時刻の時間帯。グリニッジ標準
時を使いたいときは GMT、現地時間を使うときは
LocalTime を設定します。
- UserDir public_html
- http://host/~user/ という URL でアクセスしたときに、検
索される user のホームディレクトリのディレクトリ名。
wusun では public_html に設定されているので、この URL
では ~user/public_html が検索されます。
- Exec /cgi-bin/* /usr/local/lib/httpd/cgi-bin/*
- CGI スクリプトの起動を許す URL のパターンと、実際に
CGI スクリプトが置かれているディレクトリとの対応を
指定します。上の例では http://localhost/cgi-bin/date とい
う URL に対して /usr/local/lib/httpd/cgi-bin/date を起動しま
す。
- Pass /* /pub/*
- ドキュメントの参照を許す URL のパターンと、実際にド
キュメントが置かれているディレクトリとの対応を指定
します。上の例では http://localhost/file という URL に対
して /pub/file が参照されます。ドキュメントを公開する
ディレクトリの指定です。
以降は proxy/cache 関係のディレクティブです。
- Pass http:*
- Pass gopher:*
- Pass ftp:*
- Pass wais:*
- URL が完全な形式、つまり proxy サーバへのリクエスト
だったとき、それを実際のサーバに転送することを指定
します。
- Caching On
- proxy サーバにおいてデータのキャッシングを行うかど
うかを指定します。キャッシングを行わないときは Off
を指定します。
- CacheRoot /var/spool/httpd
- キャッシングしたデータを保存するディレクトリを指定
します。
- CacheSize 10
- キャッシングするデータの上限を設定します。単位は
MB です。
- CacheClean * 2 months
- 指定した URL のパターンにマッチするキャッシュデータ
の保存期限の上限を設定します。この例ではいかなる
URL のキャッシュデータの保存期間を最長で2箇月間に
設定します。months を付けなければ単位は日になりま
す。
- CacheUnused http:* 2 weeks
- CacheUnused ftp:* 1 week
- CacheUnused gopher:* 1 weeks
- 指定した URL のパターンにマッチするキャッシュデータ
が参照されなかったときに消去されるまでの期間を設定
します。week(s) を付けなければ単位は日になります。
- CasheDefaultExpiry ftp:* 10 days
- CasheDefaultExpiry gopher:* 2 days
- キャッシュした元のデータのヘッダ情報からデータの有
効期限や最終修正時刻などの情報が得られなかったとき
のデフォルトの有効期限を指定します。HTTP に関して
はデータがプログラムによって生成される場合があるの
で、これは指定しません。
- Gc On
- ガベージコレクションを行う設定です。行わない場合は
Off を指定してください。
- GcDailyGc 3:00
- ガベージコレクションを行う時刻を指定します。
- NoCaching http://www.wakayama-u.ac.jp/*
- キャッシングを行わない URL のパターンを設定します。
CERN httpd 3.0 では URL のパターンに複数のワイルド
カー(*)が使えるそうなので、"*://www.wakayama-u.ac.jp/*"
というパターンも使えると思います。
wusun では上記の設定をひとつのコンフィギュレーションファイルに
まとめて、普通の HTTP サーバと proxy サーバを兼用しています。
他にも多数のディレクティブが用意されています。一部を紹介しま
す。
- Welcome index.html
- URL がディレクトリ指していたときに参照される、その
ディレクトリ内のファイル名。デフォルトでは
Welcome.html、welcome.html、及び index.html のいずれか
です。index.html は NCSA の httpd との互換性のために用
意されています。
- DirAccess on
- URL がディレクトリ指しており、かつ Welcome ディレ
クティブで指定されたファイルが存在しないとき、その
ディレクトリの一覧を作成するかどうかを設定します。
デフォルトは on で、作成しないときは off 指定します。
selective を指定したときは、そのディレクトリ内に
.www_browsable というファイルがあるときのみ作成しま
す。
- DirReadme top
- ディレクトリの検索を許しているときに、そのディレク
トリ内にある README ファイルをディレクトリ一覧と
組み合わせて表示するかどうかを指定します。デフォル
トは top で、README ファイルの内容をディレクトリの
一覧より前に表示します。後ろに表示するときは bottom、
表示しないときは off 指定します。
- Search /usr/local/lib/httpd/cgi-bin/search
- ISINDEX や FORM を使ったときにデフォルトで起動す
るスクリプト。
自分自身のページを持ちたいとき
ホームディレクトリに public_html (コンフィギュレーションファイル
の UserDir ディレクティブに設定されているもの) というディレクトリを
作ります。当然このディレクトリとホームディレクトリは others に対し
て検索可能 (chmod o+x $HOME $HOME/public_html) である必要がありま
す。
このディレクトリの下に Welcome.html か welcome.html あるいは
index.html という HTML 文書を置けば、それが
http://www.server.host/~user/ という URL でアクセスできます。
HTML を知らなくても、単にこのディレクトリにファイルを置くだけ
で、サーバが自動的にファイルの一覧を HTML 形式で作成してブラウザ
に送ってくれます。その際そこに README ファイルがあれば、ディレ
クトリ一覧の先頭にその内容を表示してくれます。
CGI (Common Gateway Interface) とは、参照するかわりに実行して結果
を得ることのできる資源です。HTTP とその他のプロトコルのゲート
ウェイをサーバ側で用意したり、データベースの検索を行う場合などに
使用します。URL がコンフィギュレーションファイルの Exec ディレク
ティブに設定されているパターンにマッチするとき、それが実行可能な
プログラム (シェルスクリプトを含む) ならその標準出力を応答としてブ
ラウザに返します。
HTTP サーバは通常ファイルの拡張子を見て、そのファイルの MIME
タイプ (HTML 文書なのか画像なのか等) を決定しますが、CGI スクリプ
トの出力に対して実行前にそれを知ることは困難です。このため CGI ス
クリプトは出力の先頭にかならず MIME タイプを示す Content-Type: 行
を置く必要があります。Content-Type: とデータの本体の間には1行空行
を入れてください。
#!/bin/sh
echo "Content-Type: text/html"
echo ""
echo "<HEAD>HTML output</HEAD>"
echo "<BODY>"
echo "<H1>This is a sample HTML output</H1><P>"
echo "</BODY>"
#!/bin/sh
echo "Content-Type: text/plain"
echo ""
echo "This is a sample PLAIN output"
Content-Type: で明らかになっているので、出力中に <HTML>~
</HTML> や <PLAINTEXT> 等を埋め込む必要はありません。
CGI スクリプトにデータを渡すには、引数と環境変数を用います。い
ま、sh スクリプトで書かれた CGI スクリプト /cgi-bin/script を、下のよ
うな URL を用いて起動した場合を考えます。ドキュメントを公開する
ディレクトリは /usr/doc/WWW とします。空の変数やURL によって内
容が変化しない変数は省略しています。
- http://host/cgi-bin/script/file/path
- $# = 0
- $PATH_INFO = /file/path
- $PATH_TRANSLATED = /usr/doc/WWW/file/path
- http://host/cgi-bin/script?arg1+arg2
- $# = 2
- $1 = arg1
- $2 = arg2
- $QUERY_STRING = arg1+arg2
- http://host/cgi-bin/script/file/path?arg1+arg2
- $# = 2
- $1 = arg1
- $2 = arg2
- $PATH_INFO = /file/path
- $PATH_TRANSLATED = /usr/doc/WWW/file/path
- $QUERY_STRING = arg1+arg2
- http://host/cgi-bin/script/file/path?string1=hello&string2=world
- $# = 0
- $PATH_INFO = /file/path
- $PATH_TRANSLATED = /usr/doc/WWW/file/path
- $QUERY_STRING = string1=hello&string2=world
したがって URL の CGI スクリプトの部分に (さもサブディレクトリが
あるかのように) 続くパス名は、ドキュメントを公開するディレクトリ
からの相対で示された資源へのパスであり、? に続く部分は
QUERY_STRING と CGI スクリプトの引き数に渡されます。その際 + で
区切って複数の引き数を渡すことができます。ただし? に続く部分に =
が含まれていれば、これは引き数として処理されずに QUERY_STRING
だけに渡されます。
なお、このように区切り文字として使われている /, ?, +, =, & や
|, <, >, (, ), !, # , % など多くのの特殊記号は、
URL の中で使うことができません。
このような文字を引き数などで使用したい場合は、% に続けた文字
コードの 16 進表記で表現します。
/ → %2F? → %3F+ → %2B= → %3D
& → %26< → %3C> → %3E
7.2.NPH-Scripts
NPH (No-Parse-Headers) スクリプトは HTTP の応答のヘッダ部分を自分
自身で作成する CGI スクリプトです。この CGI スクリプトの名前は
"nph-" というプリフィックスで始まらなければなりません。なお CERN
httpd には、このスクリプトで使う cgiutils というユーティリティー
が付属しています。
#!/bin/sh
cat << 'EOT'
HTTP/1.0 200 Script results follow
Server: MyScript/1.0 via CERN/3.0
Content-Type: text/html
<HEAD>NPH-Script output</HEAD>
<BODY>
<H1>This is a sample NPH-Script output</H1><P>
</BODY>
EOT
これは、例えばHTTP のリザルトコード (例中の 200) を CGI スクリプ
トの状態によって変えたいときなどに使われます。
HTML 文書に埋め込むインラインイメージをアンカーにするとき、
ISMAP という属性を付けることができます。
<A HREF="http://host/path">
<IMG SRC="/img/sample.gif" ISMAP>
</A>
このイメージ上をクリックしたとき、もし ISMAP がなければ HREF
で指定された URL にそのままリンクしますが、ISMAP が指定されてい
るときは URL に引き数が付きます。
http://host/path?x+y
ここで x, y はクリックしたイメージ上の位置です。したがって、path
を与えられた引き数の値によって応答を変えるCGI スクリプトにしてお
けば、クリックした位置によってリンク先を変えることなどが実現でき
ます。
CERN の httpd にはこれをサポートするために htimage というユーティ
リティーが付属しています (NCSA httpd にも imagemap という同様な
ユーティリティーが付属しています)。これを使用するには、まずイメー
ジ上のクリック位置とリンクする URL を対応付ける設定ファイルを作
ります。
- default URL
- 未定義部分をクリックしたときにリンクする URL。必須
です。
- circle (x,y),r URL
- (x,y) を中心とし半径 r の園内をクリックしたとき
- rectangle (x1,y1) (x2,y2) URL
- 2点 (x1,y1), (x2,y2) を結ぶ線分を対角線とする矩形領域
内をクリックしたときにリンクする URL。
- polygon (x1,y1) (x2,y2) ... (xn,yn) URL
- n 個の点 (x1,y1) ... (xn,yn) に囲まれた多角形領域内をク
リックしたときにリンクする URL。始点 (x1,y1)と終点
(xn,yn)は一致していなくても構いません。
この設定ファイルをドキュメントを公開しているディレクトリの下に
置かれた maps/sample.map とし、またマップに使う画像ファイルを同様
に images/sampile.gif としたとき、これらを使ってクリッカブルマップを
実現するには以下のようにします。
<A HREF="/cgi-bin/htimage/maps/sample.map">
<IMG SRC="/images/sample.gif" ISMAP>
</A>
"/cgi-bin/htimage/maps/sample.map" という記述が長すぎるなら、サーバ
のコンフィギュレーションファイルにおいて
"Map /img/* /cgi-bin/htimage/maps/*"
のようにマップしておけば、"/img/sample.map" のように書けるようになります。
htimage や imagemap のようなユーティリティーを自作するのは容易だ
と思います。単に他のURL にリンクするだけでなく、アイデア次第でい
ろんな応用が考えられると思います。
ISINDEX はデータの検索のための問い合わせを実現します。HTML 文
書が <ISINDEX> を含んでいると、ブラウザ上のその位置に入力欄が現
れます。
ここにキーワードをタイプし改行すると、キーワードを引き数にして
もう一度同じ HTML 文書にリンクしようとします。
- HTML 文書が CGI スクリプトにより生成されたものなら、その
CGI スクリプトがもう一度実行されます。下は検索結果を表示す
る画面に入力欄を表示しないようにする例です。
#!/bin/sh
echo "Content-Type: text/html"
echo ""
case $# in
0)
echo "<ISINDEX>"
…
;;
*)
echo "<TITLE>Search Results</TITLE>"
…
;;
esac
- HTML 文書が実行できない普通の文書なら、httpd のコンフィギュ
レーションファイルにおいて Search ディレクティブ で指定された
CGI スクリプトが実行されます。
- HTML 文書において ISINDEX に対して ACTION が指定されてい
れば、その CGI スクリプトが実行されます
(例: <ISINDEX ACTION="/cgi-bin/script">)。
CGI スクリプトの実行の際、キーワードは引き数と環境変数
QUERY_STRING の両方に設定されます。スペースで区切って複数の
キーワードを与えた場合は、CGI スクリプトにひとつひとつ独立した引
き数として渡されますが、QUERY_STRING には + で区切られて代入さ
れます。
QUERY_STRING からキーワードを切り出すには、CERN httpd に付属
している cgiparse というユーティリティーを使うと便利です。これは
"%16進数" の形にエンコードされた文字のデコードも行ってくれます。
#!/bin/sh
echo "Content-Type: text/plain"
echo ""
n=0
for i in `cgiparse -keywords` # QUERY_STRING からキーワードを切り出す
do
n=`expr $n + 1`
echo "arg[$n]=$i"
done
7.5.FORM (Fill-Out Form)
FORM は ISINDEX を拡張したもので、複数の入力欄やチェックボッ
クスなどを扱うことができます。よく使用される FORM の要素を以下に
示します。
- <FORM METHOD="POST" ACTION="/cgi-bin/script">
- Fill-Out Form の開始です。METHOD は省略すると GET
になります。POST を指定したときは、httpd のコンフィ
ギュレーションファイルの POST-Script ディレクティブ
において、これを処理するスクリプトを指定しておく必
要があります。また PUT を使用するときは、 PUT-Script
ディレクティブの設定に加えて、"Enable POST" や認証
などの設定も必要になります。ACTION に関しては
ISNDEX と同様です。
- <INPUT TYPE="text" NAME="username" MAXLENGTH="20">
- 一行の文を入力する欄を作成します。MAXLENGTH は
文の長さの上限です。
- <INPUT TYPE="checkbox" NAME="switch" VALUE="on">
- チェックボックス。この例ではブラウザ上でチェックさ
れたとき switch=on が設定されます。
- <INPUT TYPE="hidden" NAME="status" VALUE="high">
- 隠れた欄。ブラウザ上には現れませんが、状態を保存し
ておいてサーバに返すような用途にしようできます。
- <SELECT NAME="fruit" MULTIPLE><OPTION>orange<OPTION>apple</SELECT>
- 選択肢を作ります。<OPTION> に続く label が選択項目
としてブラウザ上に表示されます。MULTIPLE を指定し
なければ、選択肢はポップアップメニューになります。
- <TEXTAREA NAME="comment" COLS=48 ROWS=10>text</TEXTAREA>
- 数行にわたる大きな入力欄を作ります。COLS は欄の
幅、ROWS は行数を示します。text はこの欄にあらかじ
め入れておく文章です。
- <INPUT TYPE="reset" VALUE="Cancel">
- 入力欄をすべて初期状態に戻すボタンを作ります。
VALUE はボタンに付けるラベルで、省略すると "reset"
になります。
- <INPUT TYPE="submit" VALUE="Send This Form">
- Fill-Out Form を終了しデータをサーバに送るボタンを作
ります。VALUE はボタンに付けるラベルで、省略する
と "submit" になります。
- </FORM>
- Fill-Out Form の終わりです。
ブラウザ上で入力欄にデータを設定して submit を選択すると、指定さ
れた CGI スクリプトが起動されます。その際、データは環境変数
QUERY_STRING に次のような形式でセットされます。
username=tokoi&switch=on&status&fruit=orange&comment=good bye joe
つまり = の左辺に NAME= で指定されたものを置き、その右辺に入力
欄の内容や選択肢、あるいは VALUE= の設定を置いたものを、項目ご
とに & で区切って並べたものが得られます。
QUERY_STRING から要素を切り出すには、この場合も cgiparse が使
えます。要素を一つ一つ切り出すには -value オプションを使います。ま
た -form オプションを付けたときの cgiparse の出力は下のようになりま
すから、これを sh スクリプト等で eval するだけでシェル変数として使
用できます。
FORM_username='tokoi'; FORM_switch='on'; FORM_fruit='orange'; ...
#!/bin/sh
echo "Content-Type: text/plain"
echo ""
cgiparse -value username # tokoi を出力
cgiparse -value switch # on を出力
eval `cgiparse -form` # 全部をシェル変数に
8.proxy 機能
8.1.firewall
インターネットに接続し、インターネット上の様々な資源にアクセス
できるようになると言うことは、逆に他のところからもインターネット
を経由して自分のところがアクセス可能になることです。WWW などの
サービスは、この特性を積極的に利用しようとするものですが、反面、
こちらが望まないようなアクセス、つまりパスワード破りや不正侵入な
どの攻撃を受ける恐れもあります。
ネットワーク内のコンピュータが一つでも不正侵入されると、同じ
ネットワークに接続された他のコンピュータも破られる危険性が非常に
高まるため、インターネットに接続している機関のシステム管理者は、
その機関が所有するすべてのコンピュータに対して、侵入の足がかりと
なるような問題点 (セキュリティーホール) を持たないよう常に注意を払
わなければなりません。しかしコンピュータの数が増えるに従って、こ
のような体制による管理は困難になってきます。そこでインターネット
と LAN の接点部分で外部からの侵入を阻止しようとするアイデアが
firewall (防火壁) です。
インターネットと LAN のように異なるネットワークを相互に接続す
るには、ルータという装置が使われます。ルータには専用機もあります
が、複数のネットワークインタフェースを持つワークステーションも
ルータとして使用されます。
後者のタイプのルータにおいて、例えば片方のネットワークからもう
一方のネットワークへの通信を中継しないようにすれば、外部のネット
ワークからルータを越えて直接内部のネットワークにアクセスすること
が不可能になります。同様に内部のネットワークからも直接外部にアク
セスすることができなくなりますが、ルータ自身は双方のネットワーク
にアクセス可能なので、内部からは一旦これを経由することで外部への
アクセスが可能になります。
当然外部からもこのルータを経由すれば内部へのアクセスが可能なの
で、ルータは不正侵入の矢面に立たされることになりますが、管理者は
不正侵入を防止するためにこのルータだけに注目していれば済むので、
セキュリティー監視の労力が大幅に軽減されます。
このような措置をとっても、電子メールやネットワークニュースのよ
うに「蓄積再送型」の通信では一旦ルータを経由させるような設定が容
易にできるので、使い勝手にはほとんど影響しません。しかし telnet や
ftp、それに WWW などは、先方との間で直接コネクションを張る必要
があるため、これらを利用するには利用者は一旦ルータにログインする
必要があり不便です。また外部へのアクセスを要求する利用者をすべて
ワークステーションルータに登録することは、手間がかかるだけでな
く、利用者数の増加によるセキュリティーの低下も引き起こします。
proxy (代理応答) はこれらのサービスにおいて、内部のネットワークの
利用者が透過的に firewall を経由して外部にアクセスできるようにする
ためのメカニズムです。
SOCKS
SOCKS はこの実装の一つで、ルータ上で通信を中継する sockd という
デーモンと、サービスを利用するクライアント (telnet コマンド等) が使
用しているソケットライブラリの代替ライブラリからなるパッケージで
す。クライアントのソースプログラムでソケットライブラリを呼び出し
ている部分を SOCKS のライブラリを呼び出すように書き換え、コンパ
イルして SOCKS に対応したクライアントを作ります。このクライアン
トは先方に直接接続するかわりにルータで稼働している sockd に依頼を
出し、sockd が代理で先方と接続して通信を中継してくれます。
HTTP proxy
CERN の httpd が実現している HTTP の
proxy 機能は次のようなものです。
proxy に対応したブラウザ (Mosaic-2.4 等)
は、proxy の設定がされていれば、与えられた URL に記述されたホスト
に直接接続するかわりに、proxy サーバに指定された httpd にアクセス方
法やホスト名を省略しない完全な URL をもったリクエストを送りま
す。httpd はブラウザから送られてきたリクエストの URL が完全なもの
なら、それに従って先方のサーバにリクエストを送り応答をブラウザに
中継します。
なお中継の際にデータを proxy サーバでも保存しておき、以後同じ
URL に対するリクエストがあったときには、先方に接続するかわりに保
存していたデータをブラウザに送り返すことによって、データのキャッ
シングを実現することもできます。これによってインターネット上のト
ラフィックを軽減することができるほか、利用者に対しても良好な応答
速度を実現することができます。
CERN の httpd 自身も proxy クライアントの機能を持ち、他の proxy
サーバに接続することができます。これによって、多段の proxy を構成
することができます。
DeleGate
DeleGate は日本の電総研の佐藤豊さんが開発した汎用のゲートウェイ
プログラムです。中継するデータの中に含まれる URL 等を
直接書き換えることによって、
SOCKS や HTTP proxy に対応していないクライアント
に対する中継機能を提供します。HTTP に限らず gopher や NNTP なども
中継できるほか、中継の際にデータのキャッシングや漢字コードの変換
を行うことができます。Macintos や Windows 用のブラウザのように特定
の漢字コードが扱えないクライアントを使用している場合に便利です。
もちろん HTTP proxy にも対応しています。
DeleGate で漢字コードの変換を行うには、例えば次のようにします。
delegated -P8090 PROXY=www.wakayama-u.ac.jp:80\
SERVER=http://www.wakayama-u.ac.jp\
CHARSET=SJIS
これを emily0 で動作させたとすると、HTTP proxy に未対応のクライ
アントでは直接この DeleGate に接続するだけで www.wakayama-u.ac.jp
のページを見ることができます。
Mosaic http://emily0.emily.eco.wakayama-u.ac.jp:8090
HTTP proxy に対応したクライアントでは、上の URL を http_proxy に
設定すればよいでしょう。
setenv http_proxy http://emily0.emily.eco.wakayama-u.ac.jp:8090
9.おわりに
WWW の流行でインターネットのトラフィックが 10% 増加したと言わ
れています。確かに、利用者がトラフィックを意識せずにオンデマンド
でマルチメディアデータがガンガン流してしまう状況は、そのうちイン
ターネットのトラフィックを危機的な状況に追い込む可能性がありま
す。しかし、記憶空間や通信回線の無駄遣いという意味では、ネット
ワークニュースの方により大きな問題があるように感じています。
和歌山大学の場合、購読しているカテゴリはそれほど多くないにもか
かわらず、現在1日あたり 150MB~200MB の記事が流入してきます。
この大半は読まれることなく捨てられています。64Kbps の回線は1日あ
たり最大でも 700MB 弱しか転送できませんから、他のサービスによる
トラフィックを考えると、これは結構危機的な状況なのではないかと感
じています。
また一方で、和歌山大学が購読していないカテゴリもたくさんありま
す。その中にもおもしろそうなものがあるので手を広げたい欲求はある
のですが、現状を考えるととてもその気にはなれません。
この無駄をどう考えるかは議論のあるところですが、少なくとも現在
の方式は、データ転送方式として UUCP を用いていたため記事を全部
バッチ式にコピーする必要があり、また記事の流量もそれが可能な程度
しかなかった頃に開発されたもので、インターネットで全世界が結ば
れ、記事の流量も膨大なものになってきた現在の状況に十分適応できて
いるかどうかは疑問です。
WWW の問題点はキャッシュや階層的なデータ管理の仕組みさえ整備
すれば解決可能なのではないかと思います。将来はこのような方式が
ニュースシステムにも適用されて、オンデマンドであらゆるニュースが
購読できるようになるかも知れません。