goのhttputil.ReverseProxyでunix domain socketにプロキシする
自社では激しくngx_mrubyを利用しているのだが、以下の問題があり、移行先にgoでプロキシを書いている。
- メンテナが社内には僕しかいないので、僕が5兆円得てしまった時点で引退してしまい、破滅
- あまり自社のrubyスクリプトにテストがない現状があり、ngx_mrubyのrubyスクリプトのテストを書きながら運用しようと思うと、リポジトリの構成を変えたり、mrbgemに切り出していく必要があり、それなりに手間がかかる
- 全社の至る所に似たような実装があり、それらを統合的に管理したい
そんなわけで、k1lowさんが rp という薄いhttputil.ReverseProxyのwrapperを書いています。
このときにバックエンドに、unix domain socketでトラフィック流したい時があるのですが、そう言うときは、transportをピッとやってやればおk.
unixSocketPath := strings.Replace(someUpstream, "unix://", "", 1)
t.DialContext = func(ctx context.Context, network, address string) (net.Conn, error) {
return net.Dial("unix", unixSocketPath)
}
加えて、URL.Hostもこんな感じで。
req.URL.Host = strings.Replace(someUpstream, "unix://", "", 1)
こう言う細かいところまで書いていくと、nginx、よく出来てるようなぁなどと思ったりもする。