goのhttputil.ReverseProxyでunix domain socketにプロキシする

自社では激しくngx_mrubyを利用しているのだが、以下の問題があり、移行先にgoでプロキシを書いている。

  1. メンテナが社内には僕しかいないので、僕が5兆円得てしまった時点で引退してしまい、破滅
  2. あまり自社のrubyスクリプトにテストがない現状があり、ngx_mrubyのrubyスクリプトのテストを書きながら運用しようと思うと、リポジトリの構成を変えたり、mrbgemに切り出していく必要があり、それなりに手間がかかる
  3. 全社の至る所に似たような実装があり、それらを統合的に管理したい

そんなわけで、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、よく出来てるようなぁなどと思ったりもする。