主要な設定は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)を有効にするには、下記のように設定を行う。
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および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を使用するファイルにも最終更新日時を付加するようにするには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モジュールを使うと、細かいカスタマイズが可能である。
参考: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はデフォルトでは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使用率も高まる。
なお、古いブラウザには圧縮しないようにもできるが、いまさら使っている人もいないと思われるので、ここでは設定していない。
最終更新日