1. 程式人生 > 其它 >Nginx12 openresty使用lua-resty-http模組

Nginx12 openresty使用lua-resty-http模組

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

  分別看實際訪問的哪個服務