Webサーバの概要


Webサーバの歴史

WWW(World Wide Web)とは、世界中に蜘蛛の巣(Web)状に広がるコンピュータネットワークを利用した情報提供システム の一つである。WWWでは文字情報ばかりでなく、イメージ、動画、音声なども使える。それどころか、WWWを通して商品を購入 したり、電話も無料でかけられる。

このようなWWWという情報伝達の仕組みは、1990年にCERN(ヨーロッパ原子核研究機関)で開発された。このCERNで開発された WWWを一般に広く普及させたのはイリノイ大学のNCSA(国立スーパコンピュータ応用センター)が発表したMosaicと呼ばれるブラウザである。CERNが開発したブラウザには無い特徴としてブラウザ内に画像を表示させること(インラインイメージ)が可能となった。

Webの3本柱

WWWを問題なく機能させるためには、

  1. 情報の記述方法(HTML:HyperText Markup Language)
  2. 情報がある場所の指定方法(URL:Uniform Resource Localtor)
  3. 情報の転送方法(HTTP:HyperText Transfer Protocol)

の3つが重要である。それで、以下に、HTML, URL , HTTPについて簡単に述べる。

HTML

HTMLというのは、Webページ(コンテンツとも言われる)を作るための書式である。我々がHPを見る場合 Webサーバにアップロードされたデータをブラウザソフト(インターネットエクスプローラなど)で表示させる が、HTMLというのはこのブラウザにデータを読み込ませ、表示させるための書式である。

なんの装飾もしていないテキスト文書に、この書式を付与することにより種々の効果が得られる。改行用、字を大きく 表示するためのもの、リンクをするためのもの、画像を表示するためのものなど多くの書式がある。「タグ」を使い表現 される。

例:

<html>
<head>
<title>HTML Sample</title>
</head>
<body>
This is a Simple HTML page.
</body>
</html>

URL

ネットワークを利用して相手のコンピュータと通信するためには、通信相手の場所を指定しなければならない。 電子メールで使われるメールアドレスは、ユーザ名とコンピュータの名前を「@」でつないだものとして表される(shino@yahoo.o.jpなど)。Webサーバも、Webページの置いてある場所を指定しなければいけない。このように、情報がある場所を指定するものをURL)Uniform Resource Locator)と呼ぶ。URLは以下の図のように表される。

図のなかで、スキームとは、httpの部分で、HTTPを使いWebのデータをやりとりすることを意味する。スキームには ftp,mailtoなどがある。ftpはファイルなどの送受信に使われ、maitoはメールで使われる。

ホスト名は、「star-platinum.dyndns.org」で、インターネットに接続されたコンピュータには、他のコンピュータと 区別するための名前が付けられる。ホスト名には

  • IPアドレス
  • ドメイン名
の表しかたがある。IPアドレスは、「127.0.0.1」のように、0から255までの数字を4セット使い、表される。 一方、ドメイン名は「star-platinum.dyndns.org」のようにアルハベットを用いて表される。技術的には、 IPアドレスを用いれば全世界のコンピュータを識別することが可能であるが、無意味な数字の羅列を人間が扱うのは 面倒なのでコンピュータはドメイン名という具体的な名前を持っている。

ドメイン名の後にある「80」はポート番号と呼ばれる。ネットワークに接続されたコンピュータ(サーバー)は、その1台で 様々なサービスを提供することができる。このサーバー内での、それぞれのサービスの受付窓口がポートである。このポート番号は サービスにより決められている。HTTPの場合は80番を利用することになっている。そして、ほとんどの場合Webサーバは80番を窓口 として利用するので、多くの場合、URLのこのポート番号は省略される。因みに、ファイル転送は21番が、メールでは、25番、110番が使われている。また、「https://」で始まるURLも見かけると思うがこれは、 Webページのデータを暗号化して送られるもので、443番が使われる。

ポート番号の次にある「/」より後の部分の「~shino-it/jp/sample1.html」をパスと呼ぶ。パスは「/」によって、 ディレクトリやフォルダと呼ばれる階層的な構造を表現することができる。CGIなどのページでは、URLが
http://www.abc.xyz/cg-bin/bbs.cgi?name=ZZZ
などのように、パスの後に「?」文字列が付くときがある。この場合、「name=ZZZ」はbbs.cgiというCGIプログラムに 受け渡され、処理される。

HTTP

Webサーバのクライアント(普通は、IEとかのWebブラウザ)からの 要求はHTTPによりWebサーバに伝えられる。通常は、これらのプロトコル を直接人間が手で操作する必要はないがWebサーバの設定を行う過程では確認の ため、TelnetコマンドでWebサーバに接続して直接、手で入力する。

HTTPの要求

プロトコルは、実際には比較的簡単である。クライアントから送られる 要求のおもなものは次の3個である。

・GET
・POST
.HEAD

例:

次の私のホームページをアクセスする。

http://star-platinum.dyndns.org/~shino-it/IT/sample1.html

クライアントから, telnet コマンドで以下のように入力する。
サーバへの要求
[root@localhost tp]# telnet star-platinum.dyndns.org 80
Trying 202.228.212.28...
Connected to star-platinum.dyndns.org (202.228.212.28).
Escape character is '^]'.
GET /IT/sample1.html HTTP/1.0
サーバからの応答
HTTP/1.1 200 OK
Date: Tue, 12 Jun 2007 12:25:35 GMT
Server: Apache
Last-Modified: Tue, 12 Jun 2007 12:24:55 GMT
ETag: "38854b-64-466e9097"
Accept-Ranges: bytes
Content-Length: 100
Connection: close
Content-Type: text/html

<html>
<head>
<title>HTML Sample</title>
</head>
<body>
This is a Simple HTML page.
</body>
</html>
Connection closed by foreign host.
[root@localhost tp]#

まず、こちらが送信した内容を見ていきます。そのまま日本語表現すると『/IT/sample1.htmlにあるファイルを下さい。なお、HTTP/1.1に準拠した形でお願いします。』という風になります。こちらが送信するべきことを全て記述したら必ず空行を送信します。これによってサーバが『クライアントの要求が終了した』と判断します。

次にヘッダ部分を見ていきましょう。ヘッダ一行目で ”200 OK” と書かれているのでこちらが要求したことが正しく処理された事を意味します。詳細は後述しますが、この200の部分はレスポンスコードと呼ばれ実際はこの部分だけであらゆる事が分かります。その後に ”XXX: YYY” という行が続きます。この部分はサーバによってまちまちで統一されていません。ほぼ確実に送信されているのがヘッダの最後にある "Content-Type: ~"という行です。これはこれから送信するファイルの形式を教えてくれています。ここでは "text/html" と書かれているのでその後に続くファイル(/IT/sample1.html)はHTMLであることが分かります。

最後に空行を挟んで書かれているのが /IT/sample1.html の中身です。ブラウザで見るのと違いタグがそのまま送信されるので読みにくいですね。

レスポンスコード

サーバ側から送信されるヘッダの一行目にかかれた3桁の数字がレスポンスコードです。この部分はRFCによって厳密に決められており、レスポンスコードを見ただけで要求が通ったか否か、失敗したとしたらその理由も分かります。

まず百の位をみるとおおまかな意味が分かります。100番台は通信エラー、200番台は正常終了、300番台はリダイレクト、400番台はクライアントエラー、500番台はサーバエラーを示します。良く見かけるレスポンスコードを書いておきます

レスポンスコード 意味 意味
200 OK 正常終了
403 Forbidden アクセス禁止
401 Unauthorized 未認証
404 Not Found ファイルが見つからない
415 Unsupported Media Type サポートされていないメディアタイプ
505 HTTP Version not supported サポートされていないバージョン

CGI

Webサーバは、通常は、ファイルとして保存されたHTMLデータやイメージデータを読み込み Webブラウザに返す。CGI(Common Gateway Interface)では、ファイルが読み込まれる代わりに プログラムが実行され、その実行結果がブラウザに返される。Gatewayとは、Webで使われているHTTPという プロトコルへの入口という意味である。プログラム実行結果は、普通は、HTMLに、することが多いがカウンター のようにイメージであることもある。

CGIはでは、プログラムを実行するのでセキュリティに細心の注意を払いながら利用する必要がある。CGIで実行 されるプログラムにバグがあると、重要なデータが盗まれることがある。

WebブラウザからWebサーバにデータを送る場合は、HTMLのフォーム(form)というタグを使い 以下のように記述する。

サーバへの要求

<form action="http://star-platinum.dyndns.org/cgi-bin/form.cgi" method="post">
<p>
名前:<input type="text" name="name"><br>
コメント:<input type="text" name="title"  size="50"><br>
<input type="submit" value=SEND"><input type="RESET">
</p>
</form>
表示例

お名前
コメント

<form>と</form>で括られた部分が1つのファームになる。<input>、<textarea>の部分がWebブラウザから送られるデータである。SENDボタンが押されると、WebブラウザはHTTPのGETメソッドを使い、 Webサーバにデータを送る。Webサーバはそれらを受け取ると指定されたプログラムを実行する。

「method」属性は送信方法を指定するもので、通常は GETという方法を使う。GETを使うと、ブラウザは http://www.shino-it.org/cgi-bin/enq.cgi?name=XXXXXXというURLを Webサーバに送信する。送信データが複数ある場合には?name=XXXXXX&title=YYYYYYYYY&comment=ZZZZZZZZZZというように&でつなぐ。ただし、GETを使うと、このURLがWebブラウザのアドレス欄に表示されたままになり、他のサイトを見てから「戻る」ボタン、「進む」ボタンを使うこともできる。そのため、パスワードなどの重要な情報を送るのには適さない。また、GETでは 送信できる文字数が制限されており、最大2084文字までである。

「method」属性に指定できるもう一つの送信方法は、POSTである。POSTを使うと、URLはhttp://www.shino-it.org/cgi-bin/enq.cgi、送信データはその後続いて送られるので、Webブラウザのアドレス欄に表示されるということはない。POSTは送信 データを表示したくない場合や、大きなデータを送るときに使われる。
郵便に例えると、GETはハガキのようなもので、情報は裸の状態である。POSTは封書のようなもので、宛先のURLがみられても 中身をみられることはない。

実行されるプログラムは、環境変数と標準入力(ともにプログラムにデータを与える方法の種類)からデータを受け取ることが できる。

環境変数とは?

環境変数には、WEBページに接続してきたユーザーの、ホスト名やOS・ブラウザの種類などがセットされています。 実行しているプログラム自身についての、便利な情報もあります。
普通、WEBサーバのOSやサーバソフトが、自動的にセットしてくれます。 そのおかげで、CGIプログラム側からは、特に何もしなくても利用することができます。
Perlでは、「%ENV」というハッシュを通じて参照できます。 例えばリンク元のURLを知りたければ、
my $ref_url = $ENV{'HTTP_REFERER'};
こんな感じで取得できます。

環境変数リスト

環境変数の主なキーには、以下のようなものがあります。

DOCUMENT_ROOT このサイトのルート(HOMEページ)の、サーバ上での場所。
例えば、「/home/www/public_html/」など。
GATEWAY_INTERFASE サーバが使用している、CGIのレビジョン。「CGI/1.1」など。
HTTP_ACCEPT 接続中のユーザ側で受け取ることができるMIMEタイプ(ファイル形式)。
HTTP_COOKIE Cookieとして保存されているデータ。
HTTP_REFERER このページが表示される直前のURL。
HTTP_USER_AGENT 接続中のユーザのOSとブラウザ。「Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)」など。
PATH_INFO エキストラパス情報。例えば「http://www.example.com/cgi-bin/example.cgi/extra/path」というURLで呼び出されたCGIなら、「/extra/path」がセットされています。
QUERY_STRING GET送信されたデータの内容。URLの後ろの「?」以降の部分です。
REMOTE_ADDR 接続中のユーザのIPアドレス。
REMOTE_HOST 接続中のユーザのホスト名。プロバイダ名などになりますが、取得できないことも多いです。
REMOTE_USER 接続中のユーザの認証名。BASIC認証を利用した場合などに利用。
REQUEST_METHOD 送られてきたリクエストのメソッド(種類)。「POST」「GET」など。
SCRIPT_FILENAME 実行中のプログラムの、サーバ上での場所と名前。「/home/www/public_html/cgi-bin/example.cgi」など。
SCRIPT_NAME 実行中のプログラムの、サイト上での場所と名前。「/cgi-bin/example.cgi」など。
SERVER_ADDR サーバのIPアドレス。「127.0.0.1」など。
SERVER_NAME サーバ名。「www.example.com」など。
SERVER_PORT ポート番号。「80」など。
SERVER_PROTOCOL プロトコルの名前とバージョン。「HTTP/1.1」など。
SERVER_SOFTWARE サーバソフトの名前とバージョン。「Apache/1.3.31 (Unix)」など。

#!/usr/local/bin/perl

# 環境変数の一覧を表示する

print <<EOM;
Content-type: text/html

<html>
<head><title>%ENV</title></head>
<body>
<h1>%ENV</h1>
<table border="1" cellpadding="5">
EOM

# ハッシュのキーの昇順で環境変数を出力
foreach my $key ( sort keys %ENV ) {
  print "<tr><td>$key</td><td>$ENV{$key}</td></tr>";
}

print <<EOM;
</table>
</body>
</html>
EOM

exit;

たとえば、私のPC上の「apache」での実行結果は、以下のような感じでした。

%ENV

DOCUMENT_ROOT/var/www/html
GATEWAY_INTERFACECGI/1.1
HTTP_ACCEPTtext/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
HTTP_ACCEPT_CHARSETShift_JIS,utf-8;q=0.7,*;q=0.7
HTTP_ACCEPT_ENCODINGgzip,deflate
HTTP_ACCEPT_LANGUAGEja,en-us;q=0.7,en;q=0.3
HTTP_CONNECTIONkeep-alive
HTTP_HOSTlocalhost
HTTP_KEEP_ALIVE300
HTTP_USER_AGENTMozilla/5.0 (X11; U; Linux i686; ja; rv:1.8.0.1) Gecko/20060313 Fedora/1.5.0.1-9 Firefox/1.5.0.1 pango-text
PATH/sbin:/usr/sbin:/bin:/usr/bin
QUERY_STRING
REMOTE_ADDR127.0.0.1
REMOTE_PORT51619
REQUEST_METHODGET
REQUEST_URI/cgi-bin/kankyo.cgi
SCRIPT_FILENAME/var/www/cgi-bin/kankyo.cgi
SCRIPT_NAME/cgi-bin/kankyo.cgi
SERVER_ADDR127.0.0.1
SERVER_ADMINroot@localhost
SERVER_NAMElocalhost
SERVER_PORT80
SERVER_PROTOCOLHTTP/1.1
SERVER_SIGNATURE
Apache/2.2.0 (Fedora) Server at localhost Port 80
SERVER_SOFTWAREApache/2.2.0 (Fedora)

アクセス制御

Webはもともと多数の人にメッセージを伝えるための仕組みですが、あるページは特定の人(同じ部署など)だけにしか 見えないように設定することもできる。

Webページのアクセス制御は、次のようなデータが使われる。

  • クライアントが動作しているホストのIPアドレス
  • ユーザ名とパスワード

◇IPアドレスによるアクセス制御

認証用の「.htaccess(ドットエイチティ・アクセス)ファイル」の作成(Apache HTTP Serverを始めとするウェブサーバで、外部からのアクセスをディレクトリ単位で制御するためのファイル)。

.htaccess:
order deny,allow
deny from all
allow from 192.168.1.0/24
上記は、ローカルホスト(192.168.1.X)からのみのアクセスを許す設定である。

◇パスワードによるアクセス制御

パスワードによるユーザー認証は、

    * 認証が定義された .htaccess ファイル
    * ユーザと暗号化されたパスワードが記録されている .htpasswd ファイル 

この 2 ファイルだけで実現できます。

まず、パスワード認証をかけたいディレクトリに、次の内容の .htaccess ファイルを作成します。
# パスワード認証
AuthUserFile /home/httpd/vhosts/shino-it.org/httpdocs/exp/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter username and password"
AuthType Basic
require valid-user
次に、telnet 等の端末から、AuthUserFile で指定したパスまで実際に移動した後、htpasswd コマンドを使ってパスワードファイル .htpasswd を作成します。コマンドラインから次のように叩いてください。ここでは、ユーザ名:guest、パスワード名:guestにする例を示します。
% htpasswd -c .htpasswd guest
Adding user guest
New password: guest           (←実際には表示されません)
Re-type new password: guest   (←実際には表示されません)
これで、ユーザ/パスワード対が .htpasswd ファイルに登録されました。htpasswd コマンドの -c オプションは、.htpasswd ファイルを新規作成するためのものです。2 回めからは不要です。htpasswd コマンドを繰り返すことによって、ユーザを追加できます。 できた .htpasswd ファイルの中身は、「ユーザ名:暗号化されたパスワード」のように保存されています。次の例は、一般的な Unix 標準 の DES 暗号化手法を用いたパスワードファイルです。 guest:68E3RJk2UWcR6 tama:9if0d57366sER