web サーバーの設定 (apache)
Vine Linux 4.0
Jan. 27 2007
Vine Linux 4.0 から Webサーバーが apache2 になった。今までの apache1.x の設定ファイルはそのままでは使用できない。また、設定ファイルの httpd.conf やドキュメントルートなどの場所も変更になっているので注意が必要。もっとも httpd.conf 内で各種ファイルの場所を apache1.x と同じくするという方法もある。しかし、今後のことも考えて apache2 の標準に沿って設定しておくことにする。
設定ファイル /etc/apache2/conf/httpd.conf の次の部分を変更しておく。
# vi /etc/apache2/conf/httpd.conf
ServerTokens OS
クライアントに送り返す Server 応答ヘッダ内に、サーバの一般的な OS 種別や、 コンパイルされて組み込まれているモジュールの情報を 含めるかどうかを指定する。
クライアントに返すサーバー情報。Apache のHTTPレスポンスヘッダ。
あまり詳しい情報を返すと、それを手がかりにサーバーの脆弱性を調べ攻撃を仕掛けられる可能性があるので、これらを表示させないように ServerTokens の指定を変更する。引数は次のとおり。
一番秘匿性の高い ProductOnly を指定する。
Full( or 未指定) Apache の詳細なバージョン、OS名及びモジュール
OS Apache のバージョンとOS名
Major Apache のメジャーバージョン
Minor Apache のマイナーバージョンまで
Minimal(Min) Apache の詳細なバージョン
ProductOnly 製品名のみ(Apache)
ServerTokens OS
↓
ServerTokens ProductOnly
ExtendedStatus On
各リクエストに対して拡張ステータス情報を保存する。
Apache には、稼働状況を表示してくれる機能があるので、これを有効にする。
httpd.conf の ExtendedStatus On のコメントアウトを外し、次の行を追加する。
ExtendedStatus On
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 10.99.1
</Location>
全てのアクセスを禁止して、LAN ネットワーク内のみのアクセスを許可する。
daemon の再起動後、ブラウザで http://www.sleepingbird.net/server-status に接続すれば稼働状況が確認できるようになる。
ServerName
サーバが自分自身を示すリクエストスキームとホスト名とポートを設定する。
ServerName www.example.com:80
↓
ServerName www.qcp.jp:80
UseCanonicalName
URLの最後の “/” が省略されたとき、それを補完する。
個人的には URL の最後の “/” は厳密に使用して欲しいが、ほとんどの人はいい加減に使用しているので、救済のため On にしておく。
UseCanonicalName Off
↓
UseCanonicalName On
DocumentRoot
公開する ウエブページ (Documen) の基点 (Root) となるディレクトリ。
WEB で公開するトップディレクトリを指定する。通常はそのままでよいが、バーチャルホストを複数設定するのでホスト名に合わせて管理できるように変更した。
DocumentRoot /var/www/html
↓
DocumentRoot /var/www/qcp
アクセスされたディレクトリに index.html が無いとディレクトリが丸見えになってしまうので、これを防ぐ。 Options から Indexes を削除する。
また、ディレクトリ指定も DocumentRoot と整合させておく。
#<Directory “/var/www/html”>
<Directory /var/www/qcp>
# Options Indexes FollowSymLinks
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
DocumentRoot ディレクトリを作成し、リモートから ftp 転送できるように所有者を変更する。
# mkdir /var/www/qcp
# chown -R 所有者名 /var/www/qcp
DirectoryIndex
クライアントが、ディレクトリ名の最後に「/」 を指定してディレクトリインデックスを要求する場合に探すリソースのリスト。
リストに記載された順にディレクトリ内を探査し、レスポンスを返す。
DirectoryIndex index.html index.html.var
↓
DirectoryIndex index.html index.htm index.shtml index.php index.php4 index.php3 index.cgi
ServerSignature
サーバが生成するドキュメント の最下行に付与するフッタの設定を行なう。
エラーページを表示する際にもバージョンが表示されるので、これも抑止するために ServerSignature を Off にする。
ServerSignature On
↓
ServerSignature Off
サーバーブート時の自動起動の設定を行う。
# chkconfig apache2 on
ネットに接続して、外部からアクセス可能になっているか調べるには、次のサイトを利用する。
* WWWサーバテスト(パソコンおやじ)
* Free webmaster test tools(WebSitePulse.com)
* サーバーメンテナンス支援【無料】
| 覚え書き : Web server | Permalink
SSI/CGI の起動
/etc/httpd/conf/httpd.conf を編集する。このうち、Options ディレクティブの ExecCGI が CGI 起動の許可部分。Include が SSI の許可部分。
# vi /etc/httpd/conf/httpd.conf
以下のコメントをはずす
#<Directory /home/httpd/cgi-bin>
# AllowOverride None
# Options ExecCGI Includes
# Order allow,deny
# Allow from all
#</Directory>
CGIが実行可能な拡張子の設定。コメントをはずし「.pl」も加えておく
# AddHandler: allows you to map certain file extensions to “handlers”,
AddHandler cgi-script .cgi .pl
SSI を起動させるには二つの方法がある。一つは拡張子に実行属性を付与する方法。SSI を起動したいファイルの拡張子を .shtml に変更する必要がある。(デフォルト)
AddType text/html .shtml
AddHandler server-parsed .shtml
もう一つが、全ファイルで起動可能に設定し、実際に起動したいコードが埋め込まれたファイルに実行属性を与える方法。ただし、サーバーのオーバーヘッドが大きくなり負荷が増大するので実用的ではない。
XBitHack on
All MultiViews以外のすべての指定を有効にする
ExecCGI CGIの実行を許可する
FollowSymLinks シンボリックリンクを許可する
SymLinksIfOwnerMatch ファイルとディレクトリがリンクされている場合、ユーザIDが同一の場合のみシンボリックリンクを許可する
Includes SSI(Server Side Include)を許可する
IncludesNOEXEC SSI自体は許可するが「#exe」(コマンド実行)とCGIスクリプトの「#include」は許可しない
Indexes リクエストされたディレクトリにDirectoryIndex(index.htmlなど)が存在しない場合、ディレクトリ下のファイルを一覧表示する
MultiViews 言語対応機能の許可
| 覚え書き : Web server | Permalink
CGI ディレクトリ
インストール直後、apache 用のホームディレクトリには、 cgi-bin ディレクトリが生成されているが、このディレクトリはデフォルトでエイリアスされており、各ユーザーがアクセス可能になっている。
# cat /etc/httpd/conf/httpd.conf
ScriptAlias /cgi-bin/ /home/httpd/cgi-bin/
| 覚え書き : Web server | Permalink
CGI エラー
CGI が思ったように起動できない場合、次の点を確認する。
1. 各ファイルのパーミッションは正しく設定されているか。
2. perl へのパスは正しいか。
なお、/etc/httpd/logs/err_log を確認し、次のエラーが表示された場合は、上記2の誤りか、またはスクリプトの中に MS-Windows の改行コードが混入している可能性がある。
エラーの意味としては、ファイルまたはディレクトリが見つからないということだが、後者の場合にもこのメッセージが出力され、戸惑うことがある。
[Thu May 15 20:16:02 2003] [error] (2)No such file or directory:
exec of /home/httpd/cgi-bin/********.cgi failed
[Thu May 15 20:16:02 2003] [error] [client ***.***.***.***] Prem
ature end of script headers: /home/httpd/cgi-bin/********.cgi
↑ 実際は2行
次のコマンドによりスクリプトファイルから余計なコードを除去する。元のファイルは拡張子 .old が付加されて保存され、除去後のファイルが生成される。
$ perl -i.old -npe ’s/\r\n/\n/’ ファイル名
| 覚え書き : Web server | Permalink
ユーザーページの公開
各ユーザーにホームページを公開させたい場合は、 httpd.conf から次のコメントをはずす。各ユーザーのホームディレクトリ直下の public_html ディレクトリ下が公開される。
#<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>
# <Limit PUT DELETE PATCH PROPPATCH MKCOL COPY MOVE LOCK UNLOCK>
# Order deny,allow
# Deny from all
# </Limit>
#</Directory>
ユーザーディレクトリと public_html のパーミッションを変更する。
$ cd
$ chmod 711 ../ユーザディレクトリ
$ mkdir public_html
$ chmod 755 public_html
| 覚え書き : Web server | Permalink
エラーページのカスタマイズ
リクエストされたページが移動あるいは削除されていた場合、「404 NotFound」と表示されるが、このページをカスタマイズしたい場合は任意のファイルを用意し httpd.conf に次の行を追加する。なお、ファイル名は絶対パスで記述する。また、任意に用意したファイルの中で使用する画像およびファイルのリンク先についても絶対パスで指定する必要がある。他のエラーについても同様に設定できる。403,404,500 あたりを用意しておけば当面大丈夫。502 を用意しておけば夢が見られる!?
なお、Virtual Host についてもそれぞれに定義しておく。
# vi /etc/httpd/conf/httpd.conf
ErrorDocument 404 /404.html
Result コード 解 説
200 OK アクセス成功
201 Created POSTが成功
202 Accepted アクセス中(処理中)
203 Partial Information 注釈
204 No Response アクセスしたドキュメントが反応しない
301 Moved ドキュメントが移動されている
302 Found ドキュメントは別の場所にある
303 Method ドキュメントは別の場所にあって,別にアクセスする
304 Not Modified ドキュメントが更新されていない
400 Bad request 形式が異なっている
401 Unauthorized 認証ができなかった
402 Payment Required アクセス料が必要
403 Forbidden アクセス権限がない
404 Not found ドキュメントが見つからない
500 Internal Error サーバエラー
501 Not implemented 利用できない機能が要求された
502 Service temporarily overloaded アクセスが集中している
| 覚え書き : Web server | Permalink
default.ida
アクセスログに次のようなログが残されることがある。これは IIS(Microsoft Internet Information Server)を攻撃する CodeRed と呼ばれる worm の痕跡。apache には感染しないが、サーバーに無いファイルを要求してくるのでレスポンスが悪化するし、ログも汚れる。ルートに同名の 0 byte ファイルを置くことでこれを回避する。
# less /var/log/httpd/error_log
[Mon Jul 28 07:53:36 2003] [error] [client 219.156.211.253]
File does not exist: /home/httpd/html/default.ida
↑ 実際には1行
#less /var/log/httpd/access_log
219.156.211.253 - - [28/Jul/2003:07:53:36 +0900] “GET /default.ida?
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXX%u9090%u6858%ucbd3%u7801%u9090%u6858%ucbd3%u
7801%u9090%u6858%ucbd3%u7801%u9090%u9090%u8190%u00c3%u0003%u8b00%u5
31b%u53ff%u0078%u0000%u00=a HTTP/1.0″ 404 1647 “-” “-”
↑ 実際には1行
| 覚え書き : Web server | Permalink
favicon.ico
上記と同様に、有るはずのないファイル「favicon.ico」を要求された痕跡が残ることがある。これは、Internet Explorer(IE)5.0から備わった「お気に入り」にサイトを登録すると自動的にオリジナルのアイコンを表示する機能の痕跡。デフォルトのオリジナルアイコンの名前が favicon.ico で、お気に入りに登録する操作を行ったときに、このファイルを要求してくる。通常はそんなファイルを用意していないから、ログにエラーが残る。
# less /var/log/httpd/error_log
[Sun Jul 27 01:59:05 2003] [error] [client 220.254.0.4]
File does not exist: /home/httpd/html/favicon.ico
↑ 実際には1行
#less /var/log/httpd/access_log
220.254.0.4 - - [27/Jul/2003:01:59:05 +0900] “GET /favicon.ico HTTP/1.1″
404 1647 “-” “Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)”
↑ 実際には1行
なお、このアイコンファイルの検索は、まず現在のディレクトリ内で favicon.ico を探し、なければルートディレクトリまで一つずつ上位のディレクトリを探していく。
せっかくの機能だから、図柄を考えて ICON をディレクトリにおいておく事にした。なお、ファイルを明示的に指定したい場合は、次のタグを埋め込んでおく。
<LINK REL=”SHORTCUT ICON” href=”sleepingbird.ico”>
| 覚え書き : Web server | Permalink
ログのカスタマイズ
サーバを運営していて、たまにログを覗くと思ったより膨大なデータが記録されている。しかし、良く見るとそのほとんどがアクセスしたページに付随する画像ファイル等のアクセス記録である。設定当初は稼働状況を詳細にチェックするのにログ情報は多いほどありがたいが、安定稼働状態だと逆にうっとうしい。そこで、これらの出力を抑止する。
SetEnvIfを使用することとし、環境変数「rejectlog」にログに出力したくないファイルの拡張子を登録し、CustomLog を変更する。
# reject log files
SetEnvIf Request_URI “\.(gif)|(jpg)|(png)|(js)|(css)$” rejectlog
#
# The location and format of the access logfile (Common Logfile Format).
# If you do not define any access logfiles within a <VirtualHost>
# container, they will be logged here. Contrariwise, if you *do*
# define per-<VirtualHost> access logfiles, transactions will be
# logged therein and *not* in this file.
#
# CustomLog /var/log/httpd/access_log common
#CustomLog /var/log/httpd/access_log combined
CustomLog /var/log/httpd/access_log combined env=!rejectlog
| 覚え書き : Web server | Permalink
VirtualHost
Nov.09 2003
一台のサーバーで複数の domain を使用し、あたかも独立した複数のサーバーが存在するように見える(VirtualHost)設定を行う。
VirtualHost の設定には、domain ごとに IP address を設定する IP ベースとWebブラウザがWebサーバに対して送るホスト名を基にして応答するホストを決定する NAME ベースとがあるが、非固定IPで運営しているので NAME ベースで設定になる。
NAME ベースのバーチャルホストを使うには、そのホストへの リクエストを受け付けるサーバの IP アドレス (もしかしたらポートも) を指定する必要がある。 これは NameVirtualHost ディレクティブで設定する。通常、NameVirtualHost で * の属性を使ってサーバの全ての IP アドレスを使う。
扱うホストそれぞれに対して <VirtualHost> ブロックを作成する。
既にあるウェブサーバにバーチャルホストを追加する場合、 既存のウェブサーバに対しても <VirtualHost> ブロックを作る必要がある。このバーチャルホストの ServerName と DocumentRoot は、グローバルな ServerName と DocumentRoot と同じものにする。また、このバーチャルホストを設定ファイルの中で先頭に置いて、デフォルトホストとして動作するようにする。
<VirtualHost> コンテナの中に他のディレクティブを書くことで、バーチャルホストの設定を細かく調整することができる。ほとんどのディレクティブはこれらのコンテナに設置することができて、変更点はそのバーチャルホストに対してのみ有効になる。
新たに yatagarasu.jp を取得したので、/home/httpd/yatagarasu をホームディレクトリとする設定を行う。
各ディレクティブの意味は次のとおり。
DocumentRoot
ドキュメントルートを指定する。バーチャルホスト毎に別々に指定できる。
ServerAdmin
管理者のメールアドレスを記入する。
ErrorLog
エラーログのファイル名を指定する。バーチャルホスト毎に違うファイルを指定できる。
TransferLog
アクセスログのファイル名を指定する。バーチャルホスト毎に違うファイルを指定できる。
/etc/httpd/conf/httpd.conf の ### Section 3: Virtual Hosts 以下に次の行を追加して apache を再起動する。
NameVirtualHost *
<VirtualHost *>
ServerName www.sleepingbird.net
DocumentRoot /home/httpd/html
ServerAdmin webmaster@sleepingbird.net
ErrorLog /var/log/httpd/error_log
TransferLog /var/log/httpd/access_log
</VirtualHost>
<VirtualHost *>
ServerName www.yatagarasu.jp
ErrorDocuments 404 /404.html
DocumentRoot /home/httpd/yatagarasu
ServerAdmin webmaster@sleepingbird.net
ErrorLog /var/log/httpd/yatagarasu_error_log
TransferLog /var/log/httpd/yatagarasu_access_log
</VirtualHost>
# /etc/init.d/httpd restart
なお、yatagarasu.jp の DNS 設定は次のようにした。
CNAME www www.sleepingbird.net. ← 最後はピリオド
www.yatagarasu.jp へのリクエストは www.sleepingbird.net に割り当てられた IP アドレスが返される。
Dec.04 2003
アクセス解析の AWStats でアクセスのロギング漏れが見つかった。確認してみると Virtual Host の設定をした時点からのアクセスが反映されていない。生ログを覗くと記録項目が少ない。
原因は、<VirtualHost> コンテナの中のログファイルディレクティブ設定では記録項目がデフオルトになってしまうため。従って、このコンテナ中で改めて combined 指定を設定しなければならない。改訂版の VirtualHost コンテナは次のとおり。
NameVirtualHost *
<VirtualHost *>
ServerName www.sleepingbird.net
DocumentRoot /home/httpd/html
ServerAdmin webmaster@sleepingbird.net
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/access_log combined
TransferLog /var/log/httpd/access_log
</VirtualHost>
<VirtualHost *>
ServerName www.yatagarasu.jp
DocumentRoot /home/httpd/yatagarasu
ServerAdmin webmaster@sleepingbird.net
ErrorLog /var/log/httpd/yatagarasu_error_log
CustomLog /var/log/httpd/access_log combined
TransferLog /var/log/httpd/yatagarasu_access_log
</VirtualHost>
変更後、httpd の再起動を行う。
Jul.13 2004
VirtualHost のディレクトリでの cgi 等の設定は、/etc/httpd/conf/httpd.conf の ### Section 2: に以下のように行を追加して apache を再起動する。
(この例では、DocumentRoot 以下の全てのディレクトリで cgi 注意)
<Directory /home/httpd/html>
・
・
・
・
・
</Directory>
# virtual host “yatagarasu”
<Directory /home/httpd/yatagarasu>
Options Includes FollowSymLinks MultiViews ExecCGI
AllowOverride None
Order allow,deny
Allow from all
</Directory>
| 覚え書き : Web server | Permalink
Server-status
Dec.31 2003
Apache には、稼働状況を表示してくれる機能があるので、これを有効にする。
/etc/httpd/conf/httpd.conf の ExtendedStatus On のコメントアウトを外し、次の行を追加する。
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 10.99.1
</Location>
全てのアクセスを禁止して、LAN ネットワーク内のみのアクセスを許可する。
daemon の再起動を行ったら、ブラウザで 自分のサーバへアクセスする。