@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Location: http://kyanny.hatenablog.jp/

先日から使い始めたはてなブログがたいへん気に入っているので、しばらくあちらをメインに更新していきます。はてなダイアリーに不満はないし、フィード購読者数などを考えるとすっぱり移転するのも考えものなので、当面は 302 Found というステータスですが、ゆくゆくは・・・というところです。

http://kyanny.hatenablog.jp/

trac-wiki.el

同僚が Vim から Trac の Wiki を編集する設定を紹介していたので、そういえば Emacs からも編集できるのあったよなと思ってやってみた。

だいたい http://d.hatena.ne.jp/tumf/20070102/1167720544 に従う。

Trac のバージョンとか XML-RPC プラグインは大丈夫とする。

権限の追加は (以下 root で作業)

# trac-admin /path/to/trac .
> permission list                 # 権限一覧確認
> permission add kyanny XML_RPC   # 自分のアカウントに XML_RPC 権限を付与

trac-wiki.el はなんか配布元の URL がかわってリンクが切れてることは覚えてるんだけど (苦労した) ただしい URL がわからないので https://github.com/kyanny/emacs-config/blob/master/dot.emacs.d/auto-install/trac-wiki.el にあるのを使えばよい。

てきとうに ~/.emacs.d/init.el あたりに以下のような感じで記載。 /login を末尾につけないといけなかった(末尾はスラッシュありなしどっちでもよさそう)これは http://www.ryuzee.com/contents/blog/608 を読んで確認したりした。

(require 'trac-wiki)
(trac-wiki-define-project
 "proj"
 "http://127.0.0.1/trac/proj/login/")

/login がないとき 403 がかえってきて XML_RPC 権限がないというエラーが表示されて原因の切り分けに苦労した。 Ruby で簡単な XMLRPC クライアントを書いて権限ついてるか確認したりした。

#!/usr/bin/env ruby
require 'xmlrpc/client'

client = XMLRPC::Client.new2('http://user:pass@127.0.0.1/trac/proj/login/xmlrpc')
p client.call2('wiki.getAllPages')

あとはふつうに M-x trac-wiki で。キーバインドとかもちょっとかわってるみたいで Outline-mode が有効になってていろいろ乗っ取られてるので C-x C-s と M-x trac-wiki-commit だけ覚えておけばよい。

nginx は 複数の URL が含まれた X-REPROXY-URL ヘッダを扱えない

Perlbal には、リバースプロキシとして利用しているときバックエンドが X-REPROXY-URL というヘッダに「ファイルの実体の URL」を入れてレスポンスを返すと Perlbal が改めてその URL にリクエストして (reproxy) 実体をとってきてからクライアントに返す、という機能があり、画像や動画などファイルサイズが大きい静的コンテンツを配信するのに便利なのでよく使われている。特に MogileFS と組み合わせて使う例がよくみられる。

この X-REPROXY-URL ヘッダによる reproxy 機能は Perlbal 以外のウェブサーバでもサポートされていて、 nginx でも扱うことができる (ApacheLighttpd でも対応したモジュールがある) できるんだけどリバースプロキシを Perlbal から nginx に変更したら X-REPROXY-URL ヘッダの扱いの違いでちょっと問題がおこり対応したのでメモ。

まず nginx で X-REPROXY-URL ヘッダによる reproxy 機能を利用するには http://d.hatena.ne.jp/perezvon/20080418/1208531594 にあるように nginx.conf で reproxy 専用の内部的な URL を宣言してやって (location /reproxy { ... } のところ) バックエンドからは X-Accel-Redirect ヘッダでその内部的な URL も指定する必要がある。 http://d.hatena.ne.jp/sfujiwara/20110406/1302077166 にも具体的な例が載っている。

Perlbal の場合は X-REPROXY-URL ヘッダにホワイトスペース区切りで複数の URL を含められる http://cpansearch.perl.org/src/DORMANDO/Perlbal-1.79/doc/reproxying.txt しかし nginx の場合は単一の URL でないとだめなようで、バックエンド側で文字列操作をして URL をひとつに加工してからレスポンスを返したらうまくいった。デバッグで追いきれてないので想像だけど、おそらく "http://foo.com:80/resource.html http://baz.com:8080/res.htm" というような単一の URL だとみなして reproxy してしまっているのだと思う。

ちなみに Perlbal に対して複数の URL を含む X-REPROXY-URL ヘッダを返すとどうなるかというと、順番に取得しにいって最初に 200 を返したコンテンツを配信するようになっている。 MogileFS はひとつのファイルを複数のストレージノードに分散して保存できるので同じコンテンツのコピーが複数存在することになり、 URL も複数存在しうるので、全部まとめて Perlbal に渡せるようにできているのだろう。