六、web响应定制示例
OpenResty的“开发”,其实是编写配置+lua脚本,大致的流程如下:
- 首先根据业务,选择可能需要引用的lua模块(见“简介”一节,可能需要开发);
- 然后考虑在web处理的哪个环节进行什么“插入”,也就是确定lua脚本应放置在哪个lua块(见“Nginx 中lua处理流程”一节),
- 再看需要什么要的信息、有哪些接口可用,即如何获得web流中的数据(见“Nginx中lua API”一节);
- 最后合理地安排脚本位置,即将lua代码放入一个文件还是多个文件并设置好引用路径。
根据简单的判断进行web请求转发,是缺省Nginx版本的核心功能,无需OpenResty,因此,这里的示例,都是对某些内容的修改,当然,如果利用OpenResty编写大量复杂的业务处理,也未必适合。
1. 直接应答内容
上节就是一个直接应答的示例,如果添加对redis,mysql等的引用,可以从缓存或数据库中读取内容后进行应答,其实这就是一个用lua写的web server。
2. 修改request content进行转发
修改request内容再转发,应该在rewrite_by_lua_block中编写相应脚本。首先将request内容读入内存,然后进行处理即可。
3. 修改response content进行应答
后端web server应答后,修改其内容在转发,要麻烦些,应该在header_filter_by_lua_block,body_filter_by_lua_block中编写相应脚本。body_filter_by_lua_block中获得response内容的接口是ngx.arg[1],是否结束的指示符是ngx.arg[2],另外,如果修改了response,会导致原来的content-length失效,官网的建议是是直接去掉它(目前还未想到更好方法)。
本节涉及三种修改web请求内容的场景,其实就是通过内容截获,在后端的web处理不修改的情况,添加一些业务逻辑。本节示例需要四段代码:ngnix.conf,capture.lua,testhttpd.py(后端的web),testhttpd.htm(后端的一个示例页面,用于测试post方法),它们分别如下: