Nginx and Lua
Fire Cloud Evil Godからの引用: 世界の武道において、壊れないものはありません、スピードだけが壊れません! Nginx の専門は速度であり、Lua の専門は速度です。この 2 つの組み合わせには、間違いなく速度の点で遺伝的な利点があります。
OpenResty は、Nginx と Lua を最初に組み合わせたもので、Lua を Nginx に組み込む ngx_lua モジュールがあり、Tengine にも ngx_lua モジュールが含まれていました。 2 つの違いについては、OpenResty は Nginx のバンドルですが、Tengine は Nginx のフォークです。 OpenRestyとTengineは両方とも中国人によって作成されたプロジェクトであることは言及する価値があります。前者は主にChun GeとXiaozheによって開発され、後者は主に淘宝によって管理されています。
OpenResty と Tengine の長所と短所については、各自で判断してください。以下の情報が参考になります。
Lua で接着された Nginx エコシステム
淘宝網の Nginx アプリケーション、カスタマイズ、開発の実践-
- Tech-Club での「Lua で接着された Nginx 生態環境」に関する Chun 兄弟の講演の記録を読むことをお勧めします。情報があります。
インストール
には、最新バージョンの Nginx、LuaJIT、ngx_devel_kit、ngx_lua およびその他のインストール ファイルが必要です。
Lua または LuaJIT をインストールすることも可能ですが、効率性の観点から LuaJIT をインストールすることをお勧めします。
shell> wget http://luajit.org/download/LuaJIT-.tar.gz
shell> tar zxvf LuaJIT-.tar.gz
shell> cd LuaJIT-
shell> make
shell> make install
デフォルトパスにインストールされているため、LuaJITに対応するlibやincludeは全て/usr/localディレクトリにあります。
shell> export LUAJIT_LIB=/usr/local/lib
shell> export LUAJIT_INC=/usr/local/include/luajit-
これで、Nginx をコンパイルできます:
shell> wget http://nginx.org/download/nginx-.tar.gz
shell> tar zxvf nginx-.tar.gz
shell> cd nginx-
shell> ./configure
--add-module=/path/to/ngx_lua \
--add-module=/path/to/ngx_devel_kit
shell> make
shell> make install
Nginx を起動して確認してください。運が悪いと、次のエラーが発生する可能性があります:
共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません
これは狂った状況? ldd コマンドを使用して確認できます:
shell> ldd /path/to/nginx
libluajit-.so => not foundこのような問題は通常、ldconfig コマンドを使用して解決できます: shell> echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
shell> ldconfig
Nginx を再度起動してみてください。問題ないはずです。 アプリケーション まず簡単なプログラムで準備を整えましょう。次のコードを Nginx の構成ファイル nginx.conf に追加し、Nginx を再起動して、参照して効果を確認します。 location /lua {
set $test "hello, world.";
content_by_lua '
ngx.header.content_type = "text/plain";
ngx.say(ngx.var.test);
';
}
ngx_lua を詳しく学ぶ前に、Brother Chun が書いた Nginx チュートリアルを注意深く読むことをお勧めします。 ここで重要なポイントについて説明します。Nginx 構成ファイルで使用される言語は、本質的に「手続き型」ではなく「宣言型」です。 Nginx がリクエストを処理するとき、命令の実行は命令が定義されたときの物理的な順序によって決まりません。Nginx で一般的に使用されるステージは、書き換えステージ、アクセス ステージ、コンテンツ ステージです。 、など。デモ コードの set 命令は rewrite ステージに属し、content_by_lua 命令は content ステージに属します。この 2 つの命令の順序を入れ替えてみても、プログラムは正常に実行できることがわかります。 Redis を使用して、より実践的な例を書いてみましょう。 まず、次の内容を含む Redis 構成ファイル config.json を作成する必要があります: {
"host": "",
"port": ""
}
次に、Lua を使用する構成ファイルを解析するスクリプト init.lua を作成します。
CJSON モジュール: local cjson = require "cjson";
local config = ngx.shared.config;
local file = io.open("config.json", "r");
local content = cjson.decode(file:read("*all"));
file:close();
for name, value in pairs(content) do
config:set(name, value);
end
説明: コードでは共有メモリが使用されているため、リクエストごとに構成ファイルを解析する必要はありません。 次に、Restyを使用してコンテンツをレンダリングするスクリプトcontent.luaを作成します。
Redis モジュール: ngx.header.content_type = "text/plain";
local redis = require "resty.redis";
local config = ngx.shared.config;
local instance = redis:new();
local host = config:get("host");
local port = config:get("port");
local ok, err = instance:connect(host, port);
if not ok then
ngx.log(ngx.ERR, err);
ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE);
end
instance:set("name", "laowang");
local name = instance:get("name")
instance:close();
ngx.say("name: ", name);
注: Resty Redis モジュールをベンダー ディレクトリに配置し、後で Nginx でセットアップすることをお勧めします。 最後に、Nginx 構成ファイルで設定する必要があります: lua_shared_dict config 1m;
lua_package_path "/path/to/vendor/?.lua;;";
init_by_lua_file /path/to/init.lua;
server {
lua_code_cache off;
location /lua {
content_by_lua_file /path/to/content.lua;
}
...
}
注: デバッグを容易にするために、lua_code_cache をオフにしました。実稼働環境の場合は、オンにする必要があります。 さらに、CJSON をインストールするときは、Makefile 内のヘッダー ファイルのパスに注意する必要があります。デフォルトは次のとおりです: PREFIX = /usr/local
LUA_INCLUDE_DIR = $(PREFIX)/include
LuaJIT をインストールする場合は、ヘッダー ファイルを対応するディレクトリにコピーすることをお勧めします。 : cp /usr/local/include/luajit-/* /usr/local/include/
… 最近参加した のプロジェクトは、Web ポーリング用のいくつかのインターフェイスを提供しており、すべて Nginx + Lua を使用して実装されていますが、サーバーは合計で十数台しかありませんが、毎日数十億のリクエストを提供できます。とてもパワフルな。 最後に、ある敗者の言葉を引用して締めくくりたいと思います。Lua は未婚の男性プログラマーのお気に入りです。 このエントリは、Lao Wang によってテクニカル カテゴリに公開され、Lua と Nginx のタグが付けられました。固定リンク お気に入りに追加します。
「NGINXとLUA」には29件のコメントがあります
以上、さまざまな側面を含めて nginx チュートリアルを紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。