OpenRestyで動的モジュールの追加を相対パス指定でできない問題を修正するPRを作りました

nginx-buildを使ってOpenRestyに動的モジュールの追加をすると動かないのでnginx-buildのバグでは?と言われて調べてみたら「いや、これはOpenResty側のバグでしょ」ってなったのでその話を書きます。

nginxは2016/2/9にリリースされたバージョン1.9.11から動的モジュールに対応しました。nginx-buildは動的モジュールの追加も簡単にできるようになっています。nginx-buildはOpenRestyにも対応しています。しかしOpenRestyで動的モジュールの追加を行うとするとなぜか動きません。

これはOpenResty側のスクリプトに原因があります。OpenRestyの configure はPerlのスクリプトになっています。そして内部的にcdを何回もしているので、nginx自体の ./configure に渡す前に相対パス指定のパスを絶対パスに変換してから渡しています。しかしその対象に --add-dynamic-module が含まれていなかったので相対パスのまま引き渡ってしまい、ディレクトリが見つからずにコンパイルが成功しません。

openresty/configure at master · openresty/openresty

nginx-buildも内部で os.Chdir を使ってcdをしているので、本質的にどこに原因があるのか分かりにくかったのですが、OpenRestyが他のオプションについては絶対パスに変換しています。またnginxのオプションでは相対パス指定で問題ありません。nginxと同じオプションを渡せるOpenRestyも当然処理できてしかるべきです。ということでOpenResty側にPRを出しました。

ちなみにnginx-buildはソースコードのディレクトリが存在すればダウンロード済みと判断します。なので1度実行してソースコードをダウンロードした後に手元でソースコードを変更してから動かせば動きます。もし使いたい場合はそういう対応をおすすめします。

nginx-build側でできる対応としては、対応されたバージョン以下のOpenRestyで動的モジュールの追加をする場合はnginx-build側で絶対パスに変換して渡すようにすることが考えられます。ただOpenResty側で対応がされるのならコード上は変えなくてもいいかなーという気持ちです。

ちなみに余談ですが、前述の通りOpenRestyは内部的に相対パス指定を絶対パスに変換してからnginxの ./configure オプションに渡しているのでOpenSSLやpcreなどを静的リンクにしたnginxの nginx -V の結果を確認するとコンパイル時のディレクトリが表示されます。これの回避方法は多分ないです。気になるならDockerでビルドするなどの対応をするしかないと思います。

それと前述の通り、動的モジュールが追加されたのは2016/2/9の話です。OpenRestyが未だに相対パス指定に対応してないことを考えると、あまり使われてないのかもしれません。動的モジュールの運用をしている方の意見を聞きたい気持ちです。

2018/02/26 追記

マージしてもらえました!

2018/02/26現在の最新版がv1.13.6.1ですが、おそらくその次のリリースで取り込まれたものがリリースされると思います。

2018/07/27 追記

2018/5/15にリリースされたv1.13.6.2に今回のパッチは含まれています。ChangeLogにも記載があります。

これ以降のバージョンであればパッチを当てる必要はありません。

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store