# 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

# 正确记录日志

使用 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 库