Mac OS X で プロキシサーバーを使う

という要望を聞いたので調べてみました。

まずはデバッグのためにローカルの開発環境にプロキシサーバーを構築します。

ちょっとしたテストに squid : Optimising Web Delivery をインストールするのも面倒なので名前から軽量な印象を受ける Tinyproxy - A light-weight HTTP/HTTPS proxy をインストールします。

$ # MacPorts からインストールします
$ sudo port install tinyproxy

正常にインストールしたら設定を行います。デフォルトのままでも HTTP/HTTPS 共に有効になります。

$ # デフォルトの設定ファイルをそのままコピーします
$ cd /opt/local/etc/
$ cp -p tinyproxy.conf.default tinyproxy.conf

$ # 設定内容は man で調べます
$ man tinyproxy.conf

$ # log/run ディレクトリを作成して、環境にあわせて適切なパーミッションを設定してください
$ sudo mkdir /opt/local/var/log/tinyproxy
$ sudo chmod 775 /opt/local/var/log/tinyproxy
$ sudo mkdir /opt/local/var/run/tinyproxy
$ sudo chmod 775 /opt/local/var/run/tinyproxy

設定が完了したらプロキシサーバーを起動してみましょう。

最初は "-d" オプションを付けてフォアグランドで実行すると良いです。設定不備等でエラーがあると、そのメッセージがコンソールに出力されるからです。

$ # -d オプションで何もメッセージが出力されなかったら正常起動
$ tinyproxy -d

ログを確認してみましょう。

root で実行していないのですが、root で実行しないようにと WARNING が出てますね、、、ここでは気にしないことにします。

$ cat /opt/local/var/log/tinyproxy/tinyproxy.log
INFO      Sep 25 20:08:49 [48275]: Initializing tinyproxy ...
INFO      Sep 25 20:08:49 [48275]: Reloading config file
INFO      Sep 25 20:08:49 [48275]: Setting "Via" header to 'tinyproxy'
INFO      Sep 25 20:08:49 [48275]: Adding Port [443] to the list allowed by CONNECT
INFO      Sep 25 20:08:49 [48275]: Adding Port [563] to the list allowed by CONNECT
WARNING   Sep 25 20:08:49 [48275]: Not running as root, so not changing UID/GID.
...

動作を確認してみましょう。デフォルトでは tinyproxy はポート番号 8888 を使います。

$ python
Python 2.7.2 (default, Aug 22 2011, 13:53:27) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ["http_proxy"] = "localhost:8888"
>>> import urllib2
>>> r = urllib2.urlopen("http://www.python.org")
>>> r.headers.headers
['Via: 1.1 tinyproxy (tinyproxy/1.8.3)\r\n', ...]

以下のようなログが出力されます。

$ tail -f /opt/local/var/log/tinyproxy/tinyproxy.log
CONNECT   Sep 25 20:24:40 [48403]: Connect (file descriptor 9): localhost [127.0.0.1]
CONNECT   Sep 25 20:24:40 [48403]: Request (file descriptor 9): GET http://www.python.org HTTP/1.1
INFO      Sep 25 20:24:40 [48403]: No upstream proxy for www.python.org
CONNECT   Sep 25 20:24:40 [48403]: Established connection to host "www.python.org" using file descriptor 10.
INFO      Sep 25 20:24:41 [48403]: Closed connection between local client (fd:9) and remote client (fd:10)

ikazuchi のプロキシサーバー対応

開発のためのデバッグ環境は構築できました。

さて、本題の ikazuchi のプロキシサーバー対応です。結論から言って、先の Python の対話シェルで設定したように、環境変数の HTTP_PROXY と HTTPS_PROXY に設定しておくと、urllib2 モジュール内部でプロキシ設定をデフォルトで行ってくれます。そのため、従来のバージョンでも環境変数に設定することでプロキシサーバーに対応しています。

また、以下のように明示的に ProxyHandler の設定もできます *1

>>> import urllib2
>>> proxy = urllib2.ProxyHandler({"http": "localhost:8888"})
>>> opener = urllib2.build_opener(proxy)
>>> urllib2.install_opener(opener)
>>> r = urllib2.urlopen("http://www.python.org")
>>> r.headers.headers
['Via: 1.1 tinyproxy (tinyproxy/1.8.3)\r\n', ...]

とはいえ、せっかく調べたので ikazuchi.conf で明示的に http_proxy と https_proxy を設定できるように修正した ikazuchi 0.5.3 をリリースしました *2