apache2.2 設定ファイルを一度真っ白にして最小構成から編集してみる
最小構成
まずは最小構成からはじめましょう。
Listen 80 User apache Group apache DocumentRoot "/var/www/html"
これで、ブラウザから http://localhost/index.html にアクセスすると、HTMLが解釈されずタグがそのままブラウザに表示されます。レスポンスヘッダは下記のとおりで、Content-Type は text/plain になってます。他にも Keep-Alive とか ETag とか結構いろいろ設定されてるんですね。
Accept-Ranges:bytes Connection:Keep-Alive Content-Length:44 Content-Type:text/plain Date:Mon, 07 Feb 2011 08:10:40 GMT ETag:"1120194-2c-c43f3700" Keep-Alive:timeout=5, max=100 Last-Modified:Mon, 07 Feb 2011 08:10:36 GMT Server:Apache/2.2.3 (CentOS)
htmlファイルを ContentType:text/html で返す
text/plain では困るので、htmlファイルがリクエストされた時は Content-Type:text/html を返せるようにしてみましょう。httpd.conf に以下のディレクティブを追加すれば、/etc/mime.types に登録されている拡張子に対応するContent-Typeが返ってくるようになります。
LoadModule mime_module modules/mod_mime.so TypesConfig /etc/mime.types
TypesConfig は、ServerRoot からの相対パスで設定することになっているので、この時点で ServerRoot ディレクティブも追加したほうがいいのかもしれないですね。ここでは /etc/mime.types と絶対パスで指定しているので、ServerRoot がなくてもちゃんと動きはしますが、ServerRoot からの相対パス指定というのは他のディレクティブでも利用されるので、早めに追加してしまいましょう。
ServerRoot "/etc/httpd"
(注)リクエストしたファイルがサーバ側で更新されていないと、サーバがステータスコード 304 Not Modified を返してしまい、httpd.conf の変更がレスポンスヘッダに反映されないです。サーバ側で touch /var/www/html/index.html するなどしてファイルを更新してあげましょう。それかこの ETag を無効にすればいいのかな。
URLでディレクトリを指定されたときに index.html を返す
ここまで、URLには index.html というファイル名を明示指定してましたが、http://localhost/ というディレクトリのURLが指定されたときにも index.html を返してほしいものです。
LoadModule dir_module modules/mod_dir.so DirectoryIndex index.html
これで、http://localhost/ とURLでディレクトリを指定したときに、index.html を返すようになりました。
そういえば access_log が出力されていない
ここまで、error_log は出力されてるようですけど、access_log ファイルに何も書き込まれてないようです。アクセスログ出力のために次のディレクティブを追加します。
LoadModule log_config_module modules/mod_log_config.so LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog logs/my_access_log common
ここでも出力ファイルが ServerRoot からの相対パス指定となっているので、やはり ServerRoot が必要……と思ったら、ServerRoot をコメントアウトしてもちゃんと動きました。yum でインストールした httpd なので自分でコンパイルはしてないですが、コンパイル時に指定したPREFIXがそのままデフォルト値になったりしているのかな。よくわかりません。
ついでだから error_log のファイル名も my_error_log に変えてみる
さらについでに、LogLevel はデフォルト値が warn らしいので、もう少し詳細な info に変えておきます。設定ファイルの勉強中ですし、ログは詳しいほうがよいです。access_log を出力する CustomLog ディレクティブは mod_log_config モジュールなのに対して、こちら ErrorLog と LogLevel はコアモジュールに含まれているんですねえ。存在しないURLにアクセスを試みれば、エラーログの確認ができます。
ErrorLog logs/my_error_log LogLevel info
アクセス制御
Order,Allow,Deny ディレクティブをつかったアクセス制御を追加します。これらは mod_authz_host モジュールで提供されています。このモジュールは、以前のバージョンでは mod_access だったものが Apache2.2 で名前を変えたらしい。
アクセス制御といっても、基本的に外部に公開することを想定しているので、ややこしいことはしません。すべてのディレクトリに全面的にアクセスを許可した上で、一部のディレクトリやファイルにだけ全面的なアクセス禁止をおこないます。
アクセス禁止するのは .htaccess に代表される、.ht で始まる名前のファイル、あと、個人的事情で Subversion のメタデータである .svn ディレクトリが公開ディレクトリに存在する可能性があるので、これもアク禁しておきます。
LodeModule authz_host_module modules/mod_authz_host.so# これは Order のデフォルト値なのでなくてもよい Order Deny,Allow Order Allow,Deny Order Allow,Deny
なお、下の2つに Deny from all は不要です。Order ディレクティブは Allow と Deny の評価の順序を定義しているだけでなく、それ自体がデフォルトのアクセス制限をもっているのです。
- Order Deny,Allow はデフォルトでアクセス全許可
- Order Allow,Deny はデフォルトでアクセス全拒否
図にするとこうなります。
utf-8で作成した日本語入りファイルを DocumentRoot に置いて、ブラウザで見たら文字化けた
htmlファイルへのリクエストに対するレスポンスヘッダの Content-Type は現在 text/html でした。これを、text/html; charset=utf-8 に変えるには、次のディレクティブを追加します。
AddDefaultCharset utf-8
パフォーマンス関連のいろいろ
パフォーマンス関連のディレクティブも何か書こうと思ったのですが、各ディレクティブのデフォルト値を調べたところ以下のとおりで、実測値のない稼動前にわざわざ値を変更する必要はなさそうなので、何も書きませんでした。
# 注)これらは全てデフォルト値ですよ! KeepAlive On KeepAliveTimeout 5 MaxKeepAliveRequests 100 StartServers (worker)3、(prefork)5、 (mpmt_os)2 MinSpareServers 5 MaxSpareServers 10 MaxClients (prefork)256 MaxRequestsPerChild 10000
とりあえず
httpd.conf は最終的に次のようになりました。
Listen 80 User apache Group apache ServerRoot "/etc/httpd" DocumentRoot "/var/www/html" LoadModule mime_module modules/mod_mime.so LoadModule dir_module modules/mod_dir.so LoadModule log_config_module modules/mod_log_config.so LodeModule authz_host_module modules/mod_authz_host.so TypesConfig /etc/mime.types AddDefaultCharset utf-8 LogFormat "%h %l %u %t \"%r\" %>s %b" common CustomLog logs/my_access_log common ErrorLog logs/my_error_log LogLevel info DirectoryIndex index.html# これは Order のデフォルト値なのでなくてもよい Order Deny,Allow Order Allow,Deny Order Allow,Deny
とりあえずこんなところかな……。結局 ServerName とかまだ設定していないけど、いいんだろうか。