「LuaをWebサーバーで動かしたい」
「OpenResty上でLuaを機能するようにしたい」
「高速なWebサーバーを作りたい」
このような場合には、この記事の内容が参考となります。
この記事では、OpenResty(nginx)でLuaを動かす方法を解説しています。
本記事の内容
- OpenResty(nginx)でLuaを動かす前提
- restyコマンドでLuaを動かす方法
- HTTPサーバーでLuaを動かす方法
それぞれを下記で説明します。
OpenResty(nginx)でLuaを動かす前提
OpenRestyをインストール済みにしておいてください。
OpenRestyのインストールは、次の記事で説明しています。
また、Luaについて理解しておく必要があります。
Luaについては、次の記事で解説しています。
なお、Luaを別途インストールする必要はありません。
今回は、OpenRestyに付随するLuaを利用します。
以上、OpenResty(nginx)でLuaを動かす前提を説明しました。
次は、restyコマンドでLuaを動かしてみましょう。
restyコマンドでLuaを動かす方法
OpenRestyがインストール済みなら、restyコマンドが利用できます。
バージョンを確認するには、次のコマンドを実行します。
$ resty -V resty 0.28 nginx version: openresty/1.19.9.1 built with OpenSSL 1.1.1k 25 Mar 2021 (running with OpenSSL 1.1.1l 24 Aug 2021) ・・・
restyのヘルプは、以下。
$ resty -h resty [options] [lua-file [args]] Options: -c NUM Set maximal connection count (default: 64). -e PROG Run the inlined Lua code in "prog". --errlog-level LEVEL Set nginx error_log level. Can be debug, info, notice, warn, error, crit, alert, or emerg. --gdb Use GDB to run the underlying nginx C process. --gdb-opts OPTS Pass extra command-line options to GDB. --help Print this help. --http-conf CONF Specifies nginx.conf snippet inserted into the http {} configuration block (multiple instances are supported). --http-include PATH Include the specified file in the nginx http configuration block (multiple instances are supported). -I DIR Add dir to the search paths for Lua libraries. -j dump Use LuaJIT's jit.dump module to output detailed info of the traces generated by the JIT compiler. -j off Turn off the LuaJIT JIT compiler. -j v Use LuaJIT's jit.v module to output brief info of the traces generated by the JIT compiler. -l LIB Require library "lib". --main-conf CONF Specifies nginx.conf snippet inserted into the nginx main {} configuration block (multiple instances are supported). --main-include PATH Include the specified file in the nginx main configuration block (multiple instances are supported). --nginx Specify the nginx path (this option might be removed in the future). --no-stream Disable the stream {} configuration in auto-generated nginx.conf. --ns IP Specify a custom name server (multiple instances are supported). --resolve-ipv6 Make the nginx resolver lookup both IPv4 and IPv6 addresses. --rr Use Mozilla rr to record the execution of the underlying nginx C process. --shdict 'NAME SIZE' Create the specified lua shared dicts in the http configuration block (multiple instances are supported). --stap Use sysetmtap to run the underlying nginx C process. --stap-opts OPTS Pass extra systemtap command line options. --user-runner CMD Use CMD as user runner for the underlying nginx process. -V Print version numbers and nginx configurations. --valgrind Use valgrind to run nginx. --valgrind-opts OPTS Pass extra options to valgrind. For bug reporting instructions, please see: <https://openresty.org/en/community.html> Copyright (C) Yichun Zhang (agentzh). All rights reserved.
では、restyコマンドを使って「Hello World」を実行します。
実行するのは、次のコマンドとなります。
resty -e 'print("hello, world")'
上記コマンドを実行した結果は、以下。
$ resty -e 'print("hello, world")' hello, world
ただ、これだけでは本当にLuaが動いているかわかりづらいです。
よって、次のコマンドでLuaの感じをもっと出しましょう。
$ resty -e 'print(_VERSION)' Lua 5.1
実行されるLuaのバージョンを表示しています。
これでLuaが動いていることを実感できるでしょう。
以上、restyコマンドでLuaを動かす方法を説明しました。
次は、HTTPサーバーでLuaを動かします。
HTTPサーバーでLuaを動かす方法
OpenRestyと言えば、一般的にはこちらのイメージになります。
HTTPサーバーでLuaを動かすためのモノが、OpenRestyということです。
そして、OpenRestyはnginxがそのベースとなっています。
nginxを改良してLuaがデフォルトで動くようにしたモノが、OpenRestyになります。
そのため、nginxと同じようにポート別にサイトを起動することが可能です。
デフォルトでは、OpenRestyはポート80で起動します。
今回の検証では、これとは別にサイトを用意することにします。
OpenRestyをインストールすると、nginxコマンドもインストールされます。
このnginxコマンドを用いて、ポート8080でサイトを動かします。
そして、そのサイトでLuaの動作確認を行います。
そのための手順は、以下。
- nginxコマンドへのパス設定
- ディレクトリの作成
- 設定ファイルの作成
- サイトの起動
それぞれを下記で説明します。
nginxコマンドへのパス設定
「/usr/local/openresty/nginx/sbin」
これをパスに通す必要があります。
都度設定するのは面倒なので、.bashrcに以下を追加します。
export PATH=/usr/local/openresty/nginx/sbin:$PATH
追加したら、反映します。
$ source .bashrc
反映したら、nginxコマンドを確認します。
$ which nginx /usr/local/openresty/nginx/sbin/nginx
これで、パスの設定は完了です。
ディレクトリの作成
ホームディレクトリ以下で作業を行います。
$ mkdir ~/work $ cd ~/work $ mkdir logs/ conf/
workディレクトリには、以下のディレクトリが作成されている状況です。
$ tree . ├── conf └── logs 2 directories, 0 files
設定ファイルの作成
nginxの設定ファイルを作成します。
$ nano conf/nginx.conf
nginx.conf
worker_processes 1; error_log logs/error.log; events { worker_connections 1024; } http { server { listen 8080; location / { default_type text/html; content_by_lua_block { ngx.say("<p>hello, world</p>") } } } }
内容は、portとcontent_by_lua_blockに注目です。
ポート80以外でサイトを起動させます。
今回は、8080でnginxを起動することになります。
Luaは、content_by_lua_block内に記述しています。
サイトの起動
現時点のwork以下の状況は、以下。
$ tree . ├── conf │ └── nginx.conf └── logs 2 directories, 1 file
ここまで用意できれば、次のコマンドを実行します。
以下コマンドでnginxによるサイトを起動することができます。
nginx -p $PWD
ポート8080が、開放されていることは前提とします。
その前提として、ブラウザで次のURLにアクセスしましょう。
http://サーバーIP:8080
アクセスすると、以下を確認できるはずです。
これにより、HTTPサーバー上でLuaの起動を確認できました。
まとめ
HTTPサーバーでLuaを動かすことができました。
しかし、まだLua感が足りません。
HTTPサーバー上でもLua感を出してみましょう。
まずは、ファイルの変更です。
nginx.confのcontent_by_lua_block内を変更します。
それ以外は、同じままです。
content_by_lua_block { ngx.say(_VERSION) }
では、設定ファイルを反映させます。
設定ファイルのリロードは、次のコマンドで行います。
$ nginx -p $PWD -s reload
再度、ブラウザでアクセスします。
Luaのバージョンが表示されれば、OKです。
以上、HTTPサーバーでLuaを動かす方法を説明しました。