Openresty最佳案例 | 第4篇:OpenResty常见的api_方志朋的博客-CSDN博客


本站和网页 https://blog.csdn.net/forezp/article/details/78616660 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Openresty最佳案例 | 第4篇:OpenResty常见的api_方志朋的博客-CSDN博客
Openresty最佳案例 | 第4篇:OpenResty常见的api
方志朋
于 2017-11-23 16:55:14 发布
42644
收藏
分类专栏:
lua+nginx
OpenResty 最佳案例
文章标签:
api
nginx
lua
vim
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/forezp/article/details/78616660
版权
lua+nginx
同时被 2 个专栏收录
11 篇文章
6 订阅
订阅专栏
OpenResty 最佳案例
10 篇文章
67 订阅
订阅专栏
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616660 本文出自方志朋的博客
个人博客纯净版:https://www.fangzhipeng.com/openresty/2018/01/01/openresty-best-practice-4-openresty-api.html
获取请求参数
vim /usr/example/example.conf
location /lua_var {
default_type 'text/plain';
content_by_lua_block {
ngx.say(ngx.var.arg_a)
重新加载nginx配置文件: nginx -s reload
在浏览器上访问http://116.196.177.123/lua_var?a=323,浏览器显示:
323
在上述代码中,涉及到了2个api, 一是ngx.say(直接返回请求结果);二是ngx.var,它是获取请求的参数,比如本例子上的?a=323,获取之后,直接输出为请求结果。
获取请求类型
vim /usr/example/example.conf
location /lua_request{
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/example/lua/lua_request.lua;
vim /usr/example/lua/lua_request.lua ,添加一下代码:
local arg = ngx.req.get_uri_args()
for k,v in pairs(arg) do
ngx.say("[GET ] key:", k, " v:", v)
end
ngx.req.read_body() -- 解析 body 参数之前一定要先读取 body
local arg = ngx.req.get_post_args()
for k,v in pairs(arg) do
ngx.say("[POST] key:", k, " v:", v)
end
在上述例子中有以下的api:
ngx.req.get_uri_args 获取在uri上的get类型参数,返回的是一个table类型的数据结构。ngx.req.read_body 读取body,这在解析body之前,一定要先读取body。ngx.req.get_post_args 获取form表单类型的参数,返回结果是一个table类型的数据。
使用curl模拟请求:
curl ‘http://116.196.177.123/lua_request?a=323&b=ss’ -d ‘c=12w&d=2se3’
返回的结果:
[GET ] key:b v:ss
[GET ] key:a v:323
[POST] key:d v:2se3
[POST] key:c v:12w
获取请求头
vim /usr/example/lua/lua_request.lua ,在原有的代码基础上,再添加一下代码:
local headers = ngx.req.get_headers()
ngx.say("headers begin", "
")
ngx.say("Host : ", headers["Host"], "
")
ngx.say("user-agent : ", headers["user-agent"], "
")
ngx.say("user-agent : ", headers.user_agent, "
")
for k,v in pairs(headers) do
if type(v) == "table" then
ngx.say(k, " : ", table.concat(v, ","), "
")
else
ngx.say(k, " : ", v, "
")
end
end
重新加载nginx -s reload
使用curl模拟请求:
curl ‘http://116.196.177.123/lua_request?a=323&b=ss’ -d ‘c=12w&d=2se3’
[GET ] key:b v:ss
[GET ] key:a v:323
[POST] key:d v:2se3
[POST] key:c v:12w
headers begin

Host : 116.196.77.157

user-agent : curl/7.53.0

user-agent : curl/7.53.0

host : 116.196.77.157

content-type : application/x-www-form-urlencoded

accept : */*

content-length : 12

user-agent : curl/7.53.0

获取http的其他方法
vim /usr/example/lua/lua_request.lua ,在原有的代码基础上,再添加一下代码:
ngx.say("ngx.req.http_version : ", ngx.req.http_version(), "
")
--请求方法
ngx.say("ngx.req.get_method : ", ngx.req.get_method(), "
")
--原始的请求头内容
ngx.say("ngx.req.raw_header : ", ngx.req.raw_header(), "
")
--请求的body内容体
ngx.say("ngx.req.get_body_data() : ", ngx.req.get_body_data(), "
")
ngx.say("
")
重新加载nginx -s reload
使用curl模拟请求:
curl ‘http://116.196.177.123/lua_request?a=323&b=ss’ -d ‘c=12w&d=2se3’
//....
ngx.req.http_version : 1.1

ngx.req.get_method : POST

ngx.req.raw_header : POST /lua_request?a=323&b=ss HTTP/1.1
Host: 116.196.77.157
User-Agent: curl/7.53.0
Accept: */*
Content-Length: 12
输出响应
vim /usr/example/example.conf,添加一个location,代码如下:
location /lua_response{
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/example/lua/lua_response.lua ;
vim /usr/example/lua/lua_response.lua 添加一下代码:
ngx.header.a="1"
ngx.header.b={"a","b"}
ngx.say("hello","</br>")
ngx.print("sss")
return ngx.exit(200)
上述代码中有以下api:
ngx.header 向响应头输出内容ngx.say 输出响应体ngx.print输出响应体ngx.exit 指定http状态码退出
使用curl模拟请求, curl ‘http://116.196.177.123/lua_response’ ,获取的响应体如下:
hello
sss
日志输出
在配置文件vim /usr/example/example.conf 加上以下代码:
location /lua_log{
default_type 'text/html';
lua_code_cache off;
content_by_lua_file /usr/example/lua/lua_log.lua;
vim /usr/example/lua/lua_log.lua ,加上以下代码:
local log="i'm log"
local num =10
ngx.log(ngx.ERR, "log",log)
ngx.log(ngx.INFO,"num:" ,num)
重新加载配置文件nginx -s reload
curl ‘http://116.196.177.123/lua_log’
打开nginx 的logs目录下的error.log 文件:
tail -fn 1000 /usr/servers/nginx/logs/error.log
可以看到在日志文件中已经输出了日志,这种日志主要用于记录和测试。
日志级别:
ngx.STDERR – 标准输出ngx.EMERG – 紧急报错ngx.ALERT – 报警ngx.CRIT – 严重,系统故障,触发运维告警系统ngx.ERR – 错误,业务不可恢复性错误ngx.WARN – 告警,业务中可忽略错误ngx.NOTICE – 提醒,业务比较重要信息ngx.INFO – 信息,业务琐碎日志信息,包含不同情况判断等ngx.DEBUG – 调试
内部调用
vim /usr/example/example.conf 添加以下代码:
location /lua_sum{
# 只允许内部调用
internal;
# 这里做了一个求和运算只是一个例子,可以在这里完成一些数据库、
# 缓存服务器的操作,达到基础模块和业务逻辑分离目的
content_by_lua_block {
local args = ngx.req.get_uri_args()
ngx.say(tonumber(args.a) + tonumber(args.b))
internal 关键字,表示只允许内部调用。使用curl模拟请求,请求命令如下:
$ curl ‘http://116.196.177.123/lua_sum?a=1&b=2’
由于该loction是一个内部调用的,外部不能返回,最终返回的结果为404,如下:
<html>
<head><title>404 Not Found</title></head>
<body bgcolor="white">
<center><h1>404 Not Found</h1></center>
<hr><center>openresty/1.11.2.4</center>
</body>
</html>
vim /usr/example/example.conf 添加以下代码:
location = /lua_sum_test {
content_by_lua_block {
local res = ngx.location.capture("/lua_sum", {args={a=3, b=8}})
ngx.say("status:", res.status, " response:", res.body)
上述的代码通过ngx.location.capture去调用内部的location,并获得返回结果,最终将结果输出,采用curl模拟请求:
$ curl ‘http://116.196.177.123/lua_sum_test’
返回结果如下:
status:200 response:11
重定向
vim /usr
location /lua_redirect{
default_type 'text/html';
content_by_lua_file /usr/example/lua/lua_redirect.lua;
ngx.redirect("http://www.fangzhipeng.com", 302)
http://116.196.177.123/lua_redirect
共享内存
vim /usr/servers/nginx/cong/nginx.conf
在http模块加上以下:
lua_shared_dict shared_data 1m;
location /lua_shared_dict{
default_type 'text/html';
content_by_lua_file /usr/example/lua/lua_shared_dict.lua;
local shared_data = ngx.shared.shared_data
local i = shared_data:get("i")
if not i then
i = 1
shared_data:set("i",i)
end
i = shared_data:incr("i",1)
ngx.say("i:",i)
多次访问 http://116.196.177.123/lua_shared_dict,浏览器打印:
i:1
i:2
i:3
i:4
i:5
OpenResty执行阶段的概念
以下内容来自于《openresty 最佳实践》
如上图所示,openresty的执行阶段分为
这样我们就可以根据我们的需要,在不同的阶段直接完成大部分典型处理了。
set_by_lua* : 流程分支处理判断变量初始化rewrite_by_lua* : 转发、重定向、缓存等功能(例如特定请求代理到外网)access_by_lua* : IP 准入、接口权限等情况集中处理(例如配合 iptable 完成简单防火墙)content_by_lua* : 内容生成header_filter_by_lua* : 响应头部过滤处理(例如添加头部信息)body_filter_by_lua* : 响应体过滤处理(例如完成应答内容统一成大写)
执行阶段概念:
log_by_lua* : 会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其 他机器) 实际上我们只使用其中一个阶段content_by_lua* ,也可以完成所有的处理。但这样做,会让 我们的代码比较臃肿,越到后期越发难以维护。把我们的逻辑放在不同阶段,分工明确,代 码独立,后期发力可以有很多有意思的玩法。
更多阅读
史上最简单的 SpringCloud 教程汇总
SpringBoot教程汇总
Java面试题系列汇总
扫码关注公众号有惊喜
(转载本站文章请注明作者和出处 方志朋的博客)
方志朋
关注
关注
点赞
收藏
打赏
评论
Openresty最佳案例 | 第4篇:OpenResty常见的api
获取请求参数vim /usr/example/example.conf location /lua_var { default_type 'text/plain'; content_by_lua_block { ngx.say(ngx.var.arg_a) } }重新加载nginx配置文件: nginx -s reload在
复制链接
扫一扫
专栏目录
openresty中使用lua-nginx创建socket实例
09-22
主要介绍了openresty中使用lua-nginx创建socket实例,本文直接给出代码实例和运行效果,需要的朋友可以参考下
OpenResty从入门到精通
qq_45443475的博客
09-26
192
OpenResty从入门到精通
评论 4
您还未登录,请先
登录
后发表或查看评论
Centos 7 安装 OpenResty api 网关 Orange
weixin_34203426的博客
03-09
226
1,Orange网关
Orange是一个基于OpenResty的API网关。除Nginx的基本功能外,它还可用于API监控、访问控制(鉴权、WAF)、流量筛选、访问限速、AB测试、动态分流等。它有以下特性:
提供了一套默认的Dashboard用于动态管理各种功能和配置
提供了API接口用于实现第三方服务(如个性化运维需求、第三方...
nginx openresty content_by_lua_file 404错误
liu0808的专栏
09-15
4712
nginx openresty content_by_lua_file 404错误
2018/08/05 19:18:59 [error] 21231#0: *63 failed to load external Lua file "/home/l/lua/lua_request.lua": cannot open /home/l/lua/lua_request.lua: Permission ...
nginx访问静态资源403 forbidden的问题
最新发布
07feng的博客
10-14
682
图片文件上传至服务器后访问报403 forbidden
Nginx Lua 三种重定向的使用及比较
liwf616的专栏
10-17
1万+
lua 三种重定向的使用及比较1. ngx.exec
语法:ngx.exec(uri, args?)
主要实现的是内部的重定向,等价于下面的rewrite指令:
rewrite regrex replacement last;  例子:ngx.exec('/some-location');
ngx.exec('/some-location', 'a=3&b=5&c=6');
ngx.exe
openresty开发系列33--openresty执行流程之3重写rewrite和重定向
reblue520的专栏
09-02
1384
openresty开发系列33--openresty执行流程之3重写rewrite和重定向重写rewrite阶段1)重定向2)内部,伪静态先介绍一下if,rewrite指令一)if指令语法:if (condition){...}默认值:无作用域:server,location对给定的条件condition进行判断。如果为真,大括号内的指令将被执行。上面的if和(之间需要留空格,否则会报错...
什么是OpenResty
yshir
11-16
2万+
OpenResty是一个成熟的网络平台,它集成了标准的Nginx核心,LuaJIT,许多精心编写的Lua库,许多高质量的第三方Nginx模块以及大多数外部依赖项。它旨在帮助开发人员轻松构建可伸缩的Web应用程序,Web服务和动态Web网关。
通过利用各种精心设计的Nginx模块(其中大部分由OpenResty团队自己开发),OpenResty有效地将nginx服务器转变为功能强大的Web应用服务...
浅谈 OpenResty
热门推荐
yhclt的博客
02-11
5万+
一.前言我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。为了开发人员方便,所以接下来我们要介绍一种整合了Nginx和lua的框架,那就是OpenResty,它帮我们实现了可以用lua的规范开发,实现各种业务,并且帮我们弄清楚各个模块的编译顺...
openresty 常用API
aganliang的专栏
03-28
904
参考:Openresty最佳案例 | 第4篇:OpenResty常见的api
1.配置lua项目化
cd /usr/local/openresty
mkdir example
cp -r lualib/ /example/
mkdir example/lua
cd example
vim example.conf
server {
listen 8083; ...
OpenResty介绍
redfivehit的专栏
09-17
599
一.前言
我们都知道Nginx有很多的特性和好处,但是在Nginx上开发成了一个难题,Nginx模块需要用C开发,而且必须符合一系列复杂的规则,最重要的用C开发模块必须要熟悉Nginx的源代码,使得开发者对其望而生畏。为了开发人员方便,所以接下来我们要介绍一种整合了Nginx和lua的框架,那就是OpenResty,它帮我们实现了可以用lua的规范开发,实现各种业务,并且帮我们弄清楚各个模块的编...
OpenRestry实战一:概念和应用场景
Sang
09-26
5612
openrestry介绍:
OpenResty是一个通过Lua扩展Nginx实现的可伸缩的Web平台,内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。
用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。
功能和nginx类似,就是由于支持lua动态脚本,所以更加灵活,可以实现鉴权、限流、分流、日志记录、灰度发布等功能。
OpenResty通过Lua脚...
openresty url重写
weixin_34357436的博客
01-23
166
2019独角兽企业重金招聘Python工程师标准>>>
...
Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
公众号:该用户快成仙了
08-26
1237
重定向与内部子请求
Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx的rewrite指令的功能之外,还能顺利完成内部子请求、并发子请求等复杂功能。
实战案例运行准备:本节涉及的配置文件为源码工程的nginxlua-demo.conf文件。在运行本节实例前需要修改启动脚本openrestystart.bat(或openresty-start.sh)中的PROJECT_CON
openresty(完整版)Lua拦截请求与响应信息日志收集及基于cjson和redis动态路径以及Prometheus监控(转)...
weixin_30906425的博客
01-04
2137
直接上文件
nginx.conf
[plain]view plaincopy
#运行用户和组,缺省为nobody,若改为别的用户和组,则需要先创建用户和组
#userwls81wls;
#开启进程数,一般与CPU核数等同
worker_processes4;
#设置进程到cpu(四cpu:...
Nginx一些内置变量
bjgaocp的博客
02-25
565
内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的。总而言之,这些变量代表着客户端请求头的内容,例如$http_user_agent, $http_cookie, 等等。下面是nginx支持的一些内置变量:
$arg_name
请求中的的参数名,即“?”后面的arg_name=arg_value形式的arg_name
$args
请...
排查NGINX的openfilecache导致发布后访问404的问题
因上努力,果上随缘。但行好事,莫问前程。
05-09
399
1,问题
近来,有测试同学反馈测试环境的前端项目,在代码发布之后,再次访问会出现404的情况,希望我们能介入排查定位一下原因。
于是,我约好会议室,拉上前端同学一起,她来发代码,我们来访问验证,而后的确复现了如上问题:
在发布完成之后有一段时间会获取到上一次发布的入口文件的hash。
我们进行了逐层的排除法验证,在排除了各层NGINX对html的缓存问题,排除了代码发布到主机与通过nfs挂载到pod的代码是否同时更新的问题,排除了浏览器缓存的问题,由于每次验证都需要前端重新发布,编译过程略长,因此不知
OpenResty 概要及原理科普
朱小厮的博客
04-23
4152
点击上方“朱小厮的博客”,选择“设为星标”后台回复"高效Java"领取《Effective Java第三版》OpenResty 是一个基于Nginx与 Lua 的高...
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:编程工作室
设计师:CSDN官方博客
返回首页
方志朋
CSDN认证博客专家
CSDN认证企业博客
码龄7年
Java领域优质创作者
198
原创
6122
周排名
196万+
总排名
1627万+
访问
等级
3万+
积分
2万+
粉丝
6219
获赞
6916
评论
1万+
收藏
私信
关注
热门文章
史上最简单的 SpringCloud 教程 | 终章
1933434
史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
901380
史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
546197
史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
516353
史上最简单的SpringCloud教程 | 第三篇: 服务消费者(Feign)
469608
分类专栏
史上最简单的 Spring Cloud 教程
56篇
SpringBoot 非官方教程
30篇
linux
4篇
跟我学springboot开发后端管理系统
9篇
数据库中间件
4篇
Docker专栏
6篇
OpenResty 最佳案例
10篇
Java面试专栏
9篇
springcloud
67篇
springboot
29篇
docker
6篇
kubernetes
5篇
java
26篇
Java并发编程
2篇
lua+nginx
11篇
分布式
13篇
rxjava
4篇
python
2篇
工具
1篇
elk
4篇
mongodb
1篇
架构
26篇
redis
4篇
android
18篇
生活感悟
5篇
javascript
9篇
面试
spring
2篇
数据库
4篇
最新评论
史上最简单的 SpringCloud 教程 | 终章
诛九戒:
看完您的博客后,我的心久久不能平静!这条说说构思新颖,题材独具匠心,段落清晰,情节诡异,跌宕起伏,主线分明,引人入胜,平淡中显示出不凡的文学功底,可谓是字字珠玑,句句经典,是我辈应学习之典范。就小说艺术的角度而言,可能不算太成功,但它的实验意义却远大于成功本身。一马奔腾,射雕引弓,天地在我心中!您不愧为无厘头界新一代开山怪!是你让我的心里重燃起希望之火,这是难得一见的好说! 苍天有眼,让我在有生之年能观得如此精彩说说!真如"大音希声扫阴翳",犹如"拨开云雾见青天",使我等之辈看到希望,晴天霹雳,醍醐灌顶,不足以形容大师文章的构思;巫山行云,长江流水更难比拟大师的文才!你烛照天下,明见万里;雨露苍生,泽被万方!透过你深邃的文字,我仿佛看到了你鹰视狼顾,龙行虎步的伟岸英姿;仿佛看到了你手执如椽大笔,写天下文章的智慧神态;仿佛看见了你按剑四顾,江山无数的英武气概!你说的多好啊! 我在网上打滚这么多年,所谓阅人无数,见怪不怪了,但一看您的气势,我就觉得您与在网上灌水的那帮小混蛋有着本质的差别,那忧郁的语调,那熟悉的签名,那高屋建瓴的辞藻,就足以证明您的伟大。是您让中华民族精神得以弘扬。佩服佩服。
SpringCloud 2020版本教程1:使用nacos作为注册中心和配置中心
北遇长街:
直接点击startup.cmd启动失败,使用命令启动成功startup.cmd -m standalone
如何使用MongoDB+Springboot实现分布式ID?
qq_31459039:
同问: 如果是用的mysql能用mongo生成唯一id么? 是不是必须先save一下?
Java NIO?看这一篇就够了!
hjkjghgh520123:
文不对题,走哪儿凑的
跟我学Springboot开发后端管理系统1:概述
十号男:
现在网站进不去了是怎么回事啊,有没有能解答下的,换域名了?
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
SpringCloud 2020版本教程4:使用spring cloud sleuth+zipkin实现链路追踪
SpringCloud 2020版本教程3:使用sentinel作为熔断器
SpringCloud 2020版本教程2:使用spring cloud gateway作为服务网关
2021年6篇
2020年16篇
2019年55篇
2018年34篇
2017年83篇
2016年43篇
目录
目录
分类专栏
史上最简单的 Spring Cloud 教程
56篇
SpringBoot 非官方教程
30篇
linux
4篇
跟我学springboot开发后端管理系统
9篇
数据库中间件
4篇
Docker专栏
6篇
OpenResty 最佳案例
10篇
Java面试专栏
9篇
springcloud
67篇
springboot
29篇
docker
6篇
kubernetes
5篇
java
26篇
Java并发编程
2篇
lua+nginx
11篇
分布式
13篇
rxjava
4篇
python
2篇
工具
1篇
elk
4篇
mongodb
1篇
架构
26篇
redis
4篇
android
18篇
生活感悟
5篇
javascript
9篇
面试
spring
2篇
数据库
4篇
目录
评论 4
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
打赏作者
方志朋
你的鼓励将是我创作的最大动力
¥2
¥4
¥6
¥10
¥20
输入1-500的整数
余额支付
(余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付
您的余额不足,请更换扫码支付或充值
打赏作者
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值