Yukang's Page

OpenResty使用总结

2017-05-22

OpenResty

最近用OpenResty比较多,除了一些业务逻辑的实现也做了AB组灰度相关的实现。OpenResty是在Nginx基础上做的扩展,应该算是国人开源项目中很成功的一个。在做的过程中写了不少Lua代码,写Lua代码的体验就是库好少,语言好简单。

OpenResty lua编程相关参考

其中Readme要看完,大概会有一个全局的了解。最佳实践辅助看看。
理解Nginx处理的几个阶段: http://www.nginxguts.com/2011/01/phases/

处理Response Body

在我们的实现中有一步需要给后端返回的结果里面加一段水印(也就是一段JS代码),这步可以在body_filter这个里面做。不过需要注意body_filter是按流式方式处理的,需要把各个buffer存下来然后拼接起来。
而且后端返回的结果可能是zip压缩过的,所以需要解压,然后才能做替换或者拼接的操作

local chunk, eof = ngx.arg[1], ngx.arg[2]
local buffered = ngx.ctx.buffered
if not buffered then
buffered = {} -- XXX we can use table.new here
ngx.ctx.buffered = buffered
end
if chunk ~= "" then
buffered[#buffered + 1] = chunk
ngx.arg[1] = nil
end
if eof then
local whole = table.concat(buffered)
ngx.ctx.buffered = nil
-- try to unzip
local status, debody = pcall(com.decode, whole)
if status then whole = debody end
-- try to add or replace response body
local js_code = ....
whole = whole .. js_code
ngx.arg[1] = whole
end

最后因为修改了response body,所以需要修改header filter里面的部分:

ngx.header.content_length = nil
ngx.header.content_encoding = nil

容易出现的bug

  1. 尽量使用local变量: 具体的解释,我在实践的过程中出现过变量乱窜的情况,结果发现是没有是用local。

  2. ngx.ctx 比 ngx.var 性能要好很多,但是在执行了ngx.exec后在子请求里ctx不一样,在我们的项目里大部分是用的是ngx.var。使用ngx.var需要注意的是需要在Nginx配置文件里面提前声明。另外ngx.ctx在使用的时候也有需要注意的地方

  3. 不同阶段共享变量

  4. 不要使用错误码来做内部跳转,使用ngx.exec很方便。

  5. 是用推荐的方法来实现module

使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章