Ngx_Lua の使用状況の共有

WBOY
WBOYオリジナル
2016-08-08 09:29:271742ブラウズ

  1. Nginx_Lua
    • 1.1. はじめに
    • 1.2.
      • 1.2.1. JIT プラットフォーム
      • 1.2.2. NDK と Lua_module
      • 1.2.3. Lua を埋め込んだ後、コンパイルしてインストールします。
      1.3.1. 検出バージョン
    • 1.3.2. Hello, World
      • 1.3.3. Nginx と Lua の実行シーケンス
      • 1.4.1. Nginx の注文
      • 1.4.2. Lua の注文
      • Lua の基本構文
      • 2.1. キーワード
      • 2.2.
    • 2.2.1. 数値演算
  2. 2.2.2. 論理演算
    • 2.3.
    • 2.3.1. if
      • 2.3.2. while
      • 2.4.
      • 2.4.1. テーブル
      2.4.2. Lua テーブルの空の判定
      • 1. Nginx_Lua
      • 1.1. - Lua言語はnginxに埋め込まれており、 nginx に基づいたビジネス ロジックを迅速に開発できるように Lua をサポートします
      • このモジュールは nginx ソース コード パッケージには含まれていないため、自分でダウンロード、コンパイル、インストールする必要があります。 lua 5.1 (lua 5.2 は現在サポートされていません) または luajit 2.0 を使用してください。
      Lua サポートを追加した後は、複雑なモジュールを速いサイクルタイムで開発でき、依然として 100% 非同期でノンブロッキングです。
    • ngx_lua 使用者:
      • Taobao、Tencent Finance、NetEase Finance、360、Qunar.comなど
      • CloudFlare、CNN、Wingify、Reblaze、Turner、Broadcasting System
      このプロジェクトの主な開発者:
    通常,程序有两种运行方式:静态编译与动态直译。 静态编译的程序在执行前全部被翻译为机器码,而动态直译执行的则是一句一句边运行边翻译。 即时编译(Just-In-Time Compiler)则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。 JAVA、.NET 实现都使用即时编译以提供高速的代码执行。 注意: 在nginx.conf中添加"lua_code_cache on/off",来开启是否将代码缓存,所以每次变更"*.lua"文件时,必须reload nginx才可生效。 仅针对"set_by_lua_file, content_by_lua_file, rewrite_by_lua_file, and access_by_lua_file"有效, 因为其他为写在配置文件 中,更改代码也必须reload nginx。在生产环境下,不能禁用cache。同时在lua代码中使用"dofile" 或 "loadfie" 来加载外部lua脚步 将不会对它进行缓存,应该使用"require"来代替。禁用cache,当且仅当在调式代码下。 demo 1
ダウンロードしてコンパイル

是一个利用JIT编译技术把Lua脚本直接编译成机器码由CPU运行 版本:2.0 与 2.1 当前稳定版本为 2.0。 2.1为版本与ngx_lua将有较大性能提升,主要是CloudFlare公司对luajit的捐赠。 FFI库,是LuaJIT中最重要的一个扩展库。 1. 它允许从纯Lua代码调用外部C函数,使用C数据结构; 2. 就不用再像Lua标准math库一样,编写Lua扩展库; 3. 把开发者从开发Lua扩展C库(语言/功能绑定库)的繁重工作中释放出来; demo 2

1.2.2. NDK と Lua_module

NDK (Nginx Development Kit) モジュールは、Nginx サーバーのコア機能を拡張するモジュールです

それに基づいて迅速に実装できます

NDK いくつかの基本的なタスクを処理し、サードパーティ モジュールによって開発されるコードの量を減らすための関数とマクロを提供します。

wget -c http://luajit.org/download/LuaJIT-2.0.2.tar.gz tar xzvf LuaJIT-2.0.2.tar.gz cd LuaJIT-2.0.2 make install PREFIX=/usr/local/luajit echo "/usr/local/luajit/lib" > /etc/ld.so.conf.d/usr_local_luajit_lib.conf ldconfig #注意环境变量! export LUAJIT_LIB=/usr/local/luajit/lib export LUAJIT_INC=/usr/local/luajit/include/luajit-2.0

1.2.3. Nginx

wget -c https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gz wget -c https://github.com/chaoslawful/lua-nginx-module/archive/v0.8.6.tar.gz tar xzvf v0.2.18 tar xzvf v0.8.6

1.3を埋め込んだ後、バージョン

wget -c http://nginx.org/download/nginx-1.4.2.tar.gz tar xzvf nginx-1.4.2.tar.gz cd nginx-1.4.2 ./configure --add-module=../ngx_devel_kit-0.2.18/ --add-module=../lua-nginx-module-0.8.6/ make make install

1.3.2を検出します。nginxのサービスに場所を追加します。会議

自己编译官方的 nginx 源码包,只需事前指定 LUAJIT_INC 和 LUAJIT_LIB 这两个环境变量。 验证你的 LuaJIT 是否生效,可以通过下面这个接口: location = /lua-version { content_by_lua ' if jit then ngx.say(jit.version) else ngx.say(_VERSION) end '; } demo 3 如果使用的是标准 Lua,访问 /lua-version 应当返回响应体 Lua 5.1 如果是 LuaJIT 则应当返回类似 LuaJIT 2.0.2 这样的输出。 不要使用标准lua,应当使用luajit, 后者的效率比前者高多了。 也可以直接用 ldd 命令验证是否链了 libluajit-5.1 这样的 .so 文件,例如: [root@limq5 sbin]# ldd nginx | grep lua libluajit-5.1.so.2 => /usr/local/luajit/lib/libluajit-5.1.so.2 (0x00007f48e408b000) [root@limq5 sbin]#

デモ 4

http://localhost/test にアクセスするユーザーは、「Hello World」コンテンツを出力します。

ngx.say は、lua によってモジュールに公開されるインターフェイスです。

同様に、デバッグ情報をerror.logに出力できるngx.log(ngx.DEBUG, "")もあります。

さらに、php や jsp アプリケーションを作成するときと同じように、外部スクリプトを呼び出すこともできます。ビジネス スクリプトは .php または .jsp ファイルに個別に編成されます

location = /test { content_by_lua ' ngx.say("Hello World") ngx.log(ngx.ERR, "err err err") '; }

hello.lua ファイルの内容は次のとおりです。

location = /test2 { content_by_lua_file conf/lua/hello.lua; }ここのスクリプトは必要に応じて複雑ですが、Lua 独自のライブラリを使用することもできます

lua で利用可能なモジュールのリスト:

http://luarocks.org/repositories/rocks/

インストールは次のようになりますうーん、ウェアハウスもあります:

luarocks install luafilesystem

Run 上記のコマンドの後、「lfs.so」ファイルがコンパイルされ、ファイルを nginx によって定義された LUA_PATH にコピーし、ライブラリを参照してそのライブラリを呼び出します。機能。

LUA_PATH:

lua_package_path '/opt/17173/nginx-ds/conf/lua/?.lua;;'

lua_package_cpath '/opt/17173/nginx-ds/conf/lua/lib/?.so; /usr/local/lib/?.?;;';

ここで、「;;」は元の検索範囲を表します。

デモ 5

1.3.3. 同期フォーム、非同期実行

複数のデータソースに同時にアクセスする必要があり、クエリに依存関係がないことを前提としているので、同時にリクエストを発行できます

このように、私の合計遅延時間は、元のすべてのリクエスト時間

ngx.say("Hello World")location = /api { content_by_lua ' local res1, res2, res3 = ngx.location.capture_multi{ {"/memc"}, {"/mysql"}, {"/postgres"} } ngx.say(res1.body, res2.body, res3.body) '; } demo 61.4のNginx実行順序

1.4.1を重ね合わせたものではなく、すべてのリクエストの中で最も遅いものにかかった時間です。

Nginx は、各ユーザーリクエストを処理する際、設定ファイル内の順序ではなく、いくつかの異なるフェーズに従って順番に処理されます。

Nginxリクエスト処理のプロセスは、

post-read、server-rewrite、find-config、rewrite、post-rewrite、preaccess、access、post-access、try-filesの11段階に分かれています。 、コンテンツ、ログ。

ngx.location.capture 无法跨server进行处理, 只能在同一个server下的不同location。post-read: 读取请求内容阶段 Nginx读取并解析完请求头之后就立即开始运行 例如模块 ngx_realip 就在 post-read 阶段注册了处理程序,它的功能是迫使 Nginx 认为当前请求的来源地址是指定的某一个请求头的值。server-rewrite Server请求地址重写阶段 当 ngx_rewrite 模块的set配置指令直接书写在 server 配置块中时,基本上都是运行在 server-rewrite 阶段find-config 配置查找阶段 这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间的配对工作。rewrite Location请求地址重写阶段 当 ngx_rewrite 模块的指令用于 location 块中时,便是运行在这个 rewrite 阶段。 另外,ngx_set_misc(设置md5、encode_base64等) 模块的指令,还有 ngx_lua 模块的 set_by_lua 指令和 rewrite_by_lua 指令也在此阶段。post-rewrite 请求地址重写提交阶段 由 Nginx 核心完成 rewrite 阶段所要求的“内部跳转”操作,如果 rewrite 阶段有此要求的话。preaccess 访问权限检查准备阶段 标准模块 ngx_limit_req 和 ngx_limit_zone 就运行在此阶段,前者可以控制请求的访问频度,而后者可以限制访问的并发度。access 访问权限检查阶段 标准模块 ngx_access、第三方模块 ngx_auth_request 以及第三方模块 ngx_lua 的 access_by_lua 指令就运行在这个阶段。 配置指令多是执行访问控制性质的任务,比如检查用户的访问权限,检查用户的来源 IP 地址是否合法post-access 访问权限检查提交阶段 主要用于配合 access 阶段实现标准 ngx_http_core 模块提供的配置指令 satisfy 的功能。 satisfy all(与关系) satisfy any(或关系)try-files 配置项try_files处理阶段 专门用于实现标准配置指令 try_files 的功能 如果前 N-1 个参数所对应的文件系统对象都不存在,try-files 阶段就会立即发起“内部跳转”到最后一个参数(即第 N 个参数)所指定的 URI.content 内容产生阶段 Nginx 的 content 阶段是所有请求处理阶段中最为重要的一个,因为运行在这个阶段的配置指令一般都肩负着生成“内容” 并输出 HTTP 响应的使命。log 日志模块处理阶段 记录日志init_by_lua http set_by_lua server, server if, location, location if rewrite_by_lua http, server, location, location if access_by_lua http, server, location, location if content_by_lua location, location if header_filter_by_lua http, server, location, location if body_filter_by_lua http, server, location, location if log_by_lua http, server, location, location if timer

タオバオは、多くの有益な情報を含むnginx開発マニュアルをオープンしました

http://tengine.taobao.org/book/

著者のGoogleフォーラム:https:// groups .google.com/forum/#!forum/openresty

1.4.2. Lua シーケンス

Nginx での Lua の処理段階と使用範囲:

init_by_lua: 在nginx重新加载配置文件时,运行里面lua脚本,常用于全局变量的申请。 例如lua_shared_dict共享内存的申请,只有当nginx重起后,共享内存数据才清空,这常用于统计。 set_by_lua: 设置一个变量,常用与计算一个逻辑,然后返回结果 该阶段不能运行Output API、Control API、Subrequest API、Cosocket API rewrite_by_lua: 在access阶段前运行,主要用于rewrite access_by_lua: 主要用于访问控制,能收集到大部分变量,类似status需要在log阶段才有。 这条指令运行于nginx access阶段的末尾,因此总是在 allow 和 deny 这样的指令之后运行,虽然它们同属 access 阶段。 content_by_lua: 阶段是所有请求处理阶段中最为重要的一个,运行在这个阶段的配置指令一般都肩负着生成内容(content)并输出HTTP响应。 header_filter_by_lua: 一般只用于设置Cookie和Headers等 该阶段不能运行Output API、Control API、Subrequest API、Cosocket API body_filter_by_lua: 一般会在一次请求中被调用多次, 因为这是实现基于 HTTP 1.1 chunked 编码的所谓“流式输出”的。 该阶段不能运行Output API、Control API、Subrequest API、Cosocket API log_by_lua: 该阶段总是运行在请求结束的时候,用于请求的后续操作,如在共享内存中进行统计数据,如果要高精确的数据统计,应该使用body_filter_by_lua。 该阶段不能运行Output API、Control API、Subrequest API、Cosocket API timer:and break do else elseif end false for function if in local nil not or repeat return then true until while

公式ドキュメントを参照してください:

http:// wiki.nginx .org/HttpLuaModule

2. Lua の基本構文

2.2. 演算

2.2.2. 代入演算

支持 +, -, *, /,^ 比如2^3 结果为8, 2^4结果为16。 连接两个字符串,用".."运处符, php为".", JAVA、C#为"+"

2. 2.3.論理演算

rrreerree

2.3.1. if

a,b,c,d=1,2,3,4 -- 多变量一起赋值 a,b=b,a --交换变量功能 在默认情况下,变量总是认为是全局的。假如需要定义局部变量,则在第一次赋值的时候,需要用local说明。比如: local a,b,c = 1,2,3 -- a,b,c都是局部变量

2.3.3. while

and, or, not 在Lua中,只有false和nil才计算为false,其它任何数据都计算为true,0也是true and 和 or的运算结果不是true和false,而是和它的两个操作数相关。 a and b:如果a为false,则返回a;a true 返回b a or b:如果 a 为true,则返回a;a false 返回b

2.4.

2.4.1 . table

模拟C语言中的语句:x = a? b : c,在Lua中,可以写成:x = a and b or c。 最有用的语句是: x = x or v,它相当于:if not x then x = v end 。

;例1

if 条件 then ... elseif 条件 then ... else ... end

;例2

repeat ... until 条件

2.4.2. Luaのテーブル空判定

プロジェクト

while 条件 do ... end

2.5のスクリプトLuaにはよくこのような要件があります。参考

りぃ

以上、Ngx_Lua の使い方と共有方法を内容も含めて紹介しましたので、PHP チュートリアルに興味のある方の参考になれば幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。