何度やっても同じ

ただの日記

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 とかまだ設定していないけど、いいんだろうか。