##Openresty是什么
OpenResty是一个基于 Nginx 与 Lua 的高性能 Web 平台,通过把lua嵌入到Nginx中,使得我们可以用轻巧的lua语言进行nginx的相关开发,处理高并发,扩展性极高的动态 Web 应用。
大家知道lua_code_cache 开关用于控制是否缓存*_by_lua_file对应的文件里的lua代码
lua_code_cache off的情况下,跟请求有关的阶段,在每次有请求来的时候,都会重新加载最新的lua文件,这样我们修改完代码之后就不用通过reload来更新代码了
而*_by_lua_block、*_by_lua和init_by_lua_file里的代码(init_by_lua阶段和具体请求无关),如果修改的内容涉及这几个,仍需要通过reload来更新代码
那openresty是如何实现这些,如何完成加载代码,和代码缓存的呢?
##Nginx配置
假设Nginx相关的配置如下所示
1
|
lua_code_cache off;
|
1
2
3
|
location ~ ^/api/([-_a-zA-Z0-9/]+) {
content_by_lua_file lua/$1.lua;
}
|
当来到的请求符合 ^/api/([-_a-zA-Z0-9/] 时,会在NGX_HTTP_CONTENT_PHASE HTTP请求内容阶段交给 lua/$1.lua来处理
比如
/api/addition 交给 lua/addition.lua 处理
/api/substraction 交给 lua/substraction .lua 处理
##请求的处理
content_by_lua_file对应的请求来临时,执行流程为 ngx_http_lua_content_handler -> ngx_http_lua_content_handler_file-> ngx_http_lua_content_by_chunk
配置项相关
1
2
3
4
5
6
|
324 { ngx_string(
"content_by_lua_file"
),
325 NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE1,
326 ngx_http_lua_content_by_lua,
327 NGX_HTTP_LOC_CONF_OFFSET,
328 0,
329 (
void
*) ngx_http_lua_content_handler_file }
|
1
2
3
4
5
6
7
8
9
10
|
670
char
*
671 ngx_http_lua_content_by_lua(ngx_conf_t *cf, ngx_command_t *cmd,
void
*conf)
672 {
673 ...
756 llcf->content_handler = (ngx_http_handler_pt) cmd->post;
//设置回调函数为ngx_http_lua_content_handler_file
757 ...
768 clcf->handler = ngx_http_lua_content_handler;
//使用按需挂载处理函数的方式挂载处理函数,处理函数为ngx_http_lua_content_handler
769
770
return
NGX_CONF_OK;
771 }
|
处理函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|