WWWサーバの構築
WWWサーバは、Windows時代から使用していて設定がわかっているRedHatプレインストールのApacheを使用しました。RedHatインストール時にperlもいっしょにインストールされるので、httpd.confを設定すれば即動くと考えたのが、にわかLinuxerの浅はかさ。おやじのコンテンツが表示されない、CGIが動かないと右往左往でした。内容については、
おまけで。
本コンテンツは、2.0系が出始めたころに作成したため、ソースからインストールしていますが、最近のデストリでは2.0系が標準になってきているので、そのまま利用すればよいかと思います。こちらでは設定の考え方を参考にしてください。
但し、プレインストールのApacheはSuEXEC対応になっていることが多いので、他に誤りがないと思われるのにCGIがうまく動作しないことがあります。その場合は、、
こちらを参考にしてSuEXECのまま設定していくか、取り敢えずSuEXECをやめて設定するか検討してください。初めてApacheを動かされるなら取り敢えずSuEXECを停止して動作させ、その後にSuEXEC化されてはどうでしょうか?
RedHat9.0でApache2.0.46をソースからコンパイルすると、makeでkerberos関係のエラーが出るので、回避策を追加しました。(2003.06.25)
■Apache (httpd.conf) の設定
Apache2.0.46を
こちらからダウンロードします。
インストールは、任意の場所にソースを展開してコンパイルします。Apache2.0は、デフォルトで全てのファイルが
/usr/local/apache2/ 以下にインストールされますので、RedHat標準のApacheを保持したままインストール・実行できます。従って、何かあった時のためにも、デフォルトでインストールしました。また、Apache2.0は、Web/DAVが使えるようなので、取り敢えずインストールしておきました。但し、Apacheでの認証方法のことを勉強しないとセキュリティを保てないので、環境設定をしないで動かないようにしてあります。Web/DAVを使用する予定がないなら、素直にオプションなしで
./configure とすればいいでしょう。
RedHat系の場合、opensslがKerberosサポートの状態でコンパイルされていて、また、kerberosのヘッダが何故か/usr/kerberos/includeにあるため
make でエラーが発生します。下記の赤字のように、明示してあげて下さい。
$ tar zxfv httpd-2.0.46.tar.gz
$ cd httpd-2.0.46
$ export CPPFLAGS=-I/usr/kerberos/include ※
$ ./configure --enable-dav
$ make
$ su
# make install
|
設定は、おやじが使っている範囲内なら1.3と全く同じ設定で何ら問題なく動作しました。但し、細部が変わっていますので、1.3のhttpd.confをコピーするわけにはいきません。設定し直しが必要です。主な変更点は、Server
Typeの指定はなくなり、デーモン起動のみになったこと。(1.3のデフォルトはstandaloneなので、inetd起動に変更していなければ関係ない。) その他にも変更がありますが、おやじはよくわかりません。また、全てのファイルが/usr/local/apache2/
配下にあるので、logファイル等の指定が相対表現に変わっています。また、何か問題があれば、/usr/local/apache2/
以下を消すだけでアンインストールできますので、むやみにインストール場所は変更しないほうがいいと思います。
当然ですが、2.0を起動する前にデフォルトのデーモンを止めることを忘れずに。逆に、デフォルトのデーモンとカブルところが無いので、同時に起動することもできます。取り敢えず試験をするなら、ポート番号を例えば8080(proxyで使ってなければ)等にしておけば、同時起動できますので十分試験したあとで移行できます。
Apacheの設定は、/usr/local/apache2/conf/にあるhttpd.confをエディタで修正します。プロ?
はコマンドラインからviでやるようですが、素人おやじはエディタでできるものはエディタでやっています。ディレクトリの構成等は、Windows版と全く同じ構成で、ルートディレクトリ配下に各人のユーザディレクトリを置く構造(http://www.aconus.com/~oyaji/といった形式でのアクセス)です。
http://www.aconus.com/でのアクセスなら、/home以下にコンテンツを置けばいい設定になっています。
設定を変更した項目は以下のとおりです。変更する場合は、失敗に備えて変更行を下の行にコピーし、元の行の先頭に「#」を付加することにより、コメント行として保存しながら作業しました。 (青字は削除、赤字は追加、緑字は変更したものです。)
基本的には、Windows版と同様です。
- Apacheを実行するグループの変更
#User nobody
#Group #-1
↓削除、追加
User nobody
Group nobody
- サーバ管理者のメールアドレスの設定
#ServerAdmin root@localhost
↓追加
#ServerAdmin root@localhost
ServerAdmin oyaji@mail.aconus.com
- サーバ名称の設定
#ServerName localhost
↓追加
#ServerName localhost
ServerName www.aconus.com
- ドキュメントルートの変更
DocumentRoot "/var/www/html"
↓追加
#DocumentRoot "/var/www/html"
DocumentRoot "/home"
- ディレクトリアクセス時に検索するファイル名の追加
ディレクトリアクセス時(http://www.aconus.com/~oyaji/のように/で終わっていたり、ディレクトリで終わっているようなアクセスの時)、ApacheはDirectoryIndexで指定されているファイルがそのディレクトリ配下にないか、左側のファイル名から順番に探しにいき、存在すればそのファイルを返送する。
おやじは、index.htmを基本にしているのと、SquirrelMailでindex.phpがデフォルトのファイルになっているので、それを追加した。検索は左優先なのでどのように並べるかはそれぞれの環境に依存する。
DirectoryIndex index.html index.html.var
↓追加
DirectoryIndex index.html index.htm index.html.var index.php
- ドキュメントルートでのCGI/SSIの実行権付与とインデックスリストの非表示
Indexesがあると、ドキュメントルートにindex.html等のDirectoryIndexで指定したファイルがないと、インデックスリストが表示されてしまう。
Options Indexes FollowSymLinks
↓削除、追加
Options FollowSymLinks Includes ExecCGI MultiViews
- ユーザディレクトリの変更(不要と思うが、過去うまく動かなかったことがあったので、絶対パスに変更)
UserDir public_html
↓追加
#UserDir public_html
UserDir /home/*/public_html
- ユーザディレクトリの有効化と配下でのCGI/SSIの実行権付与とインデックスリストの非表示
<Limit> ディレクティブは、アクセス制御の範囲を 指定された HTTP メソッドに限定するもので、それ以外のメソッドは、影響を受けない。つまり、下記では、GET
POST OPTIONS PROPFIND のメソッドに対してのみアクセスの制御を行ない(ここではアクセス許可)、
それ以外のメソッドについてはアクセス制御がかからない。
<LimitExcept> は、<Limit> セクションの反対の動作をし、 標準のメソッドと標準外や未認識のメソッドの場合の両方を設定できる。下記では、GET
POST OPTIONS PROPFIND のメソッド以外のアクセス制御が行われ、ここでの設定では不許可になる。<LimitExcept>は未設定のメソッド全てに制御がかかるので、こちらで設定したほうが確実である。
#<Directory /home/*/public_html>
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
# <LimitExcept GET POST OPTIONS PROPFIND>
# Order deny,allow
# Deny from all
# </LimitExcept>
#</Directory>
#
↓削除(コメントアウトを外す)/追加
<Directory /home/*/public_html>
AllowOverride FileInfo AuthConfig Limit
Options MultiViews SymLinksIfOwnerMatch ExecCGI IncludesNoExec
# <Limit GET POST OPTIONS PROPFIND>
# Order allow,deny
# Allow from all
# </Limit>
<LimitExcept GET POST OPTIONS PROPFIND>
Order deny,allow
Deny from all
</LimitExcept>
</Directory>
- ホストネームでのログ収集
#HostnameLookups Off
HostnameLookups On
この機能を使うと、DNSの逆牽きで負荷が重くなるが、アクセスがまだまだ少ないのとホストネームのほうが常連さんならすぐにわかるため、あえて使用しています。ただ、逆牽き設定をしていないDNSや設定が誤っているDNSが多くエラーログがかなり出てしまいます。(BINDの設定でログらないようにしています。)
- 家庭内からのアクセス、worm等のlog分離
#CustomLog logs/access_log common
SetEnvIf Remote_Addr 192.168.1. homelog nolog
SetEnvIf Request_URI "~akirin" akirinlog nolog
SetEnvIf Request_URI "default.ida" wormlog nolog
SetEnvIf Request_URI "root.exe" wormlog nolog
SetEnvIf Request_URI "cmd.exe" wormlog nolog
SetEnvIf Request_URI "Admin.dll" wormlog nolog
CustomLog logs/home_log common env=homelog
CustomLog logs/akirin_log combined env=akirinlog
CustomLog logs/worm_log common env=wormlog
CustomLog logs/access_log combined env=!nolog
・1行目のCustomLog logs/access_log common をコメントアウトし、以下を記述。
・2/8行目で、家庭内からのアクセスをhome_logに採取。不要ならコメントアウト。
・3/9行目で、娘のサイトへのアクセスをakirin_logに採取。common -> combinedとしてreferrerを採取。
・4行目でCodeRed、5〜7行目でNimudaからアタックを識別し、10行目でworm_logに採取。不要ならコメントアウト。
・11行目で残りのアクセスをaccess_logに採取。common -> combinedとしてreferrerを採取。おやじのサイトへのアクセスは、ここに含まれる。
- 日本語表示の設定(ブラウザのエンコード自動選択時の文字化け対策: 1個所)
下記の設定をした場合は、ドキュメントで必ずcharsetを指定しないと文字化けする。おやじのコンテンツには、EUC-JPとshift-jisの両方があるためこのようにして(AddDefaultCharset
Offとしても良い)、ドキュメントに依存して表示させている。そのため、一部のCGI等も改造しているので注意が必要である。shift-jisのコンテンツしかないなら、
AddDefaultCharset shift_jis
とすれば良い。
LanguagePriority は、MultiViews 環境でブラウザが言語の優先順位を提供してない場合の優先度を指定するもので、通常はコンテンツも対応していないので変更不要。
LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv tw
↓移動
LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw
AddDefaultCharset ISO-8859-1
↓追加(コメントアウト)
#AddDefaultCharset ISO-8859-1
- CGIファイル拡張子の定義
#AddHandler cgi-script .cgi
↓削除(コメントアウトを外す)、追加
AddHandler cgi-script .cgi
AddHandler cgi-script .pl
■Apacheの起動設定
自動起動は、rc.localに起動スクリプト(/usr/local/apache2/bin/apachectl start)と書くだけでも可能ですが、SSL化を機会に、/etc/rc.d/init.d/配下に起動スクリプトを置いて、自動起動できるようにしましたので、SSL化しない場合での方法を以下に示します。起動スクリプトは、下記内容をhttpd2として記述し、/etc/rc.d/init.d/配下に置きます。
apachectlで起動すると起動はするがエラーが出るので、RedHatの起動スクリプト(/etc/rc.d/init.d/httpd)をベースに修正し、/etc/rc.d/init.d/httpd2として置きました。(2003.06.28)
#!/bin/sh
#
# Startup script for the Apache Web Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server. It is used to serve \
# HTML files and CGI.
# processname: httpd
# pidfile: /usr/local/apache2/logs/httpd.pid
# config: /usr/local/apache2/conf/httpd.conf
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/httpd ]; then
. /etc/sysconfig/httpd
fi
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache2/bin/apachectl
httpd=/usr/local/apache2/bin/httpd
prog=httpd
RETVAL=0
# check for 1.3 configuration
check13 () {
CONFFILE=/etc/httpd/conf/httpd.conf
GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|"
GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|"
GONE="${GONE}AccessConfig|ResourceConfig)"
if grep -Eiq "^[[:space:]]*($GONE)" $CONFFILE; then
echo
echo 1>&2 " Apache 1.3 configuration directives found"
echo 1>&2 " please read /usr/share/doc/httpd-2.0.40/migration.ht
ml"
failure "Apache 1.3 config directives test"
echo
exit 1
fi
}
# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure. So we just do it the way init scripts
# are expected to behave here.
start() {
echo -n $"Starting $prog: "
check13 || exit 1
daemon $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /usr/local/apache2/logs/accept.lock
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
killproc $httpd
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /usr/local/apache2/logs/accept.lock /usr/local/
apache2/logs/httpd.pid
}
reload() {
echo -n $"Reloading $prog: "
check13 || exit 1
killproc $httpd -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart)
if [ -f /usr/local/apache2/logs/httpd.pid ] ; then
stop
start
fi
;;
reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullst
atus|graceful|help|configtest}"
exit 1
esac
exit $RETVAL
|
作成したhttpd2ファイルに実行権限を付加し、ランレベルを設定した後、ランレベルが設定されたことを確認します。
# cd /etc/rc.d/init.d
# chmod 755 httpd2
# /sbin/chkconfig --add httpd2
# /sbin/chkconfig --list httpd2
httpd 0:オフ 1:オフ 2:オン 3:オン 4:オン 5:オン 6:オフ
|
これで、システム起動時に自動的にApacheが起動されるようになります。rc.localで自動起動していた場合には、消去するのを忘れないように。
■logrotateの設定
/etc/logrotate.d配下にあるapacheを参考に作成するだけで、他のlog同様、1週間毎にlogrotateされます。修正する個所は、パスの設定とlogファイル名だけで、修正後にapache2として同じフォルダに登録しておきます。apache2の内容は下記のとおりです。(
青字は削除、
赤字は追加、
緑字は変更したものです。行頭の数字は説明上、おやじが付加したものです。)
1. /var/log/httpd/access_log /var/log/httpd/agent_log /var/log/httpd/error_log
/var/log/httpd/referer_log {
2. missingok
3. sharedscripts
4. postrotate
5. /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true
6. endscript
7. }
↓削除、追加
1. /usr/local/apache2/logs/*_log {
2. missingok
3. sharedscripts
4. postrotate
5. /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
6. endscript
7. } |
- 1行目: logファイル名が全てxxx_logなので、/usr/local/apache2/logs/*_logで記述。
- 2行目: ログファイルが無くとも、処理を正常終了させる。
- 3行目: 1行目で複数指定されたlogファイルに対し、postrotate以降設定されたコマンドを実行する。
- 4行目: このコマンドの後に、logファイルのローテーション後に実行するコマンドを記述する。
- 5行目: logファイルのローテーション後、apacheサーバにハングアップシグナル(HUP)を送り、再起動させるためのもの。これにより、apacheが新たなlogファイルにログを出力するようになる。
- 6行目: postrotateの終端を示す。
テストページがあっさりと見えたので、さっそくコンテンツを /home/oyaji/public_html
配下に置き表示してみましたが、見えません。原因は、管理がルーズなWindowsとしっかり管理されているLinuxの違いでした。
- 落とし穴1: パーミッションの設定ミス。
テストページが見えるのに、ユーザページが見えないのは、httpd.confの設定ミスかと疑い見てみると、しっかりコメントに書いてあるではないですか。ユーザドキュメントディレクトリのパーミッションは”711”に、public_htmlディレクトリのパーミッションは”755”にしなさいと。設定を変更すると、あっさり表示されました。
しかし、カウンタが表示されません。掲示板はエラーになってしまいます。何故?
無い知恵を絞り、インターネットを検索して得た結果、更なる落とし穴が2点ありました。
- 落とし穴2: Perlのインストールパスが違っていた。
Windows版は、一般に提供されているCGIスクリプトの多くが、下記のようにPerlへのパスを指定しているため、これに併せてインストールしました。
・ #!/usr/local/bin/perl
RedHatでは、デフォルトで /usr/bin/perl にインストールされており、Windows版のように意識してインストールした訳ではなかったため、気がつくのに時間がかかりました。CGIスクリプトのPerlへのパスを変更しましたが、まだ動きません。
- 落とし穴3: 改行コードが違っていた。
Windowsの改行コードは 、「CR+LF」。これに対してLinuxの改行コードは、「LF」。たったこれだけですが、CGIは動いてくれません。おやじパソコンのエディタのデフォルトの改行コードを変更して、CGIスクリプトをダミー更新すると、やっとカウンタや掲示板が見えるようになりました。
なお、FTPクライアントによっては、アップロード時にファイルの拡張子毎にパーミッションを設定できますので、設定して置くといいでしょう。Windowsのときは、関係無かったのでおやじは設定していませんでした。後で一つ一つ変更して、この機能に気がつくまで大変でした。
Top Pageへ