首先創建一個lua文件
ngx.log(ngx.ERR,"lua sucess");
在nginx配置文件中加:
啓動nginx:
也就是說這個腳本會在nginx啓動的時候執行。當然,一般用的不多,用的更多的是content_by_lua來指定lua實現什麼樣的內容,接下來試一下:
配置下nginx
新建lua腳本:
ngx.say("hello static item lua");
重啓後訪問配置的地址:
文件打開後是:
因爲沒有指定http的default type,所以默認是文件的形式,接下來指定一下:
重啓後:
對於OpenResty,我們之前已經介紹過了,他是由Nginx核心加很多第三方模塊組成的,默認集成了Lua開發環境,使得nginx可以作爲一個web server使用,藉助於nginx的事件驅動模型和非阻塞io,可以實現高性能的web應用程序。並且提供了大量的組件如Mysql、Redis、Memcached等,使nginx上開發web應用更方便更簡單。
實戰開始:
同樣新建lua腳本:
ngx.exec("/item/get?id=6");
nginx配置:
重啓nginx
所以ngx.exec相當於轉發。
接下來認識一下nginx shared dic,這是共享內存字典,所有worker進程可見,可以指定lru淘汰規則。
配置一下shared dic:
寫lua腳本:
function get_from_cache(key)
local cache_ngx = ngx.shared.my_cache
local value = cache_ngx:get(key)
return value
end
function set_to_cache(key,value,exptime)
if not exptime then
exptime = 0
end
local cache_ngx = ngx.shared.my_cache
local succ,err,forcible = cache_ngx:set(key,value,exptime)
return succ
end
local args = ngx.req.get_uri_args()
local id = args["id"]
local item_model = get_from_cache("item_"..id)
if item_model == nil then
local resp = ngx.location.capture("/item/get?id="..id)
item_model = resp.body
set_to_cache("item_"..id,item_model,1*60)
end
ngx.say(item_model)
配置nginx
結果:
這樣就減輕了應用服務器的壓力,但是相對的壓力也全都在nginx服務器上了。當然它的更新機制跟之前說的內存緩存一樣,並不是很好,因此時間還是變成了一個很重要的一環,或者用redis:
nginx對於redis只讀不寫,當讀不出來的時候就發給應用程序,由應用程序來寫,這樣對於髒讀的面就小了很多。甚至可以在擴展redis主從機後,只從slave上讀。
寫腳本:
local args = ngx.req.get_uri_args()
local id = args["id"]
local redis = require "resty.redis"
local cache = redis:new()
local ok,err = cache:connect("172.18.57.95",6379)
local item_model = cache:get("item_"..id)
if item_model == ngx.null or item_model == nil then
local resp = ngx.location.capture("/item/get?id="..id)
item_model = resp.body
end
ngx.say(item_model)
改配置:
運行結果都是一樣的,這裏不貼了。
當然在壓測過程中,redis的壓力會比較大,所以在生產環境中,我們可以用redis的cluster來分散壓力。