openresty源码剖析——lua代码的加载

##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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值