Nginx12 openresty使用lua-resty-http模組
阿新 • • 發佈:2022-11-30
1 簡介
在lua中操作http請求有兩種方式
第一種方式:使用通過ngx.location.capture 去方式實現
第二種方式:lua-resty-http,是用於訪問外部 Http 資源,外部 web 服務,RESTFul 等的輕量級 http 庫。因為openresty預設沒有引入lua-resty-http,所以需要自行下載。
2 下載安裝
2.1 下載解壓
https://github.com/ledgetech/lua-resty-http
2.2 上傳
將解壓後的下面三個檔案上傳到openresty/lualib/resty目錄下
3 http使用示例
3.1 修改nginx配置檔案
在http下加一行配置
resolver 8.8.8.8;
在server加一個location配置
location /http {
default_type text/html;
content_by_lua_file lua/lua-resty-http.lua;
}
3.2 新增檔案lua-resty-http.lua
內容
local http = require("resty.http")
local httpc = http.new()
local resp, err = httpc:request_uri("http://www.sogou.com", {
method = "GET",
path = "/web?query=resty.http",
headers = {
["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36 "
}
})
if not resp then
ngx.say("request error :", err)
return
end
ngx.status = resp.status
for k, v in pairs(resp.headers) do
if k ~= "Transfer-Encoding" and k ~= "Connection" then
ngx.header[k] = v
end
end
ngx.say(resp.body)
httpc:close()
3.3 訪問
4 lua-resty-http實現一致性hash負載均衡簡要示例
現在有兩個服務可以訪問,分別為192.168.28.111,192.168.28.112
4.1 修改ngxin配置檔案
在server下加一個location
4.2 新增檔案lua-resty-http-hash-lb.lua
內容
local http = require("resty.http")
local httpc = http.new()
-- 服務ip
local hosts = {"192.168.28.111","192.168.28.112"}
-- 獲取請求引數id
local item_id= ngx.var.id
-- 獲取id的hash值
local id_hash = ngx.crc32_long(item_id)
-- 取餘
local index = (id_hash % 2) +1
-- 發起請求,根據餘數確定向哪個服務發起請求
local resp, err = httpc:request_uri("http://"..hosts[index], {
method = "GET",
path = "/sogou?query=resty.http",
headers = {
["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36"
}
})
if not resp then
ngx.say("request error :", err)
return
end
ngx.say(resp.body)
httpc:close()
4.3 訪問
http://192.168.28.110:8099/hashlb?id=1
http://192.168.28.110:8099/hashlb?id=2
http://192.168.28.110:8099/hashlb?id=3
http://192.168.28.110:8099/hashlb?id=4
http://192.168.28.110:8099/hashlb?id=5
分別看實際訪問的哪個服務