OpenResty(nginx)でLuaを動かす

OpenResty(nginx)でLuaを動かす サーバー

「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を動かす方法を説明しました。

タイトルとURLをコピーしました