1.OpenResy简介和安装
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
简单地说OpenResty 的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应。
使用docker 创建实例
docker run -d --name="openresty-nginx" -p 8088:80 openresty/openresty
2.动态输出
首先看一下openresty安装目录下的nginx中的配置文件,如果有下面这一行:
include /etc/nginx/conf.d/*.conf
那就要先修改/etc/nginx/conf.d目录下的default.conf文件:
vim default.conf
在server中新增以下代码:
location /hello {
default_type text/html;
content_by_lua 'ngx.say("<p>hello, openresty</p>")';
}
docker容器中安装vim:
apt-get update
apt-get install vim
然后重新加载nginx
nginx -s reload
并访问http://localhost:8088/hello,得到:
可以看到使用lua输出的内容成功显示。
3.lua文件输出内容
上面的代码直接把lua代码写到nginx配置里面了,维护起来不是很方便,我们把它拿出来一个单独的文件,并放到nginx目录下面单独的lua目录下,方便管理。
首先在/usr/local/openresty/nginx下新建一个lua目录,然后创建一个hello.lua文件,文件内容为:
ngx.say("<p>hello, nginx_lua</p>")
然后修改/etc/nginx/conf.d/default.conf:
location /hello {
default_type text/html;
content_by_lua_file /usr/local/openresty/nginx/lua/hello.lua
}
再重新加载一下nginx,访问http://localhost:8088/hello,得到:
说明通过lua文件输出的内容也成功显示。
但是我们发现还有一个问题,如果想要处理很多个请求,那不是要在nginx里面配置N个location吗,我们肯定不会这么做,这里可以通过nginx动态匹配指定lua文件名。nginx配置文件default.conf修改一下:
location ~ /lua/(.+) {
content_by_lua_file /usr/local/openresty/nginx/lua/$1.lua;
}
这个时候访问http://localhost:8088/lua/hello可以得到:
lua后面的路径就是刚刚创建的hello.lua文件名。
然后我们在/usr/local/openresty/nginx/lua目录下新建一个goodbye.lua文件,内容为:
ngx.say("<p>goodbye, nginx_lua</p>")
这时访问http://localhost:8088/lua/goodbye可以得到:
4.接收参数
首先创建一个req.lua文件,内容如下:
local _M = {}
-- 获取http get/post 请求参数
function _M.getArgs()
-- 获取http请求方式 GET or POST
local request_method = ngx.var.request_method
-- 这里是一个table,包含所有get请求参数
local args = ngx.req.get_uri_args()
if "POST" == request_method then
-- 先读取请求体
ngx.req.read_body()
-- 这里也是一个table,包含所有post请求参数
local postArgs = ngx.req.get_post_args()
if postArgs then
for k, v in pairs(postArgs) do
args[k] = v
end
end
end
return args
end
return _M
然后先要在nginx.conf配置文件中的http部分加入 lua_package_path 的配置,也就是配置lua脚本的访问目录,还要注意一下格式:
lua_package_path "/usr/local/openresty/nginx/lua/?.lua;;";
再创建一个result.lua文件,内容如下:
-- 引入req模块
local req = require("req")
-- 获取请求参数列表
local args = req.getArgs()
-- 获取key为name的值
local name = args['name']
-- 如果不存在指定默认值
if name == nil or name == "" then
name = "nobody"
end
-- 输出结果
ngx.say("<p>hello " .. name .. "!</p>")
重新加载一下nginx,访问 http://localhost:8088/lua/result?name=xp,得到:
再访问一下http://localhost:8088/lua/result?name=openresty,得到:
可以看到成功解析参数。
参考:
http://www.itcast.cn/news/20200315/16130698949.shtml
https://wiki.jikexueyuan.com/project/openresty/