ApacheConf2
VHMの仕様が変更されました
Zope 2.7.5以降のどこかで Virtual Host Monster の仕様が変わりました。mod_proxy の場合はかわりませんが、FastCGIの場合には
| 宣言 | ZMIでのpath | 宣言 | ||
|---|---|---|---|---|
| RewriteRule? ^/(.*) | /VirtualHostBase | /example_folder | /VirtualHostRoot/ | $1 |
前の仕様が中途半端だったか、中途半端なものを敢えて通すような仕様だったかなんだと思います。こっちのほうが断然わかりやすいですね。
Zope 2.6, 2.7 と Apache 2.0 に関するまとめです
順番に記述します。
- Zope も Web Server なのに、なぜ、別に Apache を使うのですか
使わなくてよいなら使わないほうがよいと私は思います。しかし、フロントに Apache を置くことでいろいろな利点があると考えます。
- 対攻撃性
一般的に、Apache のセキュリティパッチは Zope より出てくるのが速いような気がします。ヘッダをみて Apache に見えることに利点があると思います(FastCGI 方式のときのみ)
- キャッシング
特に Plone を使っているとき、「遅い」と感じることは多いと思います。これは img tag の問題で、ブラウザがふらふらと再構成をやりまくるせいもあります。image/* を Apache がキャッシュしてくれると、この問題はかなり解消されます。
Zope にもキャッシュの仕組みはありますが、単純なキャッシュであれば、Apache にやってもらったほうが速いでしょう。
- 柔軟性
Zope は、前バージョンを捨てさることに、非常に思い切りがよいです(^^;; このような場合、サイトを並行稼働させて、あるとき切りかえる、けど、URL は一切変更せず、DNS のタイムアウト問題も起こしたくない、というような移行作業が必要になるでしょう。
これは Zope を素で立てていると、結構たいへんそうに思えます(できるとは思いますが)。特に Zope 2.6/2.7 では設定ファイルの形式もかわったし、混乱しそう(少なくとも私は)です。
Apache の httpd.conf で切り替えるようにすれば、テストもそこそこできますし、ダウンタイムも少なくてすみます。もちろん、Zope にそのときログインしているユーザのセッションは失われます。ただ、ユーザ側に協力を依頼できるのであれば、混乱を最小限にすることは可能でしょう。
- 対攻撃性
- どうやればできるのですか?また、どういう方式があるのですか?
ここでは Zope 2.6.3, Zope 2.7.0 と Apache 2.0.4x での実績から記述しています。
- Virtual Host Monster の理解
まずは、VHM の書式を理解しましょう。これがあれば SiteRoot が不要です。
飛び先 宣言 http VirtualHost ZMIでのpath 宣言 URI(/ の直下に見せるなら不要) http://localhost:8080 /VirtualHostBase /http /www.example.com:80 /example_folder /VirtualHostRoot/ _vh_main/ 飛び先については、FastCGIのときは / から始めればよいです(http: は不要)。
また、最後の _vh_は http://localhost:8080/member/ = http://member.example.com/ = http://www.example.com/member/ のようにする場合の、最後のときに使います。並列して存在するフォルダのうちのいくつかだけを見せたいときにも有効でしょう。
- Proxy 方式
Proxy 方式は Apache の mod_proxy と、必要であれば mod_rewrite を使う方式です。mod_rewrite の中で P オプションを使っていれば、Proxy 方式 となり、使っていなければ別の方式となります。
この方式のメリットはわかりやすいことです。また、いろいろなモジュールの追加が不要なのもメリットでしょう(mod_cache群がインストールされている場合(RH9 はだめです。Fedora1は ok です))。
デメリットは、上で記述した「ヘッダを見てApacheに見える」という利点がないことです。
- Proxy 方式の実現方法
ProxyPass を利用する方法と、RewriteRule を利用する方法がありますが、基本的に動作にはかわりがないように見えました。
- ProxyPass
mod_proxy が load されていれば VirtualHost 宣言内で
ProxyPass / http://localhost:8080/VirtualHostBase/http/www.example.com:80/example/VirtualHostRoot/ ProxyPassReverse / http://localhost:8080/VirtualHostBase/http/www.example.com:80/example/VirtualHostRoot/
を記述すればOkです。
- RewriteRule
mod_proxy および mod_rewrite が必要です。 VirtualHost 宣言内で
RewriteEngine On RewriteCond %{REQUEST_URI} !=^/example/ RewriteRule ^/(.*) http://localhost:8080/VirtualHostBase/http/www.example.com:80/example/VirtualHostRoot/$1 [L, P]で、動きそうですが、このような場合にはむしろ FastCGIにこそ RewriteRule が向いているような気もしました
- ProxyPass
- Gateway 方式
FastCGI に代表される、Apache を Gateway として使用する方式は、バックエンドの隠蔽性に優れるのが特徴です。mod_proxy でも、Apache 側でいろいろと処理をする機能は付いておりますが、基本的に、Proxy は代理応答なのに対し、Gateway 方式はApache が応答し、その処理の一部(この場合ほとんど全部の内部処理ですが)をバックエンドに投げるという方式になります。
デメリットは追加インストールが必要になる場合がほとんどである、ということです。また、独自方式*でない*場合には、オーバーヘッドが問題になることがありますが、FastCGI のように mod_xxx で plug-in してしまうようなものの場合その心配はあまり必要ないです。
- Gateway方式 -- FastCGIの実現方法
Gateway 方式には、FastCGI 以外にも、PCGI などや、Apache 以外では Zeus Distributed Authentication and Contents (マイナーな・・・)などがありますが、実績や、現状でのメンテナンスのされかたなどを考えると、FastCGI をプライマリの選択肢とすることに問題があるとは思えません。というか、他にあまりないというか・・・
まずは FastCGI をみて、インストールします。Zope 側での設定は FastCGI 用のポートを開くこととなります。Zope 2.6 の設定は、そちらに書いてあります。
Zope 2.7 では instance/etc/zope.conf から
<fast-cgi> # valid key is "address"; the address may be hostname:port, port, # or a path for a Unix-domain socket address 8180 </fast-cgi>
のようなところを探してコメントアウトしてください。Apache のVirtualHost 宣言内には以下のようなディレクティブを書きます
DocumentRoot /tmp/nofile RewriteEngine On RewriteRule ^/(.*) /VirtualHostBase/http/example.com:80/example/VirtualHostRoot//$1 [L] # RewriteRule ^/(.*) /VirtualHostBase/http/example.com:80/example/VirtualHostRoot/_vh_example/$1 [L] <Location /> SetHandler fastcgi-script </Location>それと、VirtualHost 宣言の外にFastCgiExternalServer /tmp/nofile \ -host localhost:8180 \ -idle-timeout 90 \ # 追加しました。 -pass-header Authorization # これ、重要です。ないと Zope で auth できないと、書きます。/tmp/nofile は存在しなくてもかまいません(warning が出ますけど)。
この書き方の場合、mod_rewrite, mod_fastcgi の両方が必要です。
- Virtual Host Monster の理解
- Cache はどうやるのですか
上記の二つについて、一つ誤解があるとすれば、FastCGI ではキャッシュが効かないのではないか、と思われていることでしょう。結論からいえば効きます。
Apache 2.0 は 1.3 と違い、proxy と cache が分離されているため、cache だけを使うことができるからです。Web 上の情報では 1.3 の情報もまだまだ多いため、このような誤解がある可能性が高いと考えております。
Cache を実現するには mod_cache 群が必要です。LoadModule cache_module modules/mod_cache.so がうまくいけば入ってます。そうでなければ、コンパイルや、どこかからもってくることが必要です。
RedHat 9.0 では rpm で Apache 2.0.40 が入っていましたが、これに簡単に mod_cache を入れる方法は、どうもあまりないようです。少なくともソースツリーからコンパイルしてしまったほうがラクでした。
ソースからの場合には、詳しくは Apache のドキュメントを参照していただくとして、例えば
./configure --prefix=/path/to/apache --enable-mods-shared="all proxy cache disk_cache mem_cache"
とすれば、proxy も含めて必要なモジュールができるようです。
- httpd.conf の設定
これも詳しくは Apache のドキュメントを見ていただくとして、コピペして必要そうなところを直すというのもアリでしょう。私も Apache のドキュメントなどからコピペしていますので(^^;;
<IfModule mod_disk_cache.c> CacheRoot "/path/to/apache/cache" CacheSize 524288 CacheEnable disk / CacheDirLevels 3 CacheDirLength 3 CacheGcInterval 2 CacheMaxExpire 24 CacheLastModifiedFactor 0.1 CacheDefaultExpire 1 CacheMinFileSize 1 CacheMaxFileSize 524288 ExpiresActive On ExpiresByType image/gif A86400 ExpiresByType image/png A86400 ExpiresByType image/jpeg A86400 ExpiresByType text/css A86400 ExpiresByType text/javascript A86400 ExpiresByType application/x-javascript A86400 </IfModule>
<IfModule mod_mem_cache.c> CacheEnable mem / MCacheSize 65536 MCacheMaxObjectCount 1000 MCacheMinObjectSize 1 MCacheMaxObjectSize 65536 </IfModule>
- mem or disk ?
この設定では、mem_cache, disk_cache の 実行パスが重複してます。実際にはどちらかの LoadModule をコメントアウトすることで切りかえできます。
また、VirtualHostごとにきりかえることもできますので、ここは ディスク、ここはメモリ、ここはなし、などということも可能です。
この場合は IfModule 内 では Enable をせずに、VirtualHost 内で、どちらかを Enable します
ただ、ディスクのほうがおもいっきり量的に使えるせいか?私の環境では体感できるほど速かったのが意外でした。
# 直感的にはメモリのほうが速そうな気がしませんか?わたしだけ?単に、ブラウザの違いでした。とほほ・・・
- httpd.conf の設定
- mod_ssl を使いたいのですが make が通りません
RedHat9 で、Apache 2.0.4x あたりをソースからコンパイルすると、そのままではエラーになります。これは kerberos の path が違うことが原因のようです。よって
- export CPPFLAGS=-I/usr/kerberos/include
と指定することにより、configure, make が通るようになります。