Squid と Zopeの連携

2005/10/29 更新

  Zopeを稼動させている場合に、フロントに Apache を立てているという話は聞きますが、Squid を立てているという話はあまり聞きません。
 Zopeだけを使う( CGI 等のために Apache を必要としない )場合は、Apache よりも Squidのほうが良いと思うのでメモを書いてみました。

Squidとは

 クライアントからの Web (FTP)  リクエストを受け、実際のサーバーへ中継するサービスを行うのがプロキシ(代理)サーバー Squid の役割です。

 Squid を立てることにより

のようなメリットがあります。

参考

リバースプロキシとは

  プロキシサーバーは、組織内LAN(イントラネット)のクライアントのリクエストを受けて、インターネット上のサーバーへリクエストを転送しますが、インターネットからのリクエストを組織内LAN へ転送するようなサーバを、プロキシサーバーとは転送の方向が逆向きなことからリバースプロキシ(サーバー)と呼んでいます。

 Squid は、プロキシサーバーとしても、リバースプロキシサーバーとしても動作させることができます。
 Squid を Zope の前面に立てて、リバースプロキシとして使うと、一般に Squidを立てない場合よりも Zope の負荷が軽減されレスポンスも向上します。
 また、Squid を port 80 で、Zope を port 8080 で起動すると、Zopeのプロセスに root の権限を与えなくてもよくなるためより安全です。

Zope との連携

  簡単な例として、参考図のように同一マシン上で 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

Zopeの設定

管理画面から Root フォルダに「Virtual Host Monster」を Add します。Id は何か適当な値で構いません。

Squidの設定

 設定は 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 でファイルを書き込む権限を与えていなくてはなりません。)

参考

SSL の設定

 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の起動

ソースからコンパイルした場合は、以下のようにすると squidが起動します。

# /usr/local/squid/bin/RunCache &

ディストリビューションの流儀(パッケージシステム)に従って squidをインストールした場合は、自動的に立ち上がるようになっているのではないでしょうか。

 

Zopeの設定

 $(INSTANCE_HOME)/etc/zope.conf に以下を加えます。

trusted-proxy localhost

 この設定は、特に必要なものではありませんが、ブラウザの IPアドレスを REQUEST.getClientAddr() で取得する場合には必要になります。

参考

 


Zope メモ