nginxでluaを使いたいなら何も考えずにOpenRestyを使うのがおすすめという話

OpenRestyはnginxでlua-nginx-moduleなど、他にも便利なモジュールを追加したnginxを簡単にビルドできるようにしてくれるプロダクトです。

もちろんOpenRestyを使用しなくてもlua-nginx-moduleを使うことはできます。lua-nginx-moduleをnginxのconfigure時に — add-moduleすればよいです。ただしLuaの実行環境も必要なのでThe LuaJIT Projectなどをnginxとは別にインストールする必要もあります。OpenRestyを使えばこれらのことを意識せずにlua-nginx-moduleを使用することができるので大変便利です。

これだけではありません。実際にプロジェクトで使うなら外部のミドルウェアと繋ぐなど複雑なことをさせたいでしょう。OpenRestyの公式サイトによると

をバックエンドと使用できるようにライブラリを用意してくれています。これらのライブラリはOpenRestyとは別に独立したライブラリとして公開されています。そのため必要なライブラリのみを読み込むという使い方も可能です。

しかしnginxも日々変更が入っています。そのため各種ライブラリのインストール方法なども日々変更されています。具体例を紹介します。

nginxのCHANGESによると

Changes with nginx 1.11.2 05 Jul 2016

*) Change: now nginx always uses internal MD5 and SHA1 implementations;
the --with-md5 and --with-sha1 configure options were canceled.

とあります。つまりnginx 1.11.2からはそれまで使えていたMD5とSHA1の機能が使えません。しかしMySQLと接続するlua-resty-mysqlはngx.sha1_binというlua-nginx-moduleで使用できる関数を使用しています。lua-nginx-moduleのREADMEを読めば分かるように

というようにSHA1のサポートをしていないnginxでは使用できません。つまりnginxのバージョンを上げるだけで、SHA1のサポートを有効にできなくなり、ngx.sha1_binを使用しているライブラリが動かなくなります。

これを解決するためにはlua-resty-coreを使用する必要があります。

lua-resty-coreを使用することでSHA-1サポートがないnginxでもngx.sha1_binを使用することができます。なので2017/07現在のnginxでlua-resty-mysqlを使用したい場合、lua-resty-coreもインストールする必要があります。しかしlua-resty-coreをインストールするのは少し手間がかかりますし、何よりこういった情報をいちいち追うのは大変です。ライブラリを使いたい場合は何も考えずにOpenRestyを使うのが一番よい方法です。

ちなみにnginxを簡単にビルドできるnginx-buildはOpenRestyにも対応しています。以下のようなコマンドで簡単にOpenSSL/PCRE/zlibを静的リンクしたOpenRestyを簡単にビルドすることができます。

./nginx-build -d work -openresty -pcre -openssl -zlib

まとめ

  • OpenRestyにバンドルされているライブラリは単体でも使えるようになっています
  • 使いたい場合は単体で使うより、OpenRestyを使うのが楽で確実です
  • nginx-buildはOpenRestyにも対応しています

将来の夢は隠居です

将来の夢は隠居です