🗜️

zlib-ngをnginxで使うための現時点の手順メモ

に公開

zlib-ngをnginxで使いたかったので、やり方をメモしておきます。

zlibよりもzlib-ngのパフォーマンスが高いので、nginxでも利用したい人はいると思います。

https://www.phoronix.com/news/zlib-ng-2.3.1-Released

nginxで利用するためのpatchが公式で公開されています。

https://github.com/zlib-ng/patches/tree/master/nginx

しかし、ドキュメントもあまりなく、このpatchの利用方法が自分にはよく分かりません。もしやり方が分かる人は教えてください。

ただ、nginxのChangelogを見る限り、zlib-ng向けの変更も入っているので、使う方法はあるはずです。やり方が分からないなりにコンパイルする方法を探ってみたので、現時点でのやり方を書いておきます。

nginxとzlib-ngのざっくり整理

zlib-ngはデフォルトではzlib-ng独自APIしか利用できません。しかしzlib-compatモードを利用することで、zlibと互換性がある形で利用することができます。おそらくzlib-ng公式のpatchは、zlib-ngの独自APIで利用するためのpatchと思われます。

今回はzlib-compatモードで利用する方向で考えていきます。

それとnginxではzlibを動的リンクする方法と静的リンクする方法がありますが、今回は静的リンクをする方向を目指します。もしかしたら現状は動的リンクする方法しか考慮されていないのかもしれませんが、既にインストールされているzlibと衝突するのも面倒なので、nginxと静的リンクする前提で紹介します。

nginx本体に当てたpatch(PR#644)の概要

zlib-ngでzlib-compatモードを使うには、./configure時にオプションを渡す必要があります。しかし残念ながら、nginxではzlibのコンパイル時にzlibに対してコンパイルオプションを渡す方法がありません。

ということでnginxにpatchを当ててみました。

https://github.com/nginx/nginx/pull/644

--with-zlib-conf-optオプションを追加して、zlibのコンパイル時にコンパイルオプションを渡せるようにしています。

nginx-buildでコンパイルする

nginx-buildにzlib-ngのオプションを追加するPRを作っています。公式のコンパイル方法が分からないので、一旦WIPのPRのままにしています。

https://github.com/cubicdaiya/nginx-build/pull/177

これで-zlib-ngオプションが追加されるので、先程のPRのpatchを当ててコンパイルします。

% ./nginx-build \
  -c ./config/configure.zlibng.example \
  -pcre \
  -zlib-ng \
  -patch /tmp/nginx-pr-644.patch \
  -patch-opt "-p1"

渡すconfigureは例えば以下です。

configure
#!/bin/sh

./configure \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --with-zlib-conf-opt="--zlib-compat" \

これでコンパイルに成功しました。CIも追加しているので、興味ある人は見てみてください。

まとめと今後

現状の自分の結論は以下です。

  • zlib-ngのzlib-compatモードを利用することで、nginxでも利用できる
  • zlib-ngの公式のpatchは使い方がよく分からない
  • 現状nginxでzlibにコンパイルオプションを渡す方法がないので、静的リンクする場合にzlib-compatモードを有効にする方法がなく、nginx自体にpatchを当てる必要がある

この方法が合っているのかよく分からないので、NGINX Communityに投稿してみました。

https://community.nginx.org/t/using-zlib-ng-with-nginx-changelog-mentions-but-what-is-the-official-way/8432

ということで一旦、方法として合っているのかよく分かりませんが、とりあえずこれで利用できるということで。

Discussion