openresty(nginx+lua)初识
2024-10-02 19:38:07
1、新增项目配置文件:
vim /usr/example/example1.conf --将以下内容加入example1.conf
server {
listen 80;
server_name _;
#~ 表示匹配所有请求路径
#(\d+)/(\d+) 正则匹配
location ~ /lua_request/(\d+)/(\d+) {
#设置nginx变量
set $a $1;
set $b $host;
default_type "text/html";
#nginx内容处理
content_by_lua_file /usr/example/lua/lua_request.lua;
#内容体处理完成后调用
echo_after_body "ngx.var.b $b";
}
}
2、编写lua脚本(获取http请求信息)
vim /usr/example/lua/lua_request.lua --将以下内容加入lua_request.lua --nginx变量
--ngx.var nginx变量,如对变量ngx.var.b = 2赋值,需要提前声明。
--nginx location中使用正则捕获数组,所以可以使用ngx.var[index]获取,index:索引值,此索引值默认从1开始
local var = ngx.var
ngx.say("ngx.var.a :",var.a, "</br>")
ngx.say("ngx.var.b :",var.b, "</br>")
ngx.say("ngx.var[2] :",var[2], "</br>")
ngx.var.b=2; ngx.say("</br>") --请求头
--get_headers() 获取请求头,默认获取请求头的前100位,也可以使用get_headers(0)获取所有
local headers = ngx.req.get_headers()
ngx.say("headers begin","</br>")
--headers["请求头中的key值"]
ngx.say("Host :",headers["Host"],"</br>")
ngx.say("user-agent :",headers["user-agent"],"</br>")
ngx.say("user-agent :",headers.user_agent,"</br>")
for k,v in pairs(headers) do
if type(v) == "table" then
ngx.say(k,":",table.concat(v,","),"</br>")
else
ngx.say(k,":",v,"</br>")
end
end
ngx.say("headers end","</br>")
ngx.say("</br>") --get请求URI参数
ngx.say("uri args begin","</br>")
--get_uri_args() 获取请求参数
local uri_args = ngx.req.get_uri_args()
for k,v in pairs(uri_args) do
if type(v) =="table" then
ngx.say(k,":",table.concat(v,", "),"</br>")
else
ngx.say(k,":",v,"</br>")
end
end
ngx.say("uri args end","</br>")
ngx.say("</br>") --post请求参数
--read_body() 读取请求体;也可在nginx中配置 lua_need_request_body on; 不推荐此种配置方式
ngx.req.read_body()
ngx.say("post args begin","</br>")
local post_args =ngx.req.get_post_args()
for k,v in pairs(post_args) do
if type(v) == "table" then
ngx.say(k, ":" ,table.concat(v,", "),"</br>")
else
ngx.say(k,":",v,"</br>")
end
end
ngx.say("post args end","</br>")
ngx.say("</br>") --请求http协议版本
ngx.say("ngx.req.http_version :",ngx.req.http_version(),"</br>")
--请求方法
ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "<br/>")
--未解析的请求头字符串
ngx.say("ngx.req.raw_header:",ngx.req.raw_header(),"</br>")
--未解析的body内容
ngx.say("ngx.req.get_body_dat :",ngx.req.get_body_data(),"</br>")
ngx.say("</br>")
3、检查配置文件是否正确
./sbin/nginx -t
4、重启openresty
sudo /sbin/service openresty stop sudo /sbin/service openresty start
5、测试:
浏览器访问:http://127.0.0.1/lll/lua_request/1/5/2?a=3&b=4
由于通过浏览器请求方式为get方式 ,所以post处没有打印出有效信息。
6、其他API
--重定向
ngx.redirect("http://www.baidu.com", 302)
--未解码的uri
ngx.var.request_uri
--解码
ngx.unescape_uri(request_uri)
--MD5加密
ngx.md5("44444444")
-- uri编码解码
ngx.escape_uri/ngx.unescape_uri
--参数编码解码
ngx.encode_args/ngx.decode_args
--BASE64编码解码
ngx.encode_base64/ngx.decode_base64
--nginx正则表达式匹配
ngx.re.match
更多nginx http api : http://wiki.nginx.org/HttpLuaModule#Nginx_API_for_Lua
文章参考自 :http://jinnianshilongnian.iteye.com/blog/2186448
最新文章
- ES6之let命令详解
- Android6.0运行时权限管理
- 图文混排--CoreText的简单运用
- delphi 相对路径
- MMORGP大型游戏设计与开发(客户端架构 part1 of vgui)
- php 数组排序 sort asort ksort
- codeforces D. Queue 找规律+递推
- c# abstract抽象类与继承类子类的构造函数_base
- mysql数据库备份及恢复命令mysqldump,source的用法
- sap 三代出口(BADI)的查找方法
- xHtml+css学习笔记
- 虚拟机如何访问tomcat
- Java中的 修饰符
- Java内存泄漏分析与解决方案
- 【转】Appium测试安卓Launcher以滑动窗体获得目标应用
- C# 读取 Excel 最全最稳定的方式
- 手机连接fiddler之后,安装证书的方法
- 【转】Servlet 生命周期、工作原理
- Android学习之基础知识五—Android常用的七大控件
- Linux 下安装 MATLAB