Apache 1.3.27 から Apache 2.0.43 への乗り換えメモです。詳細はマニュアル http://httpd.apache.org/docs-2.0/ をご覧になったほうがよいと思います。
- 参考にしたもの
- Apache 2.0 のマニュアル
- Apacheハンドブック 第2版 (オライリージャパン)
- 2ch のどこかのスレ (XHTML の qs=0.95 に関して)
使いたい機能など
1.3.27 で使っていたこれらの機能や設定を 2.0.43 でも同じように使えるようにしました。
- suEXEC (私の専用サーバなので意味ありませんが)
- ホスト名ベースの VirtualHost
- クライアントに送る前に gzip 圧縮する
- コンテントネゴシエーション
- XHTML ファイルにはちゃんとした MIME タイプを指定する
- gzip エンコードについて
- 1.3 用に作られたモジュールは 2.0 で使うことができません。
1.3 で gzip エンコードをするために広く用いられた mod_gzip モジュールも使えないのです。Apache 2 用の mod_gzip もあるようです。しかし、2.0 では純正の mod_deflate モジュールを有効にすることで gzip エンコードが可能になります。
インストール
suEXEC と mod_deflate を有効にします。また、将来モジュールの追加が手軽にできるように DSO も有効にします。 ./configure --help で詳しい内容が確認できます。
ここでは Apache のユーザを webuser 、ユーザのホームディレクトリは public_html、ドキュメントルートに /home を指定しています。ここで省略した項目 (--with-suexec-uidmin など) はデフォルト値が適用されます。
そしてコンパイルとインストールです。
$ make # make install
ホスト名ベースのバーチャルホスト
以下の例では foo.local というホスト名で接続したときは foo というユーザの /home/foo/public_html の内容が、bar.local では bar というユーザの /home/bar/public_html が表示されることになります。それぞれ users というグループに属しています。
# ホスト名ベースのバーチャルホストなので * NameVirtualHost * <VirtualHost *> # 割り当てるドメイン名 ServerName foo.local # ドキュメント格納ディレクトリ DocumentRoot /home/foo/public_html # suEXEC で CGI の実行ユーザとグループ SuexecUserGroup foo users # ログの出力先、アクセス権を設定する必要あり ErrorLog /home/foo/logs/error_log CustomLog /home/foo/logs/access_log combined </VirtualHost> <VirtualHost *> ServerName bar.local DocumentRoot /home/bar/public_html SuexecUserGroup bar users ErrorLog /home/bar/logs/error_log CustomLog /home/bar/logs/access_log combined </VirtualHost>
- 1.3 との違い
- 1.3 の User と Group ディレクティブは 2.0 では SuexecUserGroup になりました。SuexecUserGroup user group という形式で用います。
コンテントネゴシエーションと XHTML
コンテントネゴシエーションを使って、 application/xhtml+xml という MIME タイプに対応したクライアントには XHTML ファイルを、そうでない場合は普通に text/html の HTML ファイル (中身は XHTML でも可) を出力するようにしてみます。例えば、 foo.html と foo.xhtml というファイルがあった場合は foo で呼び出すと最適なファイルが渡されるようになります。
コンテントネゴシエーションを有効にするために、 Options ディレクティブに +MultiViews と追加します。これで、現在のオプションに MultiViews が加わりました。あとは xhtml という拡張子に対して application/xhtml+xml という MIME タイプを追加します。ついでに Directory で囲んだディレクトリで SSI と CGI の実行もできるようにもしました。
更に、 index.html と index.xhtml が存在するディレクトリがあり、ファイル名を省略してディレクトリ名で呼び出び出すときにもコンテントネゴシエーションを有効にするためには、 DirectoryIndex index とします。
<Directory /home/foo/public_html> # CGI、SSI、MultiViews 機能を有効にする Options ExecCGI Includes MultiViews # .htaccess による上書きを許可 AllowOverride All Order deny,allow Allow from all # cgi という拡張子で CGI を使う AddHandler cgi-script cgi # shtml、 sxhtml という拡張子で SSI を使う AddOutputFilter INCLUDES shtml sxhtml # html、shtml の MIME タイプおよび文字コード AddType "text/html; charset=Shift_JIS" html shtml # xhtml、sxhtml の MIME タイプおよび文字コード AddType "application/xhtml+xml; charset=Shift_JIS; qs=0.95" xhtml sxhtml # ディレクトリ名で呼び出したときに表示するファイル、なぜ "index" なのかは上記説明を DirectoryIndex index </Directory>
AddType ディレクティブで application/xhtml+xml を指定といっしょに文字コードの指定の後、 qs=0.95 というものがあります。これはドキュメントの品質を設定するものです。これを付けておかないと、ブラウザによってはうまくコンテントネゴシエーション機能が使えない場合があります。
mod_deflate の設定
AddOutputFilterByType fileter MIME-type という形式で出力時に用いるフィルタを設定できます。HTML および XHTML に対して mod_deflate による gzip エンコードを使うには以下のようにします。
特定のファイルに対してエンコードしたくないこともあるかもしれません。例えば .cgi という文字列を含む URI に対してエンコードしないようにするには以下のようにします。
その他の覚え書き
mod_deflate の動作を確認する
Accept-Encoding: gzip, deflate という行を含めてリクエストすると、ちゃんと圧縮されて送られてくるのがわかります。もちろん、この行を含めない場合は圧縮されません。
$ telnet foo.local 80 Trying 192.168.3.11... Connected to foo.local. Escape character is '^]'. GET /index.html HTTP/1.1 Host: foo.local Accept-Encoding: gzip, deflate HTTP/1.1 200 OK Date: Fri, 20 Dec 2002 02:37:53 GMT Server: Apache/2.0.43 (Unix) Last-Modified: Sat, 14 Dec 2002 00:39:18 GMT ETag: "7788c-10c6-70b25980" Accept-Ranges: bytes Content-Encoding: gzip Vary: Accept-Encoding Content-Length: 2083 Content-Type: text/html; charset=shift_jis (以下略)
文字化けしてしまうときは
標準の httpd.conf を使って日本語の文書を表示すると、文字化けしてしまうことがあります。 AddDefaultCharset ISO-8859-1 という行をコメントアウトすると問題はなくなります。