Mac OS X で プロキシサーバーを使う
あれ、 ikazuchi は Proxy に対応してないのかな。便利なのにぃ。
という要望を聞いたので調べてみました。
まずはデバッグのためにローカルの開発環境にプロキシサーバーを構築します。
ちょっとしたテストに 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 。