搜尋
首頁後端開發php教程Ngx_Lua使用分享

  1. Nginx_Lua
    • 1.1. 介紹
    • 1.2. 安裝
      • 1.2.1. 安裝JIT平台
      • 1.2.2. NDK與Lua_module
      • 1.2.3. 編譯安裝Nginx
    • 1.3. 嵌入Lua後
      • 1.3.1. 檢測版本
      • 1.3.2. Hello,World
      • 1.3.3. 同步形式,非同步執行
    • 1.4. Nginx與Lua執行順序
      • 1.4.1. Nginx順序
      • 1.4.2. Lua順序
  2. Lua基本語法
    • 2.1. 關鍵字
    • 2.2. 運算
      • 2.2.1. 數字運算
      • 2.2.2. 賦值運算
      • 2.2.3. 邏輯運算
    • 2.3.條件判斷語句
      • 2.3.1. if
      • 2.3.2. repeat
      • 2.3.3. while
      • 2.3.4. for
    • 2.4.
      • 2.4.1. table
      • 2.4.2. lua表空判斷
    • 2.5. 參考

把lua語言嵌入nginx中,使其支援lua來快速開發基於nginx下的業務邏輯

該模組不在nginx原始碼包中,需自行下載編譯安裝。使用lua 5.1(目前不支援lua 5.2) 或 luajit 2.0 。

添加lua支援後,開發複雜的模組,週期快,依然是100%非同步非阻塞。

ngx_lua 哪些人在用:

淘寶、騰訊財經、網易財經、360、去哪兒網等

CloudFlare, CNN, Wingify, Reblaze, Turner, Broadoboo

, Alibaba Grp.

agentzh CloudFlare

https://github.com/chaoslawful/lua-nginx-module

1.2. 安裝

1.2.1. 安裝

1.2. 安裝

1.2.1. 安裝

1.2.

通常,程序有两种运行方式:静态编译与动态直译。 静态编译的程序在执行前全部被翻译为机器码,而动态直译执行的则是一句一句边运行边翻译。 即时编译(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 21.2.2. NDK與Lua_module

NDK(Nginx Development Kit)模組是一個拓展NginxxgND

提供函數和巨集處理一些基本任務,減輕第三方模組開發的程式碼量。

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. 編譯安裝Nginxwget -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. 嵌入Lua後

1.3.1. 檢測版本

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. Hello,World

自己编译官方的 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]#

demo 4

用戶訪問 http://localhost/test 將會列印出「Hello World」內容。

ngx.say 是 lua 顯露給模組的介面。

類似的有 ngx.log(ngx.DEBUG, “”),可以在error.log輸出偵錯資訊。

另外也可以呼叫外部腳本,如同我們寫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/

安裝類似yum,它也有一個倉庫:

luarocks

安裝類似yum,它也有一個倉庫:lucks install luasystem上面指令後,會編譯一個「lfs.so」, 文件,拷貝文件到nginx定義的LUA_PATH中,然後引用

該函式庫,就可呼叫其中函數。

LUA_PATH:

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

lua_package_cpath '/opt/17173/cinx-lib/ /usr/local/lib/?.?;;';

其中」;;」代表原先找出範圍。

demo 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 6

1.4. Nginx與Lua執行順序

1.4.1. Nginx順序

Nginx 處理每一個用戶請求時,都是按照若干個不同階段(phase)依序處理的,而不是根據設定檔上的順序。

Nginx 處理請求的過程共分為11 個階段,依執行順序依序為

post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files 、content、log.

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 响应的使命。

淘寶有開放一個nginx開發手冊,裡麵包含很多有用的資料

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

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

.google.com/forum/#!forum/openresty

1.4.2. Lua順序

Nginx下Lua處理階段與使用範圍:

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

可參考官方文件:

wiki

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

可參考官方文件:

wiki .org/HttpLuaModule

2. Lua基本語法2.1. 關鍵字

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

2.2. 運算

2.2.1. 數字運算

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

2.2.2. 賦值運算

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.2.3. 邏輯運算

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

2.3. 條件判斷語句

2.3.1. if

repeat ... until 条件

2.3.2. repeat

while 条件 do ... end

2.3.3. while

for 变量=初值, 终点值, 步进 do ... end

for 变量1, 变量2, ... 变量n in 表或枚举函数 do ... end

2.3.3. while

1. table 是 lua 中最重要的数据类型。 2. table 类似于 python 中的字典。 3. table 只能通过构造式来创建

2.3.4. .1 . table

Lua代码 tab = { a = 10, b = 20, c = 30, d = 40 } print(tab["a"]) 注释: 1)table 中的每项要求是 key = value 的形式 2)key 只能是字符串, 这里的 a, b, c, d 都是字符串,但是不能加上引号 3)通过 key 来访问 table 的值,这时候, a 必须加上引号

;例1

tab = { 10, m = 20, 11, 12, 13 } print(tab[1]) = 10 print(tab[2]) = 11 print(tab[3]) = 12 print(tab[4]) = 13 获取表长度: print(table.getn(tab)) -> 4 print(#tab) -> 4 遍历表: for k, v in pairs(tab) do print(k, ":", v) end 1 : 10 2 : 11 3 : 12 4 : 13 m : 20 注释: 1)省略key,会自动以1开始编号,并跳过设置过的key 2)获取表长度,只有当表使用1自动编号开始,可以获取

;例2

local a = {} 判断表a是否为空,有提供api table.maxn(a) 或 #a 获取表a长度,但是该情况只 针对key为数字且安装递增方式。 对于自定义key的情况下,获取表长度将会失败,可通过lua内置 next函数解决该问题。

2.4.2. lua表空判斷

在專案的腳本lua中經常有這樣的需求

以上就介紹了Ngx_Lua使用分享,包含了面向的內容,希望對PHP教學有興趣的朋友有幫助。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP與Python:了解差異PHP與Python:了解差異Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

php:死亡還是簡單地適應?php:死亡還是簡單地適應?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來:改編和創新PHP的未來:改編和創新Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

您什麼時候使用特質與PHP中的抽像類或接口?您什麼時候使用特質與PHP中的抽像類或接口?Apr 10, 2025 am 09:39 AM

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?Apr 10, 2025 am 09:38 AM

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。Apr 10, 2025 am 09:37 AM

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP如何安全地上載文件?PHP如何安全地上載文件?Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

什麼是無效的合併操作員(??)和無效分配運算符(?? =)?什麼是無效的合併操作員(??)和無效分配運算符(?? =)?Apr 10, 2025 am 09:33 AM

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器