# nginx执行阶段顺序
初始化阶段:
init_by_lua
init_work_by_lua
rewrite/access阶段:
是https请求-> 先ssl_certificate_by_lua
set_by_lua 流程分支判断,变量初始化
rewrite_by_lua 转发,重定向,缓存
access_by_lua ip限制,接口权限,类似防火墙的功能功能个
content阶段:
如果content是lua则走content_by_lua
如果content是upstream,则走balancer_by_lua
header_filter_by_lua,响应头处理
body_filter_by_lua, 响应body处理
Log阶段: log_by_lua阶段
例如加密的场景:
location /mixed {
access_by_lua_file ...; 请求解密
content_by_lua_file ...; 请求处理,不关心加密解密协议
body_filter_by_lua ...; 应答加密
}
1
2
3
4
5
6
2
3
4
5
6
# 正确记录日志
使用 lua-resty-logger-socket
由于实现中存在一种情况:如果消息大小太小,可能不会刷盘,导致丢失
原因: 当我们初始化一个syslog服务器链接后,每次发送消息时,调用logger.log函数, 它是累计到flush_limit才会刷盘; 当没到flush_limit 时,函数保存数据到变量buffer中,然后直接返回, 这时候接口结束,buffer也释放了,所以日志就丢了。
解决方法:
将flush_limit设置的很小,保证每次log都刷盘
把写日志放到log_by_lua阶段,这个阶段会异步完成日志记录。
# 热装载代码
# 阻塞操作
避免以下操作
高cpu的调用,如加解密
高磁盘操作,如文件操作
非openresty提供的网络库
系统命令 os.execute
因为以上都是阻塞cpu的操作耗时操作 阻塞的原因是,因为不会发生协成切换,而是进程切换,导致不处理别的协程
一、 我们可以减少这类函数调用
二、我们把这类操作封装成http或者tcp服务(使用cosocket技术), 这样操作这些调用时,由于是网络io,也会协程切换,避免阻塞cpu。
# 缓存
lua shared dict
work进程间共享的, 需要在配置文件定义空间大小
内部使用LRU算法(清除最少使用的内存)
lua LRU cache
resty.lrucache 库