Twitterに投稿 はてなブックマークに追加 Yahoo!ブックマークに追加 Google Bookmarksに追加

目次 >> Apache >> 設定

Webサーバの設定 - Apacheの設定

主要な設定はOpenSUSE 11.2などでは

/etc/apache2/httpd.conf

OpenSUSE 10.0などでは

/etc/httpd/conf/httpd.conf

で行う。httpd.confの日本語訳はここ。openSUSE の場合は、ファイルが細かく分かれており、httpd.confはそれらのファイルをincludeで読み込んでいるので注意。以下特に注釈がない場合は、httpd.confもしくはそこでincludeされるファイルに記述する。
なお、ubuntuなどdebian系のOSでは、

/etc/apache2/apache2.conf

が基本設定で、ユーザの追加の設定は下記の中

/etc/apache2/httpd.conf

および、そのサブディレクトリで行うこととなっている。また、

/etc/apache2/sites-available/default

がSSIやCGIの設定を行う場所である。

OSXでは、クライアント版では

/etc/apache2/httpd.conf

であるが、OSXサーバーがインストールされていると

/Library/Server/Web/Config/apache2/httpd_server_app.conf

および/Library/Server/Web/Config/apache2/内のファイル、サブフォルダで設定する。また、ドキュメントルートも

/Library/Server/Web/Data/Sites

になるので注意。

基本的な設定

正常にインストールされていれば、Apacheは何も設定しないで起動しても、デフォルトのページが表示されるはずである。

http://www.example.com/でアクセスしたときに表示されるディレクトリはDocumentRootで設定する。設定ファイルで特に設定を行わない限り、このディレクトリを起点として、アクセスされる。例えば、下記のような設定で、http://www.example.com/foo/とアクセスした場合、/srv/www/htdocs/foo/内のファイルが参照される。ServerNameで、サーバ名をServerAdminで連絡先をメールアドレス指定する。

DocumentRoot "/srv/www/htdocs"
ServerName www.example.com
ServerAdmin info@example.com

なお、サーバ名が設定されていないと

apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1 for ServerName

のような警告が出る。

SSIを使えるようにする

サーバサイドインクルード(SSI)を有効にするには、下記のように設定を行う。

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml

この場合、shtmlで終わるファイルでのみSSIを使用することができる。htmlで終わるファイルでもSSIを使えるようにするには、

AddOutputFilter INCLUDES .shtml .html

のように、.htmlも追加する。しかしながら、あまり多くの拡張子を追加すると、サーバのパフォーマンスに影響する。
また、標準の設定では、SSIを使用したファイルには、最終更新日時が付加されず、ブラウザ側のキャッシュの動作にもよろしくないので、必要最小限にすることを推奨する。(SSIで最終更新日時を付加する方法は下記を参照。)
そしてOptionsで、Includesを指定する。

#SSIを許可する
Options Includes

もしくは、他の設定を引き継いで、SSIの設定のみ許可に変更するには、

#SSIの実行を許可する
Options +Includes

逆に、SSIの実行を禁止するには

#SSIの実行を禁止する
Options -Includes

とする。

なお、#include file=で、ネストすなわち入れ子にしてファイルを挿入し、そのファイル内のSSIも実行する場合、そのファイルもSSIが実行可能であることが必須である。
例えば、.shtmlでSSIを実行可能にしている場合、

<!--#include file="foo.shtml" -->

はfoo.shtml内のSSIも実行される。
一方、

<!--#include file="foo.txt" -->

とした場合、.txtが「AddOutputFilter INCLUDES」で登録されていない場合、例え呼び出し側がshtmlであっても、foo.txt内のSSIは実行されないので注意が必要である。

CGIをつかえるようにする

下記の設定を追加すると、拡張子がcgiおよびplのファイルでCGIが使えるようになる。

AddHandler cgi-script .cgi .pl

そしてOptionsで、ExecCGIを指定する。

#CGIの実行を許可する
Options ExecCGI

もしくは、他の設定を引き継いで、CGIの設定のみ許可に変更するには、

#CGIの実行を許可する
Options +ExecCGI

逆に、CGIの実行を禁止するには

#CGIの実行を禁止する
Options -ExecCGI

とする。

文字化け対策

AddDefaultCharset有害なので、必ずコメントアウトしておく。

ディレクトリでファイル一覧を表示しない

Apacheではファイル名を指定せずにアクセスすると、まず、デフォルトのファイルを探そうとする。このデフォルトのファイルは、DirectoryIndexに記述されている。

DirectoryIndex index.html index.html.var

例えば、index.shtmlとindex.phpもデフォルトファイルに加えたい場合は、

DirectoryIndex index.html index.html.var index.shtml index.php index.cgi

のようにする。なお、先頭に書いたファイルほど優先される。

このデフォルトファイルがどれも見つからない場合、Apacheはディレクトリ一覧を表示しようとする。これを制御するのが

Options Indexes

これを記述すると、一覧が表示されるようになる。OptionsにIndexesが存在しないと、エラーを返すようになる。

また、

#ディレクトリ一覧を表示する
Options +Indexes

このように書いた場合は、他の設定はそのままで、ファイル一覧の表示がオンになる。逆に、

#ディレクトリ一覧を表示しない
Options -Indexes

とすると、他の設定はそのままで、ファイル一覧の表示を禁止するようになる。

特定のユーザーエージェントのアクセスを拒否する

数分ごとにページ更新をチェックしたり、一度に大量のダウンロードを行うようなアプリケーションを遮断したい場合がある。それには、SetEnvIf User-Agentで場合分けをして、denyで拒否する。

SetEnvIf User-Agent "hugahuga" noua
Deny from env=noua

バーチャルホストの設定

まず、

NameVirtualHost *:80

を有効にする。

<VirtualHost *:80>で各バーチャルホストの設定を行い、その中に記述したホームディレクトリの設定は続く<Directory>で設定する。
<VirtualHost *:80>
    ServerName example.net
    ServerAlias *.example.net
    DocumentRoot /home/example.net/public_html
    ErrorLog /home/example.net/log/error.log
    CustomLog /home/example.net/log/access.log combined
</VirtualHost>
<Directory "/home/example.net/public_html">
    Options FollowSymLinks ExecCGI Includes
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

なおこの際/home/example.netのパーミッションは最低でも711に/home/example.net/public_htmlは755にする必要がある。

SSIを使っているファイルにも最終更新日時を付加する

SSIを使用した場合、最終更新日時は付加されなくなります。理由は、SSIを使っている場合、内容が毎回変化する可能性があり、ファイルの最終更新日時が同じだからといって、内容まで同じとは限らないからである。

SSIを使用するファイルにも最終更新日時を付加するようにするにはhttpd.confもしくは.htaccessに下記の一行を加え、chmodを使いSSIを含むファイルにはグループの実行属性を許可にする。

XBitHack full

shtmlファイルに実行属性を追加するには、

$ chmod g+x *.shtml

とする。

参考:http://httpd.apache.org/docs/2.2/ja/mod/mod_include.html

ページや画像ファイルに有効期限を設定する

有効期限を設定することにより、クライアントのブラウザはキャッシュをより有効に利用するようになりトラフィックの軽減につながる。また、逆に更新されたコンテンツをキャッシュから読み込まずにすむようになる。これは、SSIファイルにも有効である。
文書の場合はmetaタグでも指定できるが、通常有効期限の長い画像ファイルの場合、ここにある方法を使う。

まず、Fedoraやsuseの場合は、httpd.confの中でmod_expiresが読み込まれているか確認する。具体的には

LoadModule expires_module modules/mod_expires.so

という行があるかどうか確認する。
ubuntuの場合は、/etc/apache2/mods-enabledというフォルダの中にあるか確認する。もし内場合は、/etc/apache2/mods-availableから移動してもってくる。
expires.loadというファイルが、
次にこのモジュールを使用したいところでExpiresActiveをOnにする。例えば、/var/www/example/ディレクトリでこのモジュールを有効にするには、下記のようにする。

<Directory "/var/www/example">
#有効期限モジュールを有効にする
ExpiresActive On
</Directory>

実際の有効期限は、下記のように記述する。

<Directory "/var/www/example">
ExpiresByType image/gif A7200
ExpiresByType image/gif "access plus 2 hours"

ExpiresByType image/jpeg M7200
ExpiresByType image/jpge "modification plus 2 hours"

ExpiresByType text/html A600
ExpiresByType text/html "access plus 10 minutes"

ExpiresDefault A86400
ExpiresDefault "access plus 1 day"
</Directory>

各2行はまったく同じ意味をA or Mプラス秒と文字列で記述したものである。Aはクライアントのアクセス時刻を基準にし、Mはサーバのファイルの更新日時を基準にする。
はじめの2行は、gifファイルの有効期限をアクセス時刻から2時間後に指定している。
次の2行は、jpegファイルの有効期限をファイルの更新時刻から2時間後に指定している。
次の2行は、htmlファイルの有効期限をファイルのアクセス時刻から10分後に指定している。
最後の2行は、ExpiresByTypeで指定されていないそれ以外のファイルのデフォルトの有効期限をアクセス時刻から1日後に指定している。

パフォーマンスをチューニングする

チューニング項目の一覧

項目 内容
KeepAlive On|Off これをOnにすると、ひとつのコネクションで複数のリクエストを出せるようになるため、パフォーマンスが向上する。
MaxKeepAliveRequests 数値 KeepAliveをOnにした場合、ひとつのコネクションで出せるリクエストの最大数。
StartServers 数値
MinSpareServers 数値
MaxSpareServers 数値
MaxClients 数値
MaxRequestsPerChild 数値
MinSpareThreads 数値
MaxSpareThreads 数値
ThreadsPerChild 数値

まずは、

$ httpd -V
Server version: Apache/2.2.0
Server built: Feb 11 2006 17:41:05
Server's Module Magic Number: 20051115:0
Architecture: 64-bit
Server MPM: Prefork
threaded: no
forked: yes (variable process count)
Server compiled with....
-D APACHE_MPM_DIR="server/mpm/prefork"
-D APR_HAS_SENDFILE
-D APR_HAS_MMAP
-D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
-D APR_USE_SYSVSEM_SERIALIZE
-D APR_USE_PTHREAD_SERIALIZE
-D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
-D APR_HAS_OTHER_CHILD
-D AP_HAVE_RELIABLE_PIPED_LOGS
-D DYNAMIC_MODULE_LIMIT=128
-D HTTPD_ROOT="/etc/httpd"
-D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

で、preforkかworkerかを調べる。上記の例ではpreforkである。preforkの場合は、

<IfModule prefork.c>
~
</IfModule>

workerの場合は

<IfModule worker.c>
~
</IfModule>

を変更する。

エラーページをカスタマイズする

指定されたドキュメントが存在しないなど、エラーが起きたときに、表示されるファイルはデフォルトで設定されているが、これを自分で作成したページを使って、カスタマイズすることもできる。

カスタマイズするには、ErrorDocumentディレクティブにエラー番号とファイル名を指定する。具体的には下記のようにする。

#404番のエラーが起きたときにカレントディレクトリの404.htmlファイルを表示する
ErrorDocument 404 /404.html

この場合、404番のエラーが起きたときに、404.htmlを表示するように指定している。なお、ここでは/で始まっているが、これはLinuxファイルシステムのルートではなくDocumentRootのルートである。

たとえば、ここをクリックすると、このサイトのカスタマイズされたエラーページが出る。

エラーページなどで、サーバのバージョンなどを表示しない

Apacheサーバのバージョンを表示することは、それだけ攻撃者に情報を与えることになる。
これを表示しないようにするには以下のようにする。

ServerSignature Off 

mod_rewriteモジュールでサイトをいろいろとカスタマイズする

mod_rewriteモジュールを使うと、細かいカスタマイズが可能である。

参考:http://httpd.apache.org/docs/2.2/ja/mod/mod_rewrite.html

キャッシュモジュールを使って、パフォーマンスを上げる

以前から、Apacheにはキャッシュモジュールが付属していたものの、あまり実用になるものではなかった。Apache2.2からは、キャッシュモジュールがかなり改善されていて、これを使うと比較的簡単にパフォーマンスを上げることができる。

キャッシュ場所の違いで、メモリキャッシュとディスクキャッシュを選ぶことがでるが、ここでは、効果の高いメモリキャッシュを使ってみる。

まず、Fedora、suseの場合はhttpd.confの中の下記の2行でモジュールを読み込む。

LoadModule cache_module modules/mod_cache.so
LoadModule mem_cache_module modules/mod_mem_cache.so

ubuntuの場合は、/etc/apache2/mods-availableから

cache.load
mem_cache.conf
mem_cache.load

の3つのファイルを/etc/apache2/mods-enabledに移動する。

そしてFedora、suseの場合はhttpd.confに、ubuntuの場合はmem_cache.confに下記のように記述する

<IfModule mod_cache.c>
  <IfModule mod_mem_cache.c>
    CacheEnable mem /
    MCacheSize 4096
    MCacheMaxObjectCount 100
    MCacheMinObjectSize 1
    MCacheMaxObjectSize 2048
    CacheDefaultExpire 7200
    CacheLastModifiedFactor 0.2
  </IfModule>
</IfModule>

CacheEnableは最初の引数にmemを指定してメモリキャッシュを行うようにしている。次の引数/は対象となるURLでこの場合は/以下すべてを対象としている。

MCacheMaxObjectCountはキャッシュに入る最大ファイル数。この場合、100個のドキュメントがキャッシュされる。

MCacheMinObjectSizeは1バイト以上のファイルをキャッシュするようにしている。

MCacheMaxObjectSizeは逆に2kB以上のファイルはキャッシュしないようにしている。

CacheDefaultExpireはデフォルトのキャッシュの有効期限で、有効期限や最終更新時刻が指定されていないファイルに関しては、この値が用いられる。デフォルト値は1時間。

CacheLastModifiedFactorは有効期限は設定されていないが、最終更新時刻は設定されているファイルに対して、有効期限を設定する際の重みを指定する。0.2とした場合、最終更新時刻から現時刻までの時間に0.2をかけた時間が過ぎると有効期限を迎えるように設定される。デフォルト値は0.1。

KeepAliveをOnにして、パフォーマンスを上げる

KeepAliveはデフォルトではOffになっている。

KeepAlive On

とするとKeepAliveが有効になりパフォーマンスが向上する。

圧縮転送を有効にしてパフォーマンスを上げる

圧縮転送はデフォルトでは有効になっていない。

LoadModule deflate_module modules/mod_deflate.so

という行があることを確認して

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/javascript application/x-httpd-php

をDirectory /あたりに書いておく。

DeflateCompressionLevel 9

も(Directory /の外側に)同時に書いておくと、圧縮率を高められるが、CPU使用率は高まる。数値は1から9で、大きいほど圧縮率が高くなる一方、CPU使用率も高まる。

なお、古いブラウザには圧縮しないようにもできるが、いまさら使っている人もいないと思われるので、ここでは設定していない。

最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて17.04、18.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2014 Chikuma Engineering Co., Ltd. All Rights Reserved.