OpenResty アプリケーション用の独自 Lua モジュールの作成方法
本日は、OpenResty アプリケーションで独自の Lua モジュールを作成する方法を、段階的にご紹介いたします。
まずは、シンプルな OpenResty アプリケーションを test-module
という新しいディレクトリに配置しましょう。
cd ~/
mkdir test-module/
cd test-module/
次に、通常通りサブディレクトリ構造を作成します。
mkdir logs conf lua
前回の「Hello World」サンプルとは異なり、今回は Lua モジュールファイルを格納するための lua/
ディレクトリを作成していることにご注意ください。
それでは、lua
サブディレクトリ内に hello.lua
という名前の独自 Lua モジュールファイルを作成しましょう。
vim lua/hello.lua
以下の編集作業を行います:
- Lua モジュールテーブル
_M
を宣言します。 - このLua モジュールに
greet
という関数を追加します。 - 最後に、モジュールテーブルを返すことを忘れずに。
local _M = {}
function _M.greet(name)
ngx.say("Greetings from ", name)
end
return _M
これで、シンプルな Lua モジュールが完成しました。
次は nginx.conf
設定ファイルを作成します。
vim conf/nginx.conf
以下の編集作業を迅速に行います:
- 基本的な設定を素早く記述します。
http {}
設定ブロック内で、OpenResty に Lua モジュールの場所を指定します。- 特殊変数
$prefix
は実行時に nginx の-p
オプションの値に置き換えられることに注意してください。 - 次に、8080 ポートをリッスンする HTTP サーバーを作成します。
- ルートロケーションに
content_by_lua_block
を設定します。 - ここでは
require
組み込み関数を使用して Lua モジュールhello
をロードします。 - 引数を 1 つ指定してその
greet
関数を呼び出します。
worker_processes 1;
events {
worker_connections 1024;
}
http {
lua_package_path "$prefix/lua/?.lua;;";
server {
listen 8080 reuseport;
location / {
default_type text/plain;
content_by_lua_block {
local hello = require "hello"
hello.greet("a Lua module")
}
}
}
}
ここで、ディレクトリツリー全体を確認しましょう。
tree .
良さそうですね。
では、この OpenResty アプリケーションを起動します。
nginx -p $PWD/
curl
コマンドラインツールを使用して HTTP インターフェースをクエリする時です。
curl 'http://127.0.0.1:8080/'
素晴らしい、Lua モジュールが動作し始めました。
ウェブブラウザでもテストできます。
500 エラーページが表示された場合、Lua コードにエラーがある可能性があります。
その場合、logs
サブディレクトリ内の error.log
ファイルを確認する必要があります。
tail logs/error.log
ここでは、予想通りエラーメッセージはありません。
注目すべき点は、Lua モジュールが最初のリクエストで読み込まれ、その後のリクエストではメモリにキャッシュされた Lua モジュールを使用することです。 最初のリクエストの追加オーバーヘッドを避けるために、サーバー起動時に Lua モジュールを事前にロードすることができます。
これを実現するには、nginx.conf
ファイルを編集する必要があります。
vim conf/nginx.conf
http {}
ブロック内に init_by_lua_block
ディレクティブを追加します。そのコンテキスト内で Lua モジュールをロードします。
http {
init_by_lua_block {
require "hello"
}
...
init_by_lua_block
は OpenResty サーバーの起動時に実行されます。
設定が正しいかテストしましょう。
nginx -p $PWD/ -t
問題ありません。
次に、nginx マスタープロセスに HUP
シグナルを送信してサーバーをリロードします。
kill -HUP `cat logs/nginx.pid`
マスタープロセスのプロセス ID は、この nginx.pid
ファイルに格納されています。
再度 HTTP リクエストを送信します。
curl 'http://127.0.0.1:8080/'
同じ動作ですが、今回は少し速くなりました。
著者について
章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。
章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty XRay(マイクロサービスおよび分散トラフィックに最適化された多機能
翻訳
英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!