Apache2.2の設定

投稿者: | 2011年2月27日
Pocket

対象サーバについて

製品名 OpenBlockS 600
OS(kernel ver) Debian lenny(2.6.29)
CPU 600MHz(AMCC PowerPC 405EX)
メモリ 1GB(DDR2 SDRAM)
ストレージ 8GB(Compact Flash)

apache2のインストール

www:~# aptitude install apache2

無事インストールされたので、確認を実施します。

www:/var/www# netstat -an
稼働中のインターネット接続 (サーバと確立)
Proto 受信-Q 送信-Q 内部アドレス            外部アドレス            状態
tcp6       0      0 :::80                   :::*                    LISTEN
→80番ポートにてListenしている。

www:~# ps aux | grep apache
root     27301  0.0  0.3  18392  3116 ?        SNs  20:04   0:00 /usr/sbin/apache2 -k start
www-data 27303  0.0  0.2  18156  2184 ?        SN   20:04   0:00 /usr/sbin/apache2 -k start
www-data 27304  0.0  0.3 239892  3680 ?        SNl  20:04   0:00 /usr/sbin/apache2 -k start
www-data 27307  0.0  0.3 239860  3604 ?        SNl  20:04   0:00 /usr/sbin/apache2 -k start
root     27363  0.0  0.0   3316   900 pts/0    SN+  20:26   0:00 grep apache
→プロセスが起動している

www:~# telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
GET /
<html><body><h1>It works!</h1></body></html>
Connection closed by foreign host.
→正常に反応する

別途、windowsから「http://172.20.0.2」にアクセスして、「It works!」と表示されることを確認します。

コンフィグ設定

セキュリティ関係の設定

www:~# /etc/init.d/apache2 stop

とりあえずapacheを止め、必須のセキュリティ設定を実施していきます。

編集するファイル:/etc/apache2/conf.d/security

ServerTokens Full
ServerTokens Prod

ServerSignature On
ServerSignature Off

TraceEnable On
TraceEnable Off

上記の箇所のみ修正します。設定の意味は以下の通りです。

ServerTokens Prod クライアントに送り返す Server応答ヘッダ内のサーバ情報を最低限にする。
ServerSignature Off サーバが生成するドキュメントのフッタにサーバ情報を載せない。
TraceEnable Off TRACEメソッドに応答しない。

ディレクトリ構成について

www.example.jpとwww.example2.jpのマルチドメイン構成を前提として説明します。マルチドメインは後述のバーチャルホスト機能を利用して実現します。

ツール類は例としてIPTable log analyzerの設定のみを記載します。

IP直打ちでのアクセス(http://WWW.XXX.YYY.ZZZ)はFQDN指定のアクセス(http://www.example.jp等)と比較して不正なものが多いため、IP指定でのアクセスに対する設定ファイルを用意し、全て拒否する設定を行います(後述)。またログについても、IP直打ちでのアクセスログをFQDN指定のアクセスログと別ファイルで保存していく方針とします。

URL www.example.jp
DocumentRoot /var/www/example
IPTable log analyzerのdirectory /var/www/iptablelog
IP指定でのアクセスに対する設定ファイル /etc/apache2/sites-available/00-default
バーチャルホスト その1(www.example.jp)指定でのアクセスに対する設定ファイル /etc/apache2/sites-available/01-example
IP指定でのアクセスログ /var/log/apache2/ip/access.log
FQDN指定でのアクセスログ /var/log/apache2/fqdn/example/access.log
FQDN指定でのエラーログ /var/log/apache2/fqdn/example/error.log
URL www.example2.jp
DocumentRoot /var/www/example2
IPTable log analyzerのdirectory(共通設定) /var/www/iptablelog
IP指定でのアクセスに対する設定ファイル(共通設定) /etc/apache2/sites-available/00-default
バーチャルホスト その2(www.example2.jp)指定でのアクセスに対する設定ファイル /etc/apache2/sites-available/02-example2
IP指定でのアクセスログ(共通設定) /var/log/apache2/ip/access.log
FQDN指定でのアクセスログ /var/log/apache2/fqdn/example2/access.log
FQDN指定でのエラーログ /var/log/apache2/fqdn/example2/error.log

※IPTable log analyzerとIP指定でのアクセス設定ファイル・ログはドメイン共通の設定となります。

バーチャルホスト設定について

設定ファイルは他のディストリビューションでもよく使用される/etc/apache2/apache2.confですが、debianの場合、apache2.conf の一番下で/etc/apache2/sites-enabled/フォルダをインクルードしており、sites-enabledフォルダの下にドメインごとに設定ファイルを作成するようになっています。

/etc/apache2/sites-enabled/の構成は以下の通りです。

www:/var/www# ls -al /etc/apache2/sites-enabled/
合計 8
drwxr-xr-x 2 root root 4096 2010-01-24 20:03 .
drwxr-xr-x 7 root root 4096 2010-01-24 20:03 ..
lrwxrwxrwx 1 root root   26 2010-01-24 20:03 000-default -> ../sites-available/default

000-defaultはシンボリックリンクであり、実体は/etc/apache2/sites-available/defaultです。

次に、/etc/apache2/sites-available/フォルダの下を見てみます。

www:/var/www# ls -al /etc/apache2/sites-available/
合計 20
drwxr-xr-x 2 root root 4096 2010-01-24 20:03 .
drwxr-xr-x 7 root root 4096 2010-01-24 20:03 ..
-rw-r--r-- 1 root root  950 2009-11-16 00:00 default
-rw-r--r-- 1 root root 7366 2009-11-16 00:00 default-ssl

defaultファイルがあり、これがバーチャルホストの設定になります。

sites-available/ の下にバーチャルホスト毎の設定ファイルを作り、sites-enabled/ にシンボリックリンクを作っておくというのがdebianの流儀のようです。

なぜこのような仕組みになっているかといいますと、バーチャルホストが不要になった際、/etc/apache2/sites-enabled/ の下のシンボリックリンクを削除すれば良いわけですが、/etc/apache2/sites-available/のファイルを消さなければ、再度シンボリックリンクを張るだけでいつでもそのバーチャルホストを生かすことができるからです。

シンボリックリンクを張る、または削除するために、以下のような専用コマンドが用意されています。

  1. シンボリックリンクの作成(a2ensite)

    /etc/apache2/sites-available/01-example
    という設定ファイルを作成します。
    # a2ensite 01-example
    とすれば、
    /etc/apache2/sites-available/01-example
    へのシンボリックリンクが/etc/apache2/sites-enabled/の下に作成されます。

  2. シンボリックリンクの削除(a2dissite)

    # a2dissite 01-example
    とすれば/etc/apache2/sites-enabled/にあったシンボリックリンクだけが消され01-exampleの設定は無効になりますが、
    /etc/apache2/sites-available/01-exampleは残りますので再度バーチャルドメインを生かしたくなった際にはa2ensiteで簡単に復旧できます。

※モジュールについても同じ考え方で、/etc/apache2/mods-enabled/の下のファイルが/etc/apache2/mods-available/の下のファイルへのシンボリックリンクになっており、a2enmod、a2dismod でモジュールの有効/無効を切り替えることが可能です。

IP指定でアクセスしてきた際の設定

それではようやく設定内容を説明していきます。

IP指定でのアクセスに対する設定ファイル名は上記「ディレクトリ構成について」の表に記載している通り、00-defaultとします。

www:~# mv /etc/apache2/sites-available/default /etc/apache2/sites-available/00-default

IP指定でのアクセスは不正アクセスが大半と考えられるため、思い切って全て拒否する設定にします。

編集するファイル:/etc/apache2/sites-available/00-default

<VirtualHost _default_:80>
  <Location />
    Order deny,allow
    Deny from all
  </Location>
  ServerName dummy.example.jp
  DocumentRoot /var/www/default
  ErrorLog /var/log/apache2/ip/error.log
  LogLevel warn
  CustomLog /var/log/apache2/ip/access.log combined
</VirtualHost>

他のバーチャルドメインで指定されていないアクセスは<VirtualHost _default_:80>が捕捉するため、IP指定のアクセスはこのディレクティブにマッチします。

ServerNameを存在しないdummyホストとし、DocumentRootを空のディレクトリとすることで、IP指定でアクセスした場合はコンテンツにアクセスできないようにしています。

また、ログもFQDNでのアクセスと分けています。

設定ファイルを作成したら、シンボリックリンクの作成です。先ほどdefaultから00-defaultに名前を変えてたため、もともとのdefaultのシンボリックリンクである000-defaultを削除するのを忘れないように気をつけます。

www:/etc/apache2/sites-enabled# a2dissite 000-default
removing dangling symlink /etc/apache2/sites-enabled/000-default

www:/etc/apache2/sites-enabled# a2ensite 00-default
Enabling site 00-default.
Run '/etc/init.d/apache2 reload' to activate new configuration!

FQDNでバーチャルホスト その1(www.example.jp)にアクセスしてきた際の設定

編集するファイル:/etc/apache2/sites-available/01-example

<VirtualHost *:80>
  DocumentRoot /var/www/example
  DirectoryIndex index.html index.php
  ServerName www.example.jp

  # デフォルトで全てdenyするように設定変更
  <Directory />
    Options FollowSymLinks
    AllowOverride None
    Order Deny,Allow
    Deny from all
  </Directory>

  # DocumentRootの設定
  # 拒否したいアドレス・ドメイン名があれば指定し、
  # それ以外のアクセスは全て許可する。
  <Directory /var/www/example>
    Options FollowSymLinks
    AllowOverride all
    Order Deny,Allow
    Deny from XXX.XXX.XXX.0/255.255.255.0
    Deny from xxx.com
  </Directory>

  # IPTable log analyzerの設定
  # 許可したいアドレス・ドメイン名があれば指定し、
  # それ以外のアクセスは全て拒否する。
  Alias /iptablelog/ "/var/www/iptablelog/"
  <Directory "/var/www/iptablelog">
    Options FollowSymLinks
    AllowOverride all
    Order allow,deny
    allow from 192.168.0.0/255.255.255.0
    allow from YYY.YYY.YYY.0/255.255.255.0
  </Directory>

  ErrorLog /var/log/apache2/fqdn/example/error.log
  LogLevel warn
  CustomLog /var/log/apache2/fqdn/example/access.log combined

</VirtualHost>

設定ファイルが作成できたら、シンボリックリンクを作成します。

www:/etc/apache2/sites-available# a2ensite 01-example
Enabling site 01-example.
Run '/etc/init.d/apache2 reload' to activate new configuration!

FQDNでバーチャルホスト その2(www.example2.jp)にアクセスしてきた際の設定

編集するファイル:/etc/apache2/sites-available/02-example2

<VirtualHost *:80>
  DocumentRoot /var/www/example2
  DirectoryIndex index.html index.php
  ServerName www.example2.jp

  # デフォルトで全てdenyするように設定変更
  <Directory />
    Options FollowSymLinks
    AllowOverride None
    Order Deny,Allow
    Deny from all
  </Directory>

  # DocumentRootの設定
  # 拒否したいアドレス・ドメイン名があれば指定し、
  # それ以外のアクセスは全て許可する。
  <Directory /var/www/example2>
    Options FollowSymLinks
    AllowOverride all
    Order Deny,Allow
    Deny from XXX.XXX.XXX.0/255.255.255.0
    Deny from xxx.com
  </Directory>

  ErrorLog /var/log/apache2/fqdn/example2/error.log
  LogLevel warn
  CustomLog /var/log/apache2/fqdn/example2/access.log combined
</VirtualHost>

設定ファイルが作成できたら、シンボリックリンクを作成します。

www:/etc/apache2/sites-available# a2ensite 01-example2
Enabling site 01-example2.
Run '/etc/init.d/apache2 reload' to activate new configuration!

上記設定ファイルのパラメータ備忘録

Directoryについて
Indexes ディレクトリ上にindex.htmlがないとファイルの一覧表示する。
FollowSymLinks シンボリックリンクを許可する
ExecCGI PHPは含まれない
Multiviews HTTPサーバが持つコンテンツの中でクライアントに対して最適なコンテンツを自動的に選択して応答する機能
AllowOverride

Noneとすれば、.htaccessを基本的に使用しない

Order

allow,deny とすれば、基本的にアクセスを拒否し、allowで明記されているアクセスを許可する。

deny,allow とあれば、基本的にアクセスを許可し、denyの記述にマッチしたアクセスを拒否する。

FilesMatchについて

.htaccessと.htpasswdを見せない。

ログ用のディレクトリを作成

www:/etc/apache2/sites-available# cd /var/log/apache2/
www:/var/log/apache2# mkdir ip
www:/var/log/apache2# mkdir -p fqdn/example
www:/var/log/apache2# mkdir -p fqdn/example2

ドキュメント用ディレクトリを作成

www:~# mkdir /var/www/example
www:~# mkdir /var/www/example2
www:~# mkdir /var/www/default

logrotateの設定追加

apache2はログを大量に出力しますが、自動でローテートされないため、logrotateの設定を行います。

作成するファイル:/etc/logrotate.d/apache2-custom

/var/log/apache2/fqdn/example/*.log
/var/log/apache2/fqdn/example2/*.log
/var/log/apache2/ip/*.log {
        rotate 24
        monthly
        missingok
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                if [ -f "`. /etc/apache2/envvars ; echo ${APACHE_PID_FILE:-/var/run/apache2.pid}`" ]; then
                        /etc/init.d/apache2 reload > /dev/null
                fi
        endscript
}

記載方法についてはLogrotateの設定に載せていますので参考にして下さい。

設定反映

www:~# /etc/init.d/apache2 restart
Restarting web server: apache2 ... waiting .
www:~#

最後に

Apache MPM preforkのMaxclients以外のパラメータ(StartServers、MinSpareServers、MaxSpareServers、MaxRequestsPerChild)についてはApache2.2のパフォーマンスチューニング(その1)にまとめています。

MaxclientsについてはApache2.2のパフォーマンスチューニング(その2)にまとめています。

当サイトのApache2.2が実際にどの程度のアクセスまで耐えられるかはapache2.2の負荷試験で試しています。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です