Apache 2 への移行、おぼえがき

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 でも同じように使えるようにしました。

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 で詳しい内容が確認できます。

$ ./configure --enable-modules="suexec deflate so" --with-suexec-caller=webuser --with-suexec-userdir=public_html --with-suexec-docroot=/home

ここでは 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 エンコードを使うには以下のようにします。

AddOutputFilterByType DEFLATE text/html application/xhtml+xml

特定のファイルに対してエンコードしたくないこともあるかもしれません。例えば .cgi という文字列を含む URI に対してエンコードしないようにするには以下のようにします。

SetEnvIf Request_URI \.cgi no-gzip

その他の覚え書き

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 という行をコメントアウトすると問題はなくなります。


Updated: 2003-02-14
Copyright © 2003 Kendomo.net.