OpenResty XRay がどのようにしてアプリケーションの問題特定と効率化を支援するかをご覧ください。

詳細はこちら LIVE DEMO

本日は、OpenResty アプリケーションで独自の Lua モジュールを作成する方法を、段階的にご紹介いたします。

スクリーンショット 1

まずは、シンプルな OpenResty アプリケーションを test-module という新しいディレクトリに配置しましょう。

cd ~/
mkdir test-module/
cd test-module/

screenshot 2

次に、通常通りサブディレクトリ構造を作成します。

mkdir logs conf lua

screenshot 3

前回の「Hello World」サンプルとは異なり、今回は Lua モジュールファイルを格納するための lua/ ディレクトリを作成していることにご注意ください。

それでは、lua サブディレクトリ内に hello.lua という名前の独自 Lua モジュールファイルを作成しましょう。

vim lua/hello.lua

以下の編集作業を行います:

  1. Lua モジュールテーブル _M を宣言します。
  2. このLua モジュールに greet という関数を追加します。
  3. 最後に、モジュールテーブルを返すことを忘れずに。
local _M = {}

function _M.greet(name)
    ngx.say("Greetings from ", name)
end

return _M

これで、シンプルな Lua モジュールが完成しました。

次は nginx.conf 設定ファイルを作成します。

vim conf/nginx.conf

以下の編集作業を迅速に行います:

  1. 基本的な設定を素早く記述します。
  2. http {} 設定ブロック内で、OpenResty に Lua モジュールの場所を指定します。
  3. 特殊変数 $prefix は実行時に nginx の -p オプションの値に置き換えられることに注意してください。
  4. 次に、8080 ポートをリッスンする HTTP サーバーを作成します。
  5. ルートロケーションに content_by_lua_block を設定します。
  6. ここでは require 組み込み関数を使用して Lua モジュール hello をロードします。
  7. 引数を 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 .

screenshot 22

良さそうですね。

では、この OpenResty アプリケーションを起動します。

nginx -p $PWD/

screenshot 24

curl コマンドラインツールを使用して HTTP インターフェースをクエリする時です。

curl 'http://127.0.0.1:8080/'

screenshot 25

素晴らしい、Lua モジュールが動作し始めました。

ウェブブラウザでもテストできます。

スクリーンショット 28

500 エラーページが表示された場合、Lua コードにエラーがある可能性があります。

その場合、logs サブディレクトリ内の error.log ファイルを確認する必要があります。

tail logs/error.log

screenshot 30

ここでは、予想通りエラーメッセージはありません。

注目すべき点は、Lua モジュールが最初のリクエストで読み込まれ、その後のリクエストではメモリにキャッシュされた Lua モジュールを使用することです。 最初のリクエストの追加オーバーヘッドを避けるために、サーバー起動時に Lua モジュールを事前にロードすることができます。

これを実現するには、nginx.conf ファイルを編集する必要があります。

vim conf/nginx.conf

http {} ブロック内に init_by_lua_block ディレクティブを追加します。そのコンテキスト内で Lua モジュールをロードします。

    http {
        init_by_lua_block {
            require "hello"
        }
        ...

screenshot 34

init_by_lua_block は OpenResty サーバーの起動時に実行されます。

設定が正しいかテストしましょう。

nginx -p $PWD/ -t

screenshot 37

問題ありません。

次に、nginx マスタープロセスに HUP シグナルを送信してサーバーをリロードします。

kill -HUP `cat logs/nginx.pid`

screenshot 39

マスタープロセスのプロセス ID は、この nginx.pid ファイルに格納されています。

再度 HTTP リクエストを送信します。

curl 'http://127.0.0.1:8080/'

screenshot 41

同じ動作ですが、今回は少し速くなりました。

著者について

章亦春(Zhang Yichun)は、オープンソースの OpenResty® プロジェクトの創始者であり、OpenResty Inc. の CEO および創業者です。

章亦春(GitHub ID: agentzh)は中国江蘇省生まれで、現在は米国ベイエリアに在住しております。彼は中国における初期のオープンソース技術と文化の提唱者およびリーダーの一人であり、Cloudflare、Yahoo!、Alibaba など、国際的に有名なハイテク企業に勤務した経験があります。「エッジコンピューティング」、「動的トレーシング」、「機械プログラミング」 の先駆者であり、22 年以上のプログラミング経験と 16 年以上のオープンソース経験を持っております。世界中で 4000 万以上のドメイン名を持つユーザーを抱えるオープンソースプロジェクトのリーダーとして、彼は OpenResty® オープンソースプロジェクトをベースに、米国シリコンバレーの中心部にハイテク企業 OpenResty Inc. を設立いたしました。同社の主力製品である OpenResty XRay動的トレーシング技術を利用した非侵襲的な障害分析および排除ツール)と OpenResty XRay(マイクロサービスおよび分散トラフィックに最適化された多機能ゲートウェイソフトウェア)は、世界中の多くの上場企業および大企業から高い評価を得ております。OpenResty 以外にも、章亦春は Linux カーネル、Nginx、LuaJITGDBSystemTapLLVM、Perl など、複数のオープンソースプロジェクトに累計 100 万行以上のコードを寄与し、60 以上のオープンソースソフトウェアライブラリを執筆しております。

翻訳

英語版の原文と日本語訳版(本文)をご用意しております。読者の皆様による他の言語への翻訳版も歓迎いたします。全文翻訳で省略がなければ、採用を検討させていただきます。心より感謝申し上げます!