2005/10/29 更新
Zopeを稼動させている場合に、フロントに Apache を立てているという話は聞きますが、Squid
を立てているという話はあまり聞きません。
Zopeだけを使う( CGI 等のために Apache を必要としない )場合は、Apache よりも Squidのほうが良いと思うのでメモを書いてみました。
クライアントからの Web (FTP) リクエストを受け、実際のサーバーへ中継するサービスを行うのがプロキシ(代理)サーバー Squid の役割です。
Squid を立てることにより
のようなメリットがあります。
プロキシサーバーは、組織内LAN(イントラネット)のクライアントのリクエストを受けて、インターネット上のサーバーへリクエストを転送しますが、インターネットからのリクエストを組織内LAN へ転送するようなサーバを、プロキシサーバーとは転送の方向が逆向きなことからリバースプロキシ(サーバー)と呼んでいます。
Squid は、プロキシサーバーとしても、リバースプロキシサーバーとしても動作させることができます。
Squid を Zope の前面に立てて、リバースプロキシとして使うと、一般に Squidを立てない場合よりも Zope
の負荷が軽減されレスポンスも向上します。
また、Squid を port 80 で、Zope を port 8080 で起動すると、Zopeのプロセスに root
の権限を与えなくてもよくなるためより安全です。
簡単な例として、参考図のように同一マシン上で squid と Zope を動作させる構成を考えます。
実行ファイルやログのパス、ホスト名(www.example.com)は適宜読み替えて下さい。
Squid をソースからコンパイル&インストールします。
| # tar zxvf squid-2.5.STABLE5.tar.gz # cd squid-2.5.STABLE5 # ./configure # make # make install |
(自分へのおぼえがき)
Squid は、自前の DNSクライアントで正引き→逆引きを行っているようです。自前の DNSクライアントでの名前解決を抑制するためには、configure
に --disable-internal-dns オプションを加えます。
次に、リダイレクタをインストールします。
今回は、Pythonで書かれた リダイレクタ
pyredir をインストール(アーカイブの中のファイル pyredir を適当なディレクトリにコピー)します。
| # bzip2 -d pyredir-0.27.tar.bz2 # tar xvf pyredir-0.27.tar # cp pyredir-0.27/pyredir /usr/local/squid/sbin |
設定は squid.conf に書きますが、新規に作成するのではなく、インストール時点で既に存在する squid.conf
(ソースからコンパイルした場合は /usr/local/squid/etc/squid.conf )を修正するのが正解のようです。
以下の部分を書き換えてください(以下の部分だけをファイルにしても動作します)。
| /usr/local/squid/etc/squid.conf |
|
http_port 80 cache_dir ufs /usr/local/squid/var/cache 100 16 256 acl all src 0.0.0.0/0.0.0.0 http_access allow all http_reply_access allow all icp_access allow all cache_mgr foo@example.com cache_effective_user squid cache_effective_group squid visible_hostname www.example.com httpd_accel_host virtual httpd_accel_uses_host_header on coredump_dir /usr/local/squid/var/cache redirect_program /usr/local/bin/python /usr/local/squid/sbin/pyredir /usr/local/squid/etc/pyredir.conf /usr/local/squid/var/logs/pyredir.log |
cache_effective_user/cache_effective_group には、squid を実行する uid/gid を指定します。
上記の例では squid/squid になっていますが、とにかく squid 専用の uid/gid を割り当てたほうが良いでしょう。
visible_hostname は、適当な FQDNのホスト名を書いてください。(エラーページのフッタに表示されます)
また、書き換えルールを pyredir.conf に記述します。
| /usr/local/squid/etc/pyredir.conf |
|
methods: GET,POST,HEAD,IPC_QUERY clients: 0.0.0.0/0 ^http://www.example.com[/]?(.*)$ =http://localhost:8080/VirtualHostBase/http/www.example.com:80/VirtualHostRoot/\1 |
例えば、ルートフォルダに作った MyPloneSite オブジェクトに http://www.example.com/ と(サイトのルートとして) アクセスしたいような場合は、上記の書き換えの部分を
| ^http://www.example.com[/]?(.*)$ =http://localhost:8080/VirtualHostBase/http/www.example.com:80/MyPloneSite/VirtualHostRoot/\1 |
squid.conf を設定後
| # /usr/local/squid/sbin/squid -k parse |
を実行します。
squid.conf の記述が正しければ何も表示されませんが、誤りがあればエラーメッセージが表示されます。
次に
| # mkdir -p /usr/local/squid/var/cache ← cache_dir
で指定したディレクトリ # chown -R squid:squid /usr/local/squid/var # /usr/local/squid/sbin/squid -z |
を実行して、キャッシュエリアを確保します。( cache_dir に指定されるキャッシュディレクトリや、ログファイルは、その uid/gid でファイルを書き込む権限を与えていなくてはなりません。)
squid で SSL (https) のリクエストを受け取り、Zope で処理をさせたい場合の説明をしますが、SSLが必要ない場合や、SSLが何だか判らない人は、この項は無視してください。
まず、./configure --enable-ssl で、SSL機能付きで squid のソースをコンパイルします。
squid.conf には、 上記 Squid の設定に加え以下の1行を追加します。
| https_port 443 cert=/somewhere/cert.pem key=/somewhere/private.key |
cert にはサーバー証明書を、 key にはプライベートキーを指定します。両ファイルの作成方法については、こちらを参照してください。
ソースからコンパイルした場合は、以下のようにすると squidが起動します。
| # /usr/local/squid/bin/RunCache & |
ディストリビューションの流儀(パッケージシステム)に従って squidをインストールした場合は、自動的に立ち上がるようになっているのではないでしょうか。
$(INSTANCE_HOME)/etc/zope.conf に以下を加えます。
| trusted-proxy localhost |
この設定は、特に必要なものではありませんが、ブラウザの IPアドレスを REQUEST.getClientAddr() で取得する場合には必要になります。