nginxとPCREについて
需要があるか分からないのですが、nginxを自分でbuildしている人はpcre周りに翻弄されていると思うので、軽くまとめておきます。
忙しい人のためのまとめ
- PCREは既にメンテナンスが終了しているが、nginxの1.21.5未満のバージョンはPCREに依存している
- 1.21.5以降はPCRE2を利用するようになったが、安定版の1.20系には多分backportされないので安定版を利用したい場合は1.22系のリリースを待つ必要がある
- nginx-buildはv0.11.16で-pcreオプションをサポートしなくなり、v0.12.0でPCRE2だけのサポートをするようになったので、現在のnginx-buildでは安定版の1.20系はbuildできない(PCREを動的リンクすれば大丈夫だけど)
免責事項
私はnginx-buildのCollaboratorではありますが、公式見解とかそういうのではありません。そもそも個人が作成したOSSなので自己責任で使ってください。それと執筆時点(2022/03/26)の情報です。
PCREがダウンロードできなくなった
古いPCREがHTTPサーバーで配信されなくなりました。SourceForge経由で一応ダウンロードはできますが、プログラムで自動ダウンロードするのは困難です(やり方を知っている人がいたら教えてください)。
nginx-buildはHTTP経由でPCREを自動でダウンロードする機能がありましたが、この変更により動かなくなりました。
nginx側もこれまで先送りにしてきたPCRE2対応を開始し、Mainline versionの1.21.5でPCRE2を利用できるようになりました。しかしnginxはStable versionに関してはかなり保守的な運用を行っているため、基本的にMainlineからbackportはされません。なのでこの変更に関してもおそらくbackportはされないと思われます。
この件でnginx-buildはv0.11.16で-pcreオプションを動かなくする変更を入れています。しかし個人的にはこの変更が正しかったのかは疑問です。どうやってもいい対応にはならないので仕方ないとは思いますが、nginx-buildは事前にファイルを配置しておけばダウンロード済みと判定する機能があるので、nginx/{nginx_version}/pcre-8.45.tar.gz
に古いPCREを配置した上でbuildすればbuildできました。しかしオプションが削除されたことにより、この手法も使えなくなってしまいました。
結局どうすればいいの?
多分方法としては2つあると思っています。
Mainline versionを使う
現状これが一番簡単です。Mainline versionであれば最新のnginx-buildを使用して1.21.5以上のバージョンを指定すればbuildできるはずです。
Stable versionを使う
この場合は少々トリッキーですが、nginx-buildのv0.11.15を利用して、かつnginx/{nginx_version}/pcre-8.45.tar.gz
にSourceForgeから手でダウンロードした8.45のpcreを配置した上でbuildすればbuildできると思います。
最新版のnginx-buildとの差分として機能差は特にないので多分問題はないと思います(自己責任でお願いします)。
Mainline versionを使って大丈夫なのか
ドキュメントによるとこうあります。
Mainline versionについて
it may also have some number of new bugs.
Stable versinについて
We recommend the stable version for production servers.
つまり本番環境では基本的にStable versionを使うことが推奨されています。Mainline versionでも大きな問題はないと思いますが、理解した上で利用しましょう。
Discussion