2008年8月5日

NicoProxy2 と Squid を MacOSX 上で 組み合わせる

最近は元気が無いがニコニコ動画は面白い。Youtube や Veoh に上がってる動画も面白い。

しかし、動画のファイルサイズは HTML/CSS/JavaScript に比べて大きすぎるためか、 キャッシュプロクシとは本当に相性が悪すぎる。Squid でキャッシュ保存するサイズを大きめに取って対処していたのだが、、、どうも気持ちが悪い。

ニコニコ動画限定だが専用のキャッシュサーバ「NicoProxy2」が出てきている。そのうち、動画専用キャッシュサーバがぼこぼこ出て来るんかいなぁ。

なので、Squid と NicoProxy2 を組み合わせてみた。

ユーザは外部サイトを Squid を通してアクセスする状況で、Squid がニコニコ動画の動画リクエストのみNicoProxy2 に委託するのが目的。

NicoProxy2の立ち上げ

手軽に launchd 経由で立ち上げたいので daemondo が含まれる MacPorts を入れてく。

ソースを取ってきて、適当な場所に置く。

# ls -l /opt/local/etc/nicoproxy/
total 24
-rw-r--r--  1 root  admin   321 Aug  5 16:36 conf.yml
-rw-r--r--  1 root  admin  8062 Aug  5 18:58 nicoproxy.rb

もうこの状態で、conf.yml を弄れば、Proxy として機能すると思う。動作確認したら、launchd 用の定義ファイルとラッパースクリプトを書く。

/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/org.macports.nicoproxy.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>Debug</key>
	<false/>
	<key>Label</key>
	<string>org.macports.nicoproxy</string>
	<key>OnDemand</key>
	<false/>
	<key>ProgramArguments</key>
	<array>
		<string>/opt/local/bin/daemondo</string>
		<string>--label=nicoproxy</string>
		<string>--start-cmd</string>
		<string>/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper</string>
		<string>start</string>
		<string>;</string>
		<string>--stop-cmd</string>
		<string>/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper</string>
		<string>stop</string>
		<string>;</string>
		<string>--restart-cmd</string>
		<string>/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper</string>
		<string>restart</string>
		<string>;</string>
		<string>--pid=none</string>
	</array>
	<key>RunAtLoad</key>
	<false/>
</dict>
</plist>

/opt/local/etc/LaunchDaemons/org.macports.nicoproxy/nicoproxy.wrapper

#!/bin/sh

prefix=/opt/local
pidfile=/opt/local/var/run/nicoproxy.pid

Start()
{
	cd /opt/local/etc/nicoproxy
	ruby ./nicoproxy.rb &
	echo $! > $pidfile
}

Stop()
{
	kill `cat $pidfile`
}

Restart()
{
	Stop
	Start
}

Run()
{
case $1 in
  start  ) Start   ;;
  stop   ) Stop    ;;
  restart) Restart ;;
  *      ) echo "$0: unknown argument: $1";;
esac
}

Run $1

launchd に登録すれば、再起動しても自動的に上がってくれる筈?

# launchctl load -w /opt/local/etc/LaunchDaemons/org.macports.nicoproxy/org.macports.nicoproxy.plist
...
# launchctl list | grep nicoproxy    
62595	-	org.macports.nicoproxy
...
# ln -s /opt/local/etc/LaunchDaemons/org.macports.nicoproxy/org.macports.nicoproxy.plist /Library/LaunchDaemons/

まぁ、MacPorts に含まれていないのに、org.macports.XXXX なのは愛嬌ってことで。

Squid と連携する

Squid は、MacPorts のものを入れ、取り敢えず動かせる所まではやっておく。NicoProxy2 連携用に、次の設定を加える。但し、例では NicoProxy2 のポートは 25255に変えてあり、自身のホストがCNAMEとか追加して nicoproxy.example.com で引けるようになっているので、各自の環境に合わせる必要がある。

squid.conf

...
# nico proxy
acl nico url_regex -i ^http://www\.nicovideo\.jp/api/getflv/?
acl nico url_regex -i ^http://.*\.nicovideo\.jp/smile\?
cache_peer nicoproxy.example.com. parent 25255 0 proxy-only no-query
cache_peer_access nicoproxy.example.com. allow nico
never_direct allow nico

まとめ

NicoProxy2はon-the-flyでは転送しないのかぁ。。。

0 件のコメント:

Cocoa Emacs 24.3 構築 (2013/03版)

暫く使っている Cocoa Emacs を更新していなかったので、24.3 に上げてみた。 当てるパッチは inline patch と ポップアップフリーズ対応パッチ くらい。 24.3 には既にフルスクリーン実装が入っているので、よく使われているフルスクリーンパッチは外し...