- Nginx_Lua
- 1.1. Einführung
- 1.2
- 1.2.1. JIT-Plattform installieren
- 1.2.2. NDK und Lua_module
- 1.2.3. Kompilieren und installieren Sie Nginx
- 1.3. Nach dem Einbetten von Lua
- 1.3.1. Erkennungsversion
- 1.3.2. Hallo, Welt
- 1.3.3. Synchrone Form, asynchrone Ausführung
- 1.4. Nginx- und Lua-Ausführungssequenz
- 1.4.1. Nginx-Reihenfolge
- 1.4.2. Lua-Reihenfolge
- Grundlegende Syntax von Lua
- 2.1. Schlüsselwörter
- 2.2
- 2.2.1. Numerische Operationen
- 2.2.2. Zuweisungsoperationen
-
2.3. bedingte Urteilserklärung
- 2.3.1. wenn
- 2.3.3. während
-
- 2.4. Gemeinsame Strukturen
- 2.4.1. Tabelle
2.4.2. Lua-Tabelle leeres Urteil
1.1. Einführung- ngx_lua – Einbetten der Lua-Sprache in Nginx, um Lua bei der schnellen Entwicklung von Diensten basierend auf Nginx-Logik zu unterstützen
Dieses Modul ist nicht im Nginx-Quellpaket enthalten und muss selbst heruntergeladen, kompiliert und installiert werden. Verwenden Sie Lua 5.1 (Lua 5.2 wird derzeit nicht unterstützt) oder Luajit 2.0.
Nachdem die Lua-Unterstützung hinzugefügt wurde, ist die Entwicklung komplexer Module schnell und immer noch 100 % asynchron und nicht blockierend.
ngx_lua Wer verwendet:
Taobao, Tencent Finance, NetEase Finance, 360, Qunar.com usw.
CloudFlare, CNN, Wingify, Reblaze, Turner, Broadcasting System
Hauptentwickler dieses Projekts:
chaoslawful Taobao, Alibaba Grp.
agentzh CloudFlare
https://github.com/chaoslawful/lua - Nginx-Modul
1.2. Installation
1.2.1. JIT-Plattform installieren
JIT
LuaJIT
Herunterladen und kompilieren
通常,程序有两种运行方式:静态编译与动态直译。
静态编译的程序在执行前全部被翻译为机器码,而动态直译执行的则是一句一句边运行边翻译。
即时编译(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 11.2.2. NDK und Lua_moduleNDK (Nginx Development Kit). ) Modul Es handelt sich um ein Modul, das die Kernfunktionen des Nginx-Servers erweitert
是一个利用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 2Die Entwicklung von Modulen von Drittanbietern kann darauf basierend schnell implementiert werdenNDK bietet Funktionen und Makros zur Bewältigung einiger grundlegender Aufgaben. Reduzierung der Codemenge für die Modulentwicklung von Drittanbietern.
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.01.2.3. Kompilieren und installieren Sie Nginx1.3. Nach dem Einbetten von Lua
1.3.1 🎜 >1.3.2. Hallo Welt
Fügen Sie einen Standort zum Dienst in nginx.conf hinzu. 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.6wget -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 installDemo 4Benutzer, die auf http://localhost/test zugreifen, drucken den „Hello World“-Inhalt aus. ngx.say ist die Schnittstelle, die Lua dem Modul zur Verfügung stellt. 自己编译官方的 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]#Ähnlich gibt es ngx.log(ngx.DEBUG, ""), das Debugging-Informationen in error.log ausgeben kann.
Darüber hinaus können auch externe Skripte aufgerufen werden, genau wie beim Schreiben von PHP- und JSP-Anwendungen werden Geschäftsskripte separat in .php- oder .jsp-Dateien organisiert
location = /test {
content_by_lua '
ngx.say("Hello World")
ngx.log(ngx.ERR, "err err err")
';
} Datei Hallo. Der Inhalt von Lua ist wie folgt: Das Skript hier kann beliebig komplex sein, oder Sie können Luas eigene Bibliothek verwenden Liste der verfügbaren Module für Lua : http://luarocks.org/repositories/rocks/Die Installation ähnelt yum, es gibt auch ein Warehouse:location = /test2 {
content_by_lua_file conf/lua/hello.lua;
}luarocks install luafilesystem Nachdem Sie den obigen Befehl „lfs. so“ ausgeführt haben, kopieren Sie die Datei in den von nginx definierten LUA_PATH und verweisen Sie dann auf die
ngx.say("Hello World")-Bibliothek, um ihre Funktionen aufzurufen. 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/?.?;;';wobei „;;“ den ursprünglichen Suchbereich darstellt. Demo 51.3.3. Synchrone Form, asynchrone Ausführung Wir gehen davon aus, dass auf mehrere Datenquellen gleichzeitig zugegriffen werden muss und die Abfrage keine Abhängigkeiten aufweist , dann können wir Anfragen gleichzeitig stellenAuf diese Weise ist meine Gesamtverzögerung die Zeit, die die langsamste aller meiner Anfragen benötigt, und nicht die Überlagerung aller ursprünglichen Anfragezeiten1.4. Nginx- und Lua-Ausführungsreihenfolge1.4.1. Nginx-ReihenfolgeWenn Nginx jede Benutzeranfrage verarbeitet, verarbeitet es sie nacheinander in mehreren verschiedenen Phasen (Phasen), nicht gemäß der Reihenfolge in der Konfigurationsdatei. Der Prozess der Nginx-Anfrageverarbeitung ist in 11 Phasen unterteilt. Die Ausführungsreihenfolge ist Post-Read, Server-Rewrite, Find-Config, Rewrite, Post-Rewrite, Preaccess, Access . , Postzugriff, Testdateien, Inhalt, Protokoll.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 6ngx.location.capture 无法跨server进行处理, 只能在同一个server下的不同location。 Taobao hat ein Nginx-Entwicklungshandbuch geöffnet, das viele nützliche Informationen enthält
post-read:
读取请求内容阶段
Nginx读取并解析完请求头之后就立即开始运行
例如模块 ngx_realip 就在 post-read 阶段注册了处理程序,它的功能是迫使 Nginx 认为当前请求的来源地址是指定的某一个请求头的值。http://tengine.taobao.org/book/server-rewrite
Server请求地址重写阶段
当 ngx_rewrite 模块的set配置指令直接书写在 server 配置块中时,基本上都是运行在 server-rewrite 阶段find-config
配置查找阶段
这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间的配对工作。Das Google-Forum des Autors: 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 阶段有此要求的话。https://groups.google.com/forum/#!forum/openrestypreaccess
访问权限检查准备阶段
标准模块 ngx_limit_req 和 ngx_limit_zone 就运行在此阶段,前者可以控制请求的访问频度,而后者可以限制访问的并发度。access
访问权限检查阶段
标准模块 ngx_access、第三方模块 ngx_auth_request 以及第三方模块 ngx_lua 的 access_by_lua 指令就运行在这个阶段。
配置指令多是执行访问控制性质的任务,比如检查用户的访问权限,检查用户的来源 IP 地址是否合法1.4.2. Lua-Sequenzpost-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 响应的使命。Lua-Verarbeitungsstufen und Nutzungsumfang unter Nginx : log
日志模块处理阶段
记录日志Bitte beachten Sie die offizielle Dokumentation: http://wiki.nginx.org/HttpLuaModule2 Syntax2.1. Schlüsselwörter2.2.1. Zahlenoperationen
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
timer2.2.2 🎜>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:2.2.3. Logische Operationen
2.3. Bedingte Urteilsaussagen
2.3.1 >2.3.2. Wiederholen Sie
and break do else elseif
end false for function if
in local nil not or
repeat return then true until while2.3.3.
2.4 支持 +, -, *, /,^ 比如2^3 结果为8, 2^4结果为16。
连接两个字符串,用".."运处符, php为".", JAVA、C#为"+"2.4.1. Tabelle
a,b,c,d=1,2,3,4 -- 多变量一起赋值
a,b=b,a --交换变量功能
在默认情况下,变量总是认为是全局的。假如需要定义局部变量,则在第一次赋值的时候,需要用local说明。比如:
local a,b,c = 1,2,3 -- a,b,c都是局部变量;Beispiel 1
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模拟C语言中的语句:x = a? b : c,在Lua中,可以写成:x = a and b or c。
最有用的语句是: x = x or v,它相当于:if not x then x = v end 。;Beispiel 22.4.2 leeres Urteil
if 条件 then
...
elseif 条件 then
... else ...
endEs gibt oft solche Anforderungen im Skript lua des Projekts
repeat ... until 条件2.5. Referenzwhile 条件
do
...
end
Das Obige stellt die Verwendung und Weitergabe von Ngx_Lua vor, einschließlich des Inhalts. Ich hoffe, dass es für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.