Lua获取Nginx的Post请求数据并写入Redis

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/happy_teemo/article/details/83105043

1.环境安装

1.lnmp.conf 设置 Enable_Nginx_Lua='y'。然后按通常情况安装。

2.lnmp ./addons.sh安装redis,如果连接远程redis服务器不用装。

3.安装lua 
ubuntu安装lua apt-get install lua 
centos安装lua
curl -R -O http://www.lua.org/ftp/lua-5.3.0.tar.gz
tar zxf lua-5.3.0.tar.gz
cd lua-5.3.0
make linux test
make install

如果readline.h不存在:
ubuntu: sudo apt-get install libreadline-dev 
centos: yum install libtermcap-devel ncurses-devel libevent-devel readline-devel

3.mkdir /usr/local/nginx/conf/lua 

4.下载 lua-resty-redis 和 dkjson.lua 。
cd lua-resty-redis  执行 make install
cp dkjson.lua  /usr/local/lib/lua

2.配置nginx

http:{
...
lua_package_path '/usr/local/lib/lua/?.lua;';
lua_package_cpath '/usr/local/lib/lua/?.so;'; #如果用cjson的话
...

server{
	location /lua
        {
		    lua_need_request_body on ;
		    default_type 'text/html';
		    content_by_lua_file conf/lua/test.lua;
        }
	}
...
}

3. 写lua代码

--ngx.say(package.path) --查看本文件的库路径
local redis = require "resty.redis"
local dkjson = require "dkjson"
--local cjson = require('cjson');


--创建实例
local redis_instance = redis:new()
--设置超时(毫秒)
redis_instance:set_timeout(3000)

--建立连接
local host = "127.0.0.1"
local port = 6379
local ok, err = redis_instance:connect(host, port)
if not ok then
	ngx.say("connect to redis error : ", err)
	return close_redis(redis_instance)
end

--Redis身份验证
local auth,err = redis_instance:auth("test123");
if not auth then
    ngx.say("failed to authenticate : ",err)
    return close_redis(redis_instance)
end

--选择库
local db,err = redis_instance:select("8");
if not db then
    ngx.say("failed to selectdb : ",err)
    return close_redis(redis_instance)
end

--Redis关闭
local function close_redis(redis_instance)
    if not redis_instance then
        return
    end
    local ok,err = redis_instance:close();
    if not ok then
        ngx.say("close redis error : ",err);
    end
end

--获取请求body数据
local request_method = ngx.var.request_method
local args = nil
local Body = nil
local CurTime = nil
local CheckSum = nil
local MD5 = nil
local host = nil

if "GET" == request_method then
    args = ngx.req.get_uri_args()
elseif "POST" == request_method then
    ngx.req.read_body()
    args = ngx.req.get_post_args()
    Body = ngx.req.get_body_data() 
end

--获取请求头信息
local receive_headers = ngx.req.get_headers()
for k, v in pairs(receive_headers) do
     if k == "host" then host = v end
     if k == "curtime" then  CurTime = v end
     if k == "checksum" then  CheckSum = v end
     if k == "md5" then  MD5 = v end
end
ngx.say(host)
--解析body
local obj,pos,err = dkjson.decode(Body,1,nil)
--ngx.say(obj.eventType, "<br/>")

local json_string = nil
if (obj.eventType == "1") or (obj.eventType == "5") then
	local a = {["CHECKSUM"] = CheckSum, ["CURTIME"] = CurTime, ["MD5"] = MD5,["Body"] = Body,["Host"] = host}
	json_string = dkjson.encode(a,{ indent = true })
	--ngx.say(a["CHECKSUM"])
	--json_string =( string.format("CHECKSUM:%s--&||&--CURTIME:%s--&||&--MD5:%s--&||&--BODY:%s",CheckSum,CurTime,MD5,Body) );
end

--如果是"name=11&sex=22"这样传的参数
--[[
for key, val in pairs(args) do
	if type(val) == "table" then
		ngx.say(key, ": ", table.concat(val, ", "))	
	else
		--ngx.say(key,':',val)
		--redis_instance.call('set',key)	
		end
	end
end
]]--

ngx.say(json_string)
redis_instance:lpush('post_list', json_string)
close_redis(redis_instance)

ngx.say("OK")





猜你喜欢

转载自blog.csdn.net/happy_teemo/article/details/83105043
今日推荐