Nginx + Lua 请求解析并转发请求

关键词:

  • nginx + lua 脚本
  • lua 获取 http 请求参数
  • lua + cjson 的使用
  • lua + resty.http 发送 http 请求
  • resty.http 与 socket.http

需求:
一个数据请求,携带数据标识(标识内含有平台信息)参数,去不同的平台获取对应的数据。数据存放再不同的平台上。

设计:
用 nginx 向外提供统一接口,在 nginx 内用 lua 脚本获取请求参数,根据参数中的平台信息将请求发送给不同的平台。

具体实现:
在 CentOS7 服务器上安装 nginx、lua、cjson、http 等库,然后进行各种测试(O.O)。

一、安装 Lua

在根目录下执行:

# 下载安装包
wget http://www.lua.org/ftp/lua-5.1.5.tar.gz

# 解压并进入文件
tar -xzvf lua-5.1.5.tar.gz
cd lua-5.1.5

# 安装依赖库
yum install -y readline-devel ncurses-devel

# 指定安装的系统平台
make linux

# 安装
make install

# 验证是否安装成功
lua

在这里插入图片描述

二、安装 Nginx

在根目录下执行:

# 下载安装包
wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
wget http://nginx.org/download/nginx-1.14.0.tar.gz 

tar -xvf v0.3.0.tar.gz
tar -xvf v0.10.9rc7.tar.gz
tar -xvf nginx-1.12.1.tar.gz

# 进入 nginx-1.14.0 文件夹并进行编译
cd nginx-1.14.0
./configure --prefix=/usr/local/nginx --add-module=../ngx_devel_kit-0.3.0 --add-module=../lua-nginx-module-0.10.9rc7  --with-http_ssl_module  --with-http_stub_status_module  --with-http_gzip_static_module
# --prefix: 安装目录(可自定义)
# --add-moudle = :相应模块的目录(可自定义)

# 安装
make install
	
# 安装后启动 nginx ,访问服务器 ip 是否安装成功

# 在 nginx.conf 文件中加入一下代码验证 nginx 是否可以访问到 lua
location /hello{
       default_type 'text/plain';
       content_by_lua 'ngx.say("Hello Word!")';
}

# 访问 http://ip/hello

在这里插入图片描述

三、安装 cjson

在根目录下执行:

# 下载安装包
wget http://www.kyne.com.au/~mark/software/download/lua-cjson-2.1.0.tar.gz

# 解压
tar -xvf lua-cjson-2.1.0.tar.gz
cd lua-cjson-2.1.0

# 安装
make install  
# 此模块主要用来解析 http body 部分,即 json.decode、 json.encode

四、安装 resty.http

在根目录下执行:

# 从 github 上下载文件
git clone https://github.com/ledgetech/lua-resty-http.git

# 将 lua-resty-http/lib/ 下的 resty 文件夹上传至服务器一下目录下
/usr/local/share/lua/5.1/

# 此模块主要用来发送 http 请求
# 也可选用 socket.http

五、编写 lua 脚本解析请求参数,并根据参数转发请求

# 脚本  /home/lua/test.lua
--引入库
local cjson = require 'cjson'
local https = require 'resty.http'
local json = cjson:new()
--服务器一
local server_one_url = 'http://ip:端口号/自定义'
local server_one_code = 'ONE_CODE';
--服务器二
local server_two_url = 'http://ip:端口号/自定义'
local server_two_code = 'TWO_CODE';

--http post 请求方法
local function http_post(url, data)
    local http = https:new()
    local res, err = http:request_uri(url, {
        method = 'POST',
        body = data,
        headers = {
            ['Content-Type'] = 'application/json';
        }
    })

    if res.status == 200 then
        ngx.say(res.body)
    else
        ngx.say('服务器错误!')
    end
end

--获取请求参数
ngx.req.read_body()
local data = ngx.req.get_body_data()
local object = json.decode(data)

--解析参数并做转发
local serverCode = object.serverCode
if serverCode ~= nil and serverCode == server_one_code then
    http_post(server_one_url, data)
elseif serverCode ~= nil and serverCode == server_two_code then
    http_post(server_two_url, data)
else
    ngx.say('未知服务!')
end

六、nginx 配置

# 在 nginx.conf 文件中加入一下配置
location /lua {
    content_by_lua_file   '/home/lua/test.lua';
}

七、测试

# url
http:ip:端口号/lua

# method
POST

# headers.Content-Type
application/json

# body
{
    "serverCode": "ONE_CODE"
}

TES and Lakers!
Pure And Desirous!

@

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: openresty lua 可以通过 ngx.req.get_body_data() 函数来获取请求报文数据。如果请求报文是以 application/x-www-form-urlencoded 或 multipart/form-data 格式提交的,也可以通过 ngx.req.get_post_args() 函数来获取请求参数。如果请求报文是以 application/json 格式提交的,可以通过 ngx.req.get_body_data() 函数获取请求体数据,然后使用 json.decode() 函数将其解析Lua table。 ### 回答2: 要在OpenResty中接受请求报文数据,可以使用ngx.req模块。这个模块提供了处理请求内容的功能。 首先,我们可以使用ngx.req.get_method函数获取请求的方法,例如GET或POST。接下来,可以使用ngx.req.get_headers函数获取请求头的信息,例如User-Agent、Content-Type等。 要获取请求体的内容,可以使用ngx.req.read_body函数来读取请求体。然后,可以使用ngx.req.get_post_args函数来获取请求体的参数。如果请求体的类型是application/x-www-form-urlencoded,那么可以使用ngx.req.get_post_args函数直接获取参数。如果请求体是JSON格式,可以使用ngx.req.get_body_data函数获取请求体的原始数据,然后使用Lua中的json库进行解析。 另外,还可以使用ngx.req.get_uri_args函数来获取URL中的参数。这个函数返回一个Lua表,其中包含了URL中的所有参数。 除了获取请求报文数据,OpenResty还提供了ngx.req.set_header函数来设置请求头的信息。可以使用ngx.req.set_header函数来添加、修改或删除请求头的参数。 在处理完请求报文数据后,可以使用ngx.say函数来像客户端返回响应内容。可以将任何数据作为ngx.say函数的参数进行返回,包括字符串、数值、表等。 总结起来,通过ngx.req模块的函数,我们可以获取请求的方法、请求头、请求体、URL参数等请求报文数据,并且还可以设置请求头和返回响应内容。 ### 回答3: 在OpenResty中,可以通过使用ngx.req.get_body_data()方法接收请求报文数据。 ngx.req.get_body_data()方法用于获取请求报文主体的数据,并且可以在ngx_lua中方便地进行处理。 使用方法如下: local body_data = ngx.req.get_body_data() if body_data then -- 处理请求报文数据 -- ... else -- 请求报文没有主体数据 -- ... end 需要注意的是,ngx.req.get_body_data()方法只能获取请求报文中的主体数据,并不能获取请求报文的其他信息。如果需要获取其他请求信息,可以使用ngx.req.get_uri_args()获取查询参数,ngx.req.get_headers()获取请求头部信息,以及ngx.req.get_method()获取请求方法等。 在使用ngx.req.get_body_data()方法前,需要保证在nginx配置文件中已启用了请求体内容的接收。可以在http或server配置块中添加以下指令: http { # ... client_body_buffer_size 8k; client_max_body_size 8m; # ... } 以上是OpenResty Lua如何接收请求报文数据的方法。通过使用ngx.req.get_body_data()方法,我们可以方便地获取到请求报文的主体数据,并进行相应的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值