日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Nginx >内容正文

Nginx

Nginx与Lua

發布時間:2024/9/20 Nginx 80 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Nginx与Lua 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

火云邪神語錄:天下武功,無堅不破,唯快不破!Nginx的看家本領就是速度,Lua的拿手好戲亦是速度,這兩者的結合在速度上無疑有基因上的優勢。

最先將Nginx,Lua組合到一起的是OpenResty,它有一個ngx_lua模塊,將Lua嵌入到了Nginx里面;隨后Tengine也包含了ngx_lua模塊。至于二者的區別:OpenResty是Nginx的Bundle;而Tengine則是Nginx的Fork。值得一提的是,OpenResty和Tengine均是國人自己創建的項目,前者主要由春哥和曉哲開發,后者主要由淘寶打理。

至于OpenResty和Tengine孰優孰劣,留給大家自己判斷,如下資料可供參考:

  • ngx_openresty: an Nginx ecosystem glued by Lua
  • 淘寶網Nginx應用、定制與開發實戰

推薦看看春哥在Tech-Club上關于『由Lua粘合的Nginx生態環境』的演講實錄,有料!

安裝

需要最新版的Nginx,LuaJIT,ngx_devel_kit,ngx_lua等安裝文件。

安裝Lua或者LuaJIT都是可以的,但是出于效率的考慮,推薦安裝LuaJIT。

shell> wget http://luajit.org/download/LuaJIT-<VERSION>.tar.gz shell> tar zxvf LuaJIT-<VERSION>.tar.gz shell> cd LuaJIT-<VERSION> 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-<VERSION>

下面就可以編譯Nginx了:

shell> wget http://nginx.org/download/nginx-<VERSION>.tar.gz shell> tar zxvf nginx-<VERSION>.tar.gz shell> cd nginx-<VERSION> shell> ./configure--add-module=/path/to/ngx_lua \--add-module=/path/to/ngx_devel_kit shell> make shell> make install

試著啟動一下Nginx看看,如果你運氣不好的話,可能會遇到如下錯誤:

cannot open shared object file: No such file or directory

這是神馬情況?可以用ldd命令來看看:

shell> ldd /path/to/nginx libluajit-<VERSION>.so => not found

此類問題通常使用ldconfig命令就能解決:

shell> echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf shell> ldconfig

再試著啟動Nginx看看,應該就OK了。

應用

我們先用一個簡單的程序來暖暖場:把下面的代碼加入到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之前,建議大家仔細閱讀一遍春哥寫的Nginx教程。

這里我就說關鍵的:Nginx配置文件所使用的語言本質上是『聲明性的』,而非『過程性的』。Nginx處理請求的時候,指令的執行并不是由定義指令時的物理順序來決定的,而是取決于指令所屬的階段,Nginx常用的階段按先后順序有:rewrite階段,access階段,content階段等等。演示代碼中的set指令屬于rewrite階段,content_by_lua指令屬于content階段,如果試著把兩條指令的順序交換一下,會發現程序依然能夠正常運行。

下面我們嘗試結合Redis寫個更實戰一點的例子。

首先,我們需要創建一個Redis配置文件config.json,內容如下:

{"host": "<HOST>","port": "<PORT>" }

然后,我們創建一個解析配置文件的腳本init.lua,其中用到了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) doconfig:set(name, value); end

說明:代碼里用到了共享內存,這樣就不必每次請求都解析一遍配置文件了。

接著,我們創建一個渲染內容的腳本content.lua,用到了Resty 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 thenngx.log(ngx.ERR, err);ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE); endinstance:set("name", "laowang");local name = instance:get("name")instance:close();ngx.say("name: ", name);

說明:建議把Resty Redis模塊放到vendor目錄下,稍后在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-<VERSION>/* /usr/local/include/

我最近參與的一個項目,提供了一些用于Web輪詢的接口,都是用Nginx+Lua實現的,雖然總共只有十幾臺服務器,但是每天可以提供幾十億次的請求量,賊拉拉的強。

最后,讓我引用某位屌絲的語錄做結束語吧:Lua,未婚男性程序員的最愛。

此條目由 老王發表在 Technical分類目錄,并貼了 Lua、 Nginx標簽。將 固定鏈接加入收藏夾。

NGINX與LUA》上有44條評論


來源:https://huoding.com/2012/08/31/156

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Nginx与Lua的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。