サーバーリテラシ2005 - 第3回 Web サーバーのインストール

Webサーバ

Webサーバとは

Webサーバとはクライアントから要求を受け取り、インターネットを通じ、HTMLファイルや画像ファイルをクライアントコンピュータに配信するサーバです。
HTMLのような静的コンテンツだけでなく、CGIなど、クライアントから情報を受け取って処理して返すような動的なコンテンツも利用することができます。

Apacheとは

今回、WebサーバにApacheを使用します。Apacheは世界で共同開発されている、フリーのソフトウェアであり、現在世界で最も使われているWebサーバです。
中でも特筆すべき機能はモジュール機能です。様々なモジュールにより機能を追加したり削除したりすることができます。モジュールの追加方法は2つあり、一つははコンパイル時に組み込むモジュールを指定する方法、もう一方はDSO(Dynamic Shared Object)を使った方法です。DSOを使えばコンパイル後でもモジュールを組み込むことが可能となります。

Webサーバの構築

インストールの流れは次のようになります。
作業は全てrootで行います。

ソースコードのダウンロード
コンパイル(make)
設定ファイルの編集
起動確認
起動スクリプトの作成

インストールをするにはroot権限が必要となるのでまず、rootにユーザを変更します。

su -

最初に、Apacheのソースコードをダウンロードしてきます。
多くの場合、/usr/local/src/や自分のホームディレクトリに保存します。

cd /usr/local/src/
wget http://storage.cis.k.hosei.ac.jp/pub/apache/httpd/httpd-2.0.55.tar.gz

ダウンロードしたソースはtar.gz形式で圧縮されているので、tarコマンドを使用して解凍します。

tar zxf httpd-2.0.55.tar.gz

解凍したらまず、READMEファイルとINSTALLファイルに目を通します。

cd httpd-2.0.55
less README
less INSTALL

READMEにはソフトを使用する上での注意事項や説明が書いてあり、INSTALLにはインストール方法やインストールに必要となるツールが書かれています。

configure

次にconfigureを用いて、コンパイルするときのインストールオプションを設定します。
configureの引数に--helpを与えるとそのソフトウェアのconfigureにどのような設定項目があるか見ることができます。

./configure --help

今回は説明しやすいように受講者みなさんの環境を統一するので
こちらからオプションを指定します。

オプションの説明

--prefix="インストール先"

インストール先を指定します。

--enable-layout="config.layout"

インストールパスを指定するためのレイアウトを使用します。
レイアウトはconfig.layoutファイルに書いてあります。
レイアウトの詳細もconfig.layoutファイル内にあります。

--with-mpm=prefork

preforkというマルチプロセッシングモジュール(MPM)を有効にします。MPMは他にworkerなどがあります。詳しくはhttp://httpd.apache.org/docs-2.0/mpm.htmlを参照してください。

--enable-modules-shared=all

全てのモジュールをダイナミックロードできる形(DSO)でコンパイルとインクルードします。このあとに--disable-MODULEとして指定したモジュールは取り除くことができます。allのほかにmostやモジュール名を=の後に置く事ができます。

--disable-MODULE

コンパイルされてインストールされるモジュールを取り除きます。

--enable-so --enable-rule=SHARED_CORE

DSO(Dynamic Shared Object)を有効にするにはSOモジュール(mod_so)を組み込みます。

"./configure" \
"--prefix=/usr/local/httpd" \
"--enable-layout=Apache" \
"--with-mpm=prefork" \
"--enable-modules-shared=all" \
"--enable-so" \
"--enable-rule=SHARED_CORE" \
"--enable-deflate" \
"--enable-proxy" \
"--enable-suexec" \
"--with-suexec-caller=httpd" \
"--with-suexec-logfile=/var/log/httpd/suexec_log" \
"--with-suexec-docroot=/home" \
"--disable-asis" \
"--disable-auth_anon" \
"--disable-auth_dbm" \
"--disable-dav" \
"--disable-dav-fs" \
"--disable-imap" \
"--disable-status"

make

configureにて設定が終了したら、makeコマンドでコンパイルを行います。

make

install

いよいよインストールを行います。

make install

これで、Apacheのインストールが完了しました。

設定ファイルの変更

次にhttpdの設定を行います。
Apacheの設定ファイルは/usr/local/httpd/conf/以下にhttpd.confというファイルがあります。
設定ファイルを大きく変更する際はバックアップを取りましょう。
今回は最初のファイルのバックアップなのでファイル名.defaultと名づけましょう。
次回からバックアップを取るときはファイル名.bakなどとつけると良いでしょう。

cd /usr/local/httpd/conf/
cp httpd.conf httpd.conf.default

今回変更するところは以下の設定です。

ユーザとグループの設定

User nobody
↓
User httpd

Group #-1
↓
Group httpd

メールアドレスの設定

エラーページにここで設定したメールアドレスが表示されます。
サーバ管理者の連絡先メールアドレスを書きましょう。

ServerAdmin you@example.com
↓
ServerAdmin m04k00xx@cis.k.hosei.ac.jp

サーバネームの設定

使用するドメイン名を記入します。
今回はドメインを取得しないので、自分のIPアドレスを記入します。

#ServerName www.example.com:80
↓
ServerName 192.168.1.xx:80

ログの設定

多くのlogファイルは/var/log/以下に保存されます。
httpdのログファイルも/var/log/httpd/に書き出されるよう設定します。

ErrorLog logs/error_log
↓
ErrorLog /var/log/httpd/error_log

CustomLog logs/access_log common
↓
CustomLog /var/log/httpd/access_log common

設定ファイルの保存

設定ファイルは/etc/以下にまとめて管理されています。
そのため、/etc/httpd/ディレクトリを作成し、その中にhttpdの設定ファイルのシンボリックリンクを置いてあげましょう。

mkdir /etc/httpd
ln -s /usr/local/httpd/conf/httpd.conf /etc/httpd/httpd.conf

httpdを管理するユーザとグループを作成します。

groupadd -g 300 httpd
useradd -g httpd -u 300 -c "Apache Daemon User" -M httpd

httpdのログファイルの保存ディレクトリを作成します。

mkdir /var/log/httpd
chown httpd: /var/log/httpd

/usr/local/httpd/bin/にapachectlというhttpdの実行ファイルがあります。
オプションで引数にconfigtestを与えることでhttpd.confの設定ファイルのシンタックスチェックを行うことができます。

/usr/local/httpd/bin/apachectl configtest

エラーが起こらなければ、デーモンを開始します。

/usr/local/httpd/bin/apachectl start

これでWebサーバが動作します。
あとはドキュメントルート(デフォルトでは/usr/local/httpd/htdocs/)にファイルがあれば、表示させることができます。

テスト

HTML動作確認(静的なコンテンツ)

次にWebブラウザでテスト用のページを見てみます。
ドキュメントルートにテスト用のhtmlファイルが置いてあるので見ることができるかチェックしてみましょう。

http://自分のIPアドレス/

「あなたの予想に反して、このページが見えているでしょうか?」
というページが見ることが出来ましたか?
表示されない場合は、下のトラブルシューティングを参考に原因を探しましょう。

CGI動作確認(動的なコンテンツ)

htmlだけでなくCGIプログラムもテストしてみましょう。
まず、テスト用のファイルを用意しましょう。
CGIファイルを置く場所はデフォルトの場合、/usr/local/httpd/cgi-bin/です。

vi /usr/local/httpd/cgi-bin/test.cgi
テスト用プログラム
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print "$_=$ENV{$_}\n" for (keys %ENV);

cgiなので実行権限を持たせましょう。

chmod 755 /usr/local/httpd/cgi-bin/test.cgi

Webブラウザで作ったファイルを見てみましょう。

http://自分のIPアドレス/cgi-bin/test.cgi

下記のように表示されたら、成功です。表示されない場合は、下のトラブルシューティングを参考に原因を探しましょう。

SCRIPT_NAME=/cgi-bin/test.cgi
SERVER_NAME=133.25.236.120
SERVER_ADMIN=m0xk00xx@cis.k.hosei.ac.jp
HTTP_ACCEPT_ENCODING=deflate, gzip, x-gzip, identity, *;q=0
HTTP_CONNECTION=Keep-Alive, TE
REQUEST_METHOD=GET
HTTP_ACCEPT=text/html, application/xml;q=0.9, application/xhtml+xml, image/png, i mage/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
SCRIPT_FILENAME=/usr/local/httpd/cgi-bin/test.cgi
SERVER_SOFTWARE=Apache/2.0.55 (Unix)
HTTP_ACCEPT_CHARSET=shift_jis, utf-8, utf-16, iso-8859-1;q=0.6, *;q=0.1
HTTP_TE=deflate, gzip, chunked, identity, trailers
QUERY_STRING=
REMOTE_PORT=65365
HTTP_USER_AGENT=Opera/8.01 (Windows NT 5.1; U; ja)
SERVER_PORT=80
SERVER_SIGNATURE=<address>Apache/2.0.55 (Unix) Server at 133.25.236.120 Port 80</ address>

HTTP_ACCEPT_LANGUAGE=ja,en;q=0.9
REMOTE_ADDR=192.168.10.1
SERVER_PROTOCOL=HTTP/1.1
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin
REQUEST_URI=/cgi-bin/test.cgi
GATEWAY_INTERFACE=CGI/1.1
SERVER_ADDR=192.168.10.20
DOCUMENT_ROOT=/usr/local/httpd/htdocs
HTTP_HOST=133.25.236.120

トラブルシューティング

ここではWebページが表示されなかった場合への対処方法を載せています。
ブラウザのメッセージや/var/log/httpd/以下のログメッセージを頼りに問題点を特定しましょう。

ページを表示できません

ポート開放の設定が間違っているか、httpdが動作していない可能性があります。この場合、httpdにリクエストが届く前にパケットが殺されているので、Apacheのログには残りません。

ページが見つかりせん

404エラーです。アドレスが間違っている、もしくはファイルが存在していない可能性が高いです。

Forbidden

許可のないファイルにアクセスしています。この場合、Apacheのerror_log(/var/log/httpd/error_log)にエラーログが残ります。パーミッションがhttpdがアクセスできるようになっているか確認して下さい。

ログを見る

ログを見るには次のコマンドが便利だと思います。

tail -5 /var/log/httpd/access_log

tailはファイルの終わりの部分を表示します。今回はオプションで-5を渡しているので終わりの5行を表示します。新しいログはファイルの後ろに追加されるので、tail -5は最新の5つを表示することになります。

エラーログを見る

以下のエラーログはあくまで一例です。実際には環境等によってエラーメッセージは変わりますし、もしかしたら全く新しいエラーログが出ているかもしれません。そのような場合でもエラーメッセージをよく読み、何がエラーの原因なのか自分で考えるようにしましょう。

tail -5 /var/log/httpd/error_log
[Sat Jul 24 19:44:14 2004] [error] [client 192.168.1.2] (13)Permission denied: access to /~you/cgi-bin/index.cgi denied

このエラーの場合、you、cgi-binディレクトリまたはindex.cgiのうちのどれかがhttpdからアクセスできないようになっています。これらのパーミッションを調べてみてください。ここでのyou、cgi-bin、index.cgiなどは環境によって変わります。重要なのは(13)Permission denied: access toというエラーメッセージが多くの場合パーミッション設定のミスによって現れるということです。

起動スクリプトの作成

最後に起動スクリプト(/etc/rc.d/init.d/httpd)を作成します。
起動スクリプトを作成することにより、マシンを再起動するごとにApacheを起動しなくても自動で起動してくれるようになります。

たいていの場合、起動スクリプトは既に用意されています。Apacheの場はソースコードディレクトリのbuild/rpmの下にhttpd.initという名前で用意されています。

用意されている起動スクリプトを、他のデーモンの起動スクリプトが置いてあるディレクトリ(/etc/init.d)にコピーします。

cp /usr/local/src/httpd-2.0.55/build/rpm/httpd.init /etc/init.d/httpd

次に起動スクリプトを編集します。configureで変更したApacheのインストール先などを書き換えます。

vi /etc/init.d/httpd
変更するところとその変更後の値
apachectl=/usr/sbin/apachectl
↓
apachectl=/usr/local/httpd/bin/apachectl

httpd=${HTTPD-/usr/sbin/httpd}
↓
httpd=${HTTPD-/usr/local/httpd/bin/httpd}

CONFFILE=/etc/httpd/conf/httpd.conf
↓
CONFFILE=/etc/httpd/httpd.conf

書き換えが終了したら、起動スクリプトを使って再起動します。

/etc/init.d/httpd restart

エラーが出たらエラーメッセージをヒントに起動スクリプトを再編集します。

起動スクリプトを有効にするために、以下の2つのコマンドを実行します。

chkconfig --add httpd
chkconfig --level 345 httpd on

起動スクリプトが有効かどうか確認します。

chkconfig --list | grep httpd

以下のように表示されればOKです。

httpd           0:オフ  1:オフ  2:オフ  3:オン  4:オン  5:オン  6:オフ