OpenResty 从入门到实战
温铭
OpenResty 软件基金会第一任主席,Apache APISIX 项目 VP
20903 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 52 讲
结束语 (1讲)
OpenResty 从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

17 | 为什么能成为更好的Web服务器?动态处理请求和响应是关键

ngx.print
ngx.say
ngx_resp.add_header
ngx.header
ngx.status
ngx.exit
ngx.req.set_body_file
ngx.req.set_body_data
ngx.req.get_body_file
ngx.req.get_body_data
ngx.req.read_body
ngx.req.clear_header
ngx.req.get_headers
ngx.req.set_uri_args
ngx.req.set_uri
ngx.req.set_method
ngx.req.get_method
ngx.req.http_version
ngx.var.*
响应体
响应头
状态行
请求体
请求头
请求行
字符串、时间、编解码等通用功能
获取NGINX变量和配置
process和worker
处理四层流量
cosocket
shared dict
SSL相关
处理请求和响应
Lua API驱动
OpenResty基本概念
响应
请求
API分类
概念和学习
OpenResty API

该思维导图由 AI 生成,仅供参考

你好,我是温铭。经过前面内容的铺垫后, 相信你已经对 OpenResty 的概念和如何学习它有了基本的认识。今天这节课,我们来看一下 OpenResty 如何处理终端请求和响应。
虽然 OpenResty 是基于 NGINX 的 Web 服务器,但它与 NGINX 却有本质的不同:NGINX 由静态的配置文件驱动,而 OpenResty 是由 Lua API 驱动的,所以能提供更多的灵活性和可编程性。
下面,就让我来带你领略 Lua API 带来的好处吧。

API 分类

首先我们要知道,OpenResty 的 API 主要分为下面几个大类:
处理请求和响应;
SSL 相关;
shared dict;
cosocket;
处理四层流量;
process 和 worker;
获取 NGINX 变量和配置;
字符串、时间、编解码等通用功能。
这里,我建议你同时打开 OpenResty 的 Lua API 文档,对照着其中的 API 列表 ,看看是否能和这个分类联系起来。
OpenResty 的 API 不仅仅存在于 lua-nginx-module 项目中,也存在于 lua-resty-core 项目中,比如 ngx.ssl、ngx.base64、ngx.errlog、ngx.process、ngx.re.split、ngx.resp.add_header、ngx.balancer、ngx.semaphore、ngx.ocsp 这些 API 。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

OpenResty是一个基于NGINX的Web服务器,通过Lua API提供了丰富的功能来处理终端请求和响应,使得开发者能够更加灵活地对请求和响应进行处理,从而提升Web服务器的性能和可编程性。OpenResty的API主要分为处理请求和响应、SSL相关、shared dict、cosocket、处理四层流量、process和worker、获取NGINX变量和配置、字符串、时间、编解码等通用功能。在处理请求方面,OpenResty提供了多个专门操作请求行的API,可以对请求行进行改写,以便后续的重定向等操作。对于响应方面,OpenResty提供了API来设置状态行、响应头和响应体,并且具有灵活的状态码处理和响应头设置方法。总的来说,OpenResty通过Lua API提供了丰富的功能来处理终端请求和响应,使得开发者能够更加灵活地对请求和响应进行处理,从而提升Web服务器的性能和可编程性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《OpenResty 从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(10)

  • 最新
  • 精选
  • helloworld
    老师,文中的这句“OpenResty 的 HTTP 状态码中,有一个特别的常量:ngx.OK。当 ngx.exit(ngx.OK) 时,请求会退出当前处理阶段,进入下一个阶段,而不是直接返回给客户端。” ngx.OK应该不能算是HTTP状态码吧,它对应的值是0; 我下面的理解对不对: ngx.exit(ngx.OK)、ngx.exit(ngx.ERROR)和ngx.exit(ngx.DECLINED)时,请求会退出当前处理阶段,进入下一个阶段; 而当ngx.exit(ngx.HTTP_*)以ngx.HTTP_*各种HTTP状态码作为参数时,会直接响应给客户端。

    作者回复: ngx.ok 确实不是http状态码,它是 OpenResty 中的一个常量,值是0. ngx.exit 的官方文档正好可以解答你的问题: When status >= 200 (i.e., ngx.HTTP_OK and above), it will interrupt the execution of the current request and return status code to nginx. When status == 0 (i.e., ngx.OK), it will only quit the current phase handler (or the content handler if the content_by_lua* directive is used) and continue to run later phases (if any) for the current request. 不过,里面并没有提到对于ngx.exit(ngx.ERROR)和ngx.exit(ngx.DECLINED)是如何处理的,我们可以自己来做个测试: location /lua { rewrite_by_lua "ngx.exit(ngx.ERROR)"; echo hello; } 访问这个 location,可以看到 http 响应码为空,响应体也是空。并没有引入下一个执行阶段。

    2019-07-08
    12
  • HelloBug
    利用ngx.exit返回非200时,请求会退出当前请求处理阶段,然后直接返回给客户端。在测试的时候发现一个特点是无论ngx.exit返回什么应答码,log_by_lua*阶段都会执行。本来以为直接返回给客户端,不会执行log阶段的,因为log阶段也是处理流程中的一个阶段。其实log阶段是在返回给客户端之后才会执行的一个阶段是吧。仔细想来也应该是这样:)

    作者回复: 👍

    2019-07-03
    8
  • 小强
    老师,openresty 可以做api鉴权吗?现在项目中网关用的spring cloud gateway和jwt,只做鉴权和代理,性能较差,适合往openresty迁移吗?

    作者回复: 当然可以,现在流行的 API 网关不少都是基于 OpenResty 的。JWT 的可以参考这里:https://github.com/iresty/apisix/blob/master/doc/plugins/jwt-auth-cn.md

    2019-07-30
    2
  • 2xshu
    老师请教个 ngx.location.capture问题,看lua api官方文档如下: This API function (as well as ngx.location.capture_multi) always buffers the whole response body of the subrequest in memory. 想问下,这个缓存的response body,是parent request结束就会释放掉吗?有什么办法可以验证我的猜想吗?

    作者回复: 是的,在 OpenResty 中 Lua 层面的内存都是自动管理的。 是否可以使用反证法,如果在结束的时候没有释放,那么内存就是一直增长。用 wrk 或者 ab 发送几百个请求,然后看看内存的占用。

    2019-07-05
    1
  • psoracle
    一直没搞明白为什么luajit提供的shell命令行中不能使用local 本地变量,可以定义声明,但使用时还是尝试从global index中查找,所以找不到。 ![](http://wimgss.oss-cn-hangzhou.aliyuncs.com/2019-07-04-024647.png)

    作者回复: 官方 LuaJIT 并没有这个问题,OpenResty 带的 LuaJIT 确实会如此。我也不太清楚这么做的原因,可能是个 bug,你可以到https://github.com/openresty/luajit2提交 issue 询问下。

    2019-07-04
    3
    1
  • psoracle
    如果在resty中熟悉处理http请求的api,如ngx.req.http_version,我是使用resty启动一个mini http server,代码中打印当前访问的http 信息,使用curl -XMETHOD来调用 ![](http://wimgss.oss-cn-hangzhou.aliyuncs.com/2019-07-03-034013.png)

    作者回复: content by lua 这个是 nginx 的指令,不能在 resty 里面调用

    2019-07-03
    3
  • manatee
    对于不同contenttype的请求体,有什么需要特别注意的吗

    作者回复: 并没有特别要注意的地方

    2019-07-03
    2
  • J.Smile
    看到这里,才觉得接近了实战。^_^
    2019-07-05
    1
  • 小飞哥 ‍超級會員
    看到这里,已经不知道应该如何操作了。
    2019-07-03
    1
  • Geek_c0ea3b
    老师,请问作为反向代理时,获取上游服务器的响应,一般是通过ngx.arg[1]这样吗?对于较大的响应,ngx.arg[1]可能需要获取多次,性能上可能不是最优。像一般软WAF在处理响应进行规制匹配时,是怎么获取响应的呢?
    2021-09-04
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部