CaddyでCGIを使うためのプラグイン、caddy-cgiを読んでみた。
そもそもなにがやりたかったのかというと、Caddyfileの中で、
cgi {
match /hello
exec {.}/app/cgi/hello.sh
env WORKDIR={.}/app/cgi
}
みたいな感じでCGIのルートディレクトリを環境変数WORKDIR
でCGIスクリプトに渡してCGIスクリプト側でcd ${WORKDIR}
しているところを、
cgi {
match /hello
exec {.}/app/cgi/hello.sh
workdir {.}/app/cgi
}
のような感じでCaddyfileでワーキングディレクトリを設定して、cd
した状態でCGIスクリプトを実行するようにさせたかった。
(systemd.execだとWorkingDirectory
というディレクティブがある)
caddy-cgiではいまのところ、このようなことはできないっぽいので、プラグインに修正を加えてできるようにしたい。
まず、caddy-cgiがどこでCGIスクリプトをexecしているのかを探す。
CGIなんだから、このプラグインの中でプロセスをexecしてるに違いない、と思ってcmdだとかexecだとかforkだとかのキーワードでgrepしてみたのだが、それっぽい箇所が見当たらず。
そこで、Caddyのフォーラムで質問してみたら、なんとcaddy-cgiの作者のjungさんが直々に答えてくれた。
(アイコン画像から察するに、jungさんは馬を連れているイケおじである)
jungさんによると、
caddy-cgi lets the Go standard library handle this part. See host.go
とのことだった。
これを頭において、もういちど読んでみる。
https://github.com/jung-kurt/caddy-cgi/blob/master/cgi.go#L154 が実際にCGIを実行している箇所っぽい。
cgiHnd
の出処を探す。
https://github.com/jung-kurt/caddy-cgi/blob/master/cgi.go#L103 の関数定義から、cgiHnd
の型はcgi.Handler
だとわかる。
cgi.Handler
の仕様を見てみる。
https://golang.org/src/net/http/cgi/host.go?s=1282:2432#L51 に
// Dir specifies the CGI executable's working directory.
// If Dir is empty, the base directory of Path is used.
// If Path has no base directory, the current working
// directory is used.
Dir string
とあるので、
https://github.com/jung-kurt/caddy-cgi/blob/master/cgi.go#L106 でCGIのワーキングディレクトリを設定していることになる。
そしたら、あとはCaddyfileのcgi
ディレクティブにサブディレクティブworkdir
を追加して、cgi.go#L106 でドキュメントルートを渡すかわりに、workdir
サブディレクティブで設定した値を渡すようにcaddy-cgiを修正すればよさそう。
と、ここまでわかったところで、jungさんから「dirってサブディレクティブ追加したるよ!できたら知らせるよ!」との返信があった。。。
超ありがたいが、プルリク送れるチャンスでわ!?と思ってたので、世の中そんなに甘くはなかった。
うーん、まあ、自分の学習のために自分でもやってみよっと・・・。
2019-03-19 追記:
https://caddyserver.com/download から落とせるビルド済みバイナリで、caddy-cgiのdirオプションが動作していることを確認できました。
Caddyfile
は以下のような感じになります。
cgi {
match /dirtest
exec {.}/app/cgi/dirtest.sh
#dir /Users/miminashi # 絶対パスも指定できる
dir ./app/cgi # 相対パス指定の場合は、caddyのワーキングディレクトリが起点になる
#dir {.}/app/cgi # これはダメ
}
ちなみに、diffはこんな感じだった。
メインの修正は思ってた通りの感じだったけど、テスト書いたりとか、ドキュメント修正したりもあるし、いきなりこれをやるのは自分にはちょっと難しかったかもしれない。
でも、このdiffを見たら、caddy-cgiに機能追加してプルリク投げるには何をしたらいいかがわかったし、今度なにか追加したくなったときの参考にしようと思う。
jungさん、本当にありがとうございました。