🐥

nginxとPCREについて

2022/03/26に公開

需要があるか分からないのですが、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を使って大丈夫なのか

https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/

ドキュメントによるとこうあります。

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