2008/11/1 土曜日

httpd.confファイルの設定

Filed under: スクラップ — admin @ 15:07:39

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 の再起動を行ったら、ブラウザで 自分のサーバへアクセスする。

HTML convert time: 0.220 sec. Powered by WordPress ME