2002年12月3日 改定

WWWサーバ構築

WWWサーバとしてApacheは2002年現在、全世界の半数以上のサイトで採用されていると言われる代表的なWWWサーバです。
LinuxやFreeBSD、Windowsだけではなく、SunやIBMの汎用機でも動作するスケーラビリティを持っている上、いろいろの拡張モジュールが組み込めるといったフレキシビリティもある優れたソフトウェアです。
この優れたWWWサーバソフトもオープンソフトとして自由に利用することが可能なので、WWWサーバを立ち上げるならまず、このApacheから立ち上げてみましょう。
なお、説明を簡単にするため、以下で説明するFTPなどで入手するソースファイル等はすべてホームディレクトリ(~/)に保存するものとします。

1.Apacheの入手・コンパイル

Apacheは代表的なソフトウェアなので、多くのLinuxディストリビューションやFreeBSDで、標準的にパッケージされています。また、OSのインストール段階においても場合によってはApacheをインストールするか確認してくることでしょう。
勿論、これらのパッケージをインストールしても良いのですが、WWWサーバは比較的クラッカーの攻撃に遭いやすかったり、セキュリティホールが見つかったりするので、やはり最新のバージョンを使う方が良いでしょう。 
Apacheの最新バージョンは、日本語Apacheプロジェクト: http://www.apache.or.jp/ から入手できます。また、このサイトには多くの重要な情報があるので必ず一読してください。
2000/9/25現在の最新はApache 1.3.12 のようですので、これを例に以下、説明していきます。
なお、2002年12月3日現在Apache2.0.43を利用することも可能になっています。Apacheno2.x系を利用する場合は、以下の記述で"/usr/local/apache"の部分を"/usr/local/apache2"に読み替えてください。

入手した apache_1.3.12.tar.gz を解凍します。
  $ cd ~
  $ tar zxvf apache_1.3.12.tar.gz
すると apache_1.3.12 というディレクトリができるので
  $ cd ~/apache_1.3.12
としてディレクトリを移動後、
  $ ./configure
  $ make
  $ su
  rootのパスワード
  # make install
でインストールされます。
上記の方法でmakeすると、apacheの関連ファイルはすべて、/usr/local/apacheディレクトリ上に作成されます。
マニュアルはシェルの環境変数MANPATHで定義して置きましょう。利用するデフォルトのシェルがbashの場合には/etc/bashrcの中で、
    :
export MANPATH="/usr/man:/usr/local/apache/man"
    :
を追加してます。
また、起動時にapacheを自動的に起動するようにするには、

(Linuxのとき)
/etc/rc.d/init.d ディレクトリにhttpdというファイルを作成し、その中で以下のように記述します。
#!/bin/sh
# Start Apache Web Server
#
# chkconfig: - 85 15
# description: WWW server.
# processname: httpd
# pidfile: /usr/local/apache/logs/httpd.pid
# config: /usr/local/apache/conf/httpd.conf

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/apache/bin
export PATH

case "$1" in
start)
echo -n "Starting WWW server"
/usr/local/apache/bin/apachectl start
;;
stop)
echo -n "Stop Apache WWW server"
/usr/local/apache/bin/apachectl stop
;;
restart)
echo -n "Restart Apache WWW server"
/usr/local/apache/bin/apachectl stop
/usr/local/apache/bin/apachectl start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac

exit 0
としておきます。またこのファイルを作成後、
# chmod +x httpd
# chkconfig --add httpd

としてchkconfigを登録後、コマンドで「ntsysv」などからhttpdを実行できるようになります。ntsysvが使えない場合には、
# ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc0.d/K15httpd
# ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc1.d/K15httpd
# ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc2.d/K15httpd
# ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/S85httpd
# ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc5.d/S85httpd
とすれば良いでしょう。

2.Apacheの設定

Apacheのインストールが終了したなら、今度は設定ファイルを環境に合わせて設定します。環境ファイルは以下の場所に存在します。
ファイル名 目的
/usr/local/apache/conf/httpd.conf 重要な基本的な設定をします。
因みに、TurboLinuxでパッケージの中のApacheをインストールした場合には、/etc/httpd/confディレクトリに上記の設定ファイルがあったと思います。

2−1.httpd.confの設定

httpd.confには、Apacheの動作に必要な重要な幾つかの設定を行う必要があります。最低限、以下のパラメータを設定しましょう。
項目 内容
ServerAdmin user@domain Apacheに問題が発生した場合に連絡するメールアドレスを指定。また、このアドレスはユーザがアクセスした際のエラーページに表示される。
Port 80 WWWブラウザからアクセスさせる場合のポート番号。一般的なブラウザでは80を使ってアクセスするので、デフォルトの8080から80に変更するべし。(Default:8080)
DocumentRoot "/usr/local/apache/htdocs" httpドキュメントのトップページが置かれているディレクトリを指定します。
(Default:/usr/local/apache/htdocs)

2−2.認証

構築したWWWサーバで公開する情報の中には特定のユーザだけに公開したいページがあるケースがあります。このようなケースでは、公開するページを格納するディレクトリ単位に認証を求めるように設定することが可能です。

2-2-1.非公開ディレクトリの作成

最初に非公開にしたいページを格納するディレクトリを「DocumentRoot」以下のディレクトリに作成します。
  # mkdir /usr/local/apache/htdocs/secure

2-2-2.パスワードファイルの作成

apacheをインストールしたディレクトリの下のbin/ディレクトリにhtpasswdコマンドがあります。
  # htpasswd パスワードファイル名 ユーザID
   (ex. # htpasswd /usr/lcoal/apache/passwd user1)
で認証に使うユーザIDを登録します。このコマンドを入力することで指定したパスワードファイルにユーザIDが登録されます。コマンド入力後、このユーザIDのパスワードの入力が求められます。
もし、新規にパスワードファイルを作成する場合には、
  # htpasswd -c パスワードファイル名 ユーザID
と「-c」のオプションを付けてコマンドを実行してください。

2-2-3.httpd.confの確認

httpd.confの中に次の記述があるか確認して、ない場合には追加します。
AccessFileName .htaccess
AllowOverride All

2-2-4.保護ディレクトリの作成

保護するドキュメントディレクトリを、DocumentRootパラメータで指定したディレクトリ以下に作成します。
(例)
 # mkdir /usr/local/apache/htdocs/secure

2-2-5.保護ディレクトリの指定

作成した認証用ディレクトリを実際に認証させるために「httpd.conf」を編集して、次のような内容を追加します。
<Directory /usr/local/apache/htdocs/secure>
 Options Indexes
 AllowOverride none
 Order allow,deny
 Allow from all
 AuthType Basic
 AuthName ”SecurePage”
 AuthUserFile /usr/local/apache/passwd
 Require valid-user
</Directory>
※「allow from」において”allow from 192.168.0/0/255.255.0.0”とすると、指定されたネットワーク以外からはブラウズできなくなります。
以上の指定で、保護されたディレクトリをブラウザする際には認証画面が表示されるようになります。

2-2-6.認証エラーメッセージの変更

認証に失敗するとアクセスしてきたユーザには「Authentication Failed」のエラーメッセージが表示されますが、このメッセージも変更することが可能です。
ます、ドキュメントルート(/usr/local/apache/htdocs)にエラーメッセージのページを適当な名前(例. auth-error.html)で作成します。
次に2-2-5.で指定した保護ディレクトリの設定の中で、次の行を追加します。
ErrorDocument 401 /auth-error.html
このとき、指定のディレクトリはドキュメントルートをトップとした相対位置です。
以上までの設定で取り合えずApacheが動作するようになったと思います。以下の説明はApacheに暗号化モジュール(SSL)を組み込む方法について説明します。なお、SSLはCPUのパワーを必要とする処理なので、暗号が不要な場合(通常のWebサイト)には利用しない方が良いでしょう

3.ログ

Apacheのログファイルは、ソースファイルからコンパイルした場合、特に指定しない限り、/usr/local/apache/logs ディレクトリに作成されます。またRPM等のパッケージを使った場合には
ディストリビュート アクセスログ エラーログ
FreeBSD4.x(Ports) /var/log/httpd-access.log /var/log/httpd-error.log
TurboLinux6.x(RPM) /var/log/httpd/access_log /var/log/httpd/error_log
RedHat 6.x(RPM) /var/log/httpd/access_log /var/log/httpd/error_log

のように作成されます。
Apacheを起動するとログディレクトリには少なくても、「アクセスログ」と「エラーログ」ができる筈です。この内、エラーログにはApacheで発生したエラー情報が残りますので、Apacheを起動したが正常に起動できなかった場合などはこのログを確認します。
アクセスログには、クライアント(ブラウザ)からのアクセスに対する記録が残ります。
アクセスログに記録される形式は、「共通ログ形式(CLFCommon Log Format)」という形式で、次のような形式になっています。
 (共通ログ形式のフォーマット)
   Host Ident Authuser Date Request Status Byte
      Host : 訪問者のIPアドレスまたは完全ドメイン名
      Ident : クライアントについての識別情報(通常はセットされていない)
      Authuser : URLアクセス時に基本HTTP認証が必要だった訪問者のユーザ名
      Date : リクエストの日時 [日/月/年:時:分:秒 タイムゾーン]形式
      Request : 訪問者が要求したリクエスト("")で囲まれている
      Status : クライアントに送信されたステータスコード
      Byte : クライアントに送信されたファイルまたはオブジェクトのバイト数
   各項目の間はスペースで区切られています。

このログのフォーマットは、httpd.confにおいて、「LogFormat」タグで複数が定義されており、さらに 「CostomLog」タグにてどのフォーマットを使うかが指定されています。
通常はCLFを意味する”common”というフォーマットを使っている筈です。
サイトによっては、自分のサイトへのアクセスの記録として、リンクされたページから飛んできた場合にそのリンクをしているサイトの情報が欲しいことがあるでしょう。
その場合には、”common”の代わりに”combined”というフォーマット使うことで自分のページをリンクしているサイトの情報が入手できます。

LogFormatで定義する書式には以下のものが指定できます。
%a リクエストをしてきたクライアントのIPアドレス
%d 送信したバイト数(ヘッダー情報を含みます)
%{val}e 環境変数valの値
%f 要求されたページ
%h リクエストをしてきたクライアント名
%{IncomingHeader}i IncomingHeaderの内容
%I クライアントの識別情報
%{val}n
%{OutgoingHeader}o OutgoingHeaderの内容
%p サーバのポート番号
%P クライアントのポート番号
%r リクエストの最初の行
%s サーバが返したステータス番号
%t リクエストがあった時間
%T 応答に要した時間
%u 基本HTTP認証されたユーザ名
%U リクエストURL
%v リクエストの送信先のサーバ名
%V
アクセスログにはすべてのページ、オブジェクトに対するアクセスの記録が行われるので、このままでは管理し難いと考えられます。そこでアクセスログを見やすい形式に変換するために幾つかのツールを紹介します。
Analog : ケンブリッジ大学 Stephen Turner博士によるログアナライザ
Webalizer : HTTP(Apache)以外に、Squidのログ解析も可能な高性能ログアナライザ

関連リンク

日本語Apacheプロジェクト: http://www.apache.or.jp/
JAVA Apacheプロジェクト: http://java.apache.org/
ApacheのGUIツール関係: http://gui.apache.org/
Apache-SSLのページ: http://www.apache-ssl.org/
SSLに関する情報: http://www.asahi-net.or.jp/~AE5T-KSN/apache/SSL.html
インフォサイエンス(株)によるApache-SSL日本語サイト:http://japache.infoscience.co.jp/Apache-SSL/