るるぷらす

るるぷらす、だおー

Mac OS X の Web サーバ (Apache) を利用してキャッシュ用のプロキシを作る。

今日はさらっと更新してみる。
いままで polipo とか squid とか ziproxy とかいろんなプロキシを使ってきましたが、もっと単純に、単なるキャッシュを溜めていく場合に有用な方法として Apache のキャッシュ機能を有効にしてこれに接続する方法があります。
環境は OS X 10.9.1 です。これに標準でついてくる Apache を利用してキャッシュ用のプロキシを作ります。
Apache のバージョンはこんな感じ。

% httpd -v
Server version: Apache/2.2.24 (Unix)
Server built: Aug 24 2013 21:10:43

Apache は下記のコマンドで、起動・再起動・停止ができます。

sudo apachectl start
sudo apachectl restart
sudo apachectl stop

まず、キャッシュを保存するフォルダを作ります。どこでもいいで適当に作ります。

sudo mkdir /opt/cache
sudo chmod -R 777 /opt/cache

次に、プロクシを有効にするためのコンフィグファイルを作成します。

sudo touch /etc/apache2/other/proxy.conf
sudo vi /etc/apache2/other/proxy.conf

コンフィグの内容はこんな感じ。

<IfModule mod_proxy.c>
ProxyRequests On
ProxyVia Off
Listen 8888

<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Proxy>
</IfModule>

<IfModule mod_cache.c>
<IfModule mod_disk_cache.c>
CacheRoot /opt/cache
CacheEnable disk /
CacheDirLevels 5
CacheDirLength 3

CacheIgnoreCacheControl On
CacheIgnoreNoLastMod On
CacheStoreNoStore On
CacheStorePrivate On

Header set Expires "Thu, 01 Jan 2099 00:00:00 GMT"
</IfModule>

<IfModule mod_mem_cache.c>
CacheEnable mem /
MCacheSize 4096
MCacheMaxObjectCount 100
MCacheMinObjectSize 1
MCacheMaxObjectSize 2048
</IfModule>

CacheDisable http://security.update.server/update-list/
</IfModule>

ちょっとキャッシュを強めにした設定なので、リロード程度じゃ内容は書き換わりません!w
設定がかけたら、sudo apachectl restart で Apache を再起動すると設定が読み込まれます。
システム環境設定のネットワークの中にあるプロキシ設定で 127.0.0.1:8888 を設定すれば OK です。ちなみに除外設定は下記のとおりです。

*.local, 169.254/16, 127.0.0.1, *.yimg.jp, *.adobe.com, *.mozilla.com, *.asahicom.jp, *.amazonaws.com, *.hatena.ne.jp, *.hateblo.jp

キャッシュフォルダにキャッシュが溜まっていく様子は、下記のコマンドで容量を見れます。

sudo du -sh /opt/cache

MacBook Air上ではうまく動作しています。Mac miniにも同じ設定をして、家庭内 LAN 上で利用しようと思いましたが、iOS 端末ではそのままではうまく動作しませんでした。なんか api.twitter.com とかうまく動作せず、Twitter クライアントが接続できなくなったりしました。これは下記のような .pac を作って回避出来ました。

function FindProxyForURL(url, host)
{
  //Access images directly
  if (host == "api.twitter.com") return "DIRECT";

  //For everything else use stg proxy
  return "PROXY [192.168.0.1:8888]";
}

でも、結局 Mac mini でのキャッシュサーバは、やめました。
同時接続していると Mac miniカーネルパニックになる現象が2回発生したので、設定を外して様子を見ています。