Openresty最佳案例 | 第4篇:OpenResty常见的api

举报
方志朋 发表于 2018/12/22 15:09:53 2018/12/22
【摘要】 OpenResty常见的api

获取请求参数

vim /usr/example/example.conf


image.png


重新加载nginx配置文件: nginx -s reload


在浏览器访问http://116.196.177.123/lua_var?a=323,浏览器显示:


image.png


在上述代码中,涉及到了2个api, 一是ngx.say(直接返回请求结果);二是ngx.var,它是获取请求的参数,比如本例子上的?a=323,获取之后,直接输出为请求结果。


获取请求类型


vim /usr/example/example.conf


image.png


vim /usr/example/lua/lua_request.lua ,添加一下代码:


image.png


在上述例子中有以下的api:


  • ngx.req.get_uri_args 获取在uri上的get类型参数,返回的是一个table类型的数据结构。

  • ngx.req.read_body 读取body,这在解析body之前,一定要先读取body。

  • ngx.req.get_post_args 获取form表单类型的参数,返回结果是一个table类型的数据。


使用curl模拟请求:


image.png


返回的结果:


image.png


获取请求头

vim /usr/example/lua/lua_request.lua ,在原有的代码基础上,再添加一下代码:


image.png


重新加载nginx -s reload


使用curl模拟请求:


image.png


image.png


获取http的其他方法

vim /usr/example/lua/lua_request.lua ,在原有的代码基础上,再添加一下代码:


image.png


重新加载nginx -s reload


使用curl模拟请求:


image.png


image.png


输出响应

image.png

image.png

image.png

image.png


上述代码中有以下api:


  • ngx.header 向响应头输出内容

  • ngx.say 输出响应体

  • ngx.print输出响应体

  • ngx.exit 指定http状态码退出


使用curl模拟请求, curl ‘http://116.196.177.123/lua_response’ ,获取的响应体如下:


image.png


日志输出

在配置文件vim /usr/example/example.conf 加上以下代码:


image.png

image.png

image.png


重新加载配置文件nginx -s reload


image.png


打开nginx 的logs目录下的error.log 文件:


image.png


可以看到在日志文件中已经输出了日志,这种日志主要用于记录和测试。


日志级别:


  • ngx.STDERR – 标准输出

  • ngx.EMERG – 紧急报错

  • ngx.ALERT – 报警

  • ngx.CRIT – 严重,系统故障,触发运维告警系统

  • ngx.ERR – 错误,业务不可恢复性错误

  • ngx.WARN – 告警,业务中可忽略错误

  • ngx.NOTICE – 提醒,业务比较重要信息

  • ngx.INFO – 信息,业务琐碎日志信息,包含不同情况判断等

  • ngx.DEBUG – 调试


内部调用

vim /usr/example/example.conf 添加以下代码:


image.png


internal 关键字,表示只允许内部调用。使用curl模拟请求,请求命令如下:


image.png


由于该loction是一个内部调用的,外部不能返回,最终返回的结果为404,如下:


image.png


vim /usr/example/example.conf 添加以下代码:


image.png


上述的代码通过ngx.location.capture去调用内部的location,并获得返回结果,最终将结果输出,采用curl模拟请求:


image.png


返回结果如下:


image.png


重定向

vim /usr


image.png

image.png


http://116.196.177.123/lua_redirect


共享内存

vim /usr/servers/nginx/cong/nginx.conf


在http模块加上以下:


image.png

image.png

image.png


多次访问 http://116.196.177.123/lua_shared_dict,浏览器打印:


image.png


OpenResty执行阶段的概念

以下内容来自于《openresty 最佳实践》


image.png


如上图所示,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* ,也可以完成所有的处理。但这样做,会让 我们的代码比较臃肿,越到后期越发难以维护。把我们的逻辑放在不同阶段,分工明确,代 码独立,后期发力可以有很多有意思的玩法。


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。