Web开发平台OpenResty(二):组成、工作过程与原理

作者:李佶澳  更新时间:2018/10/28 21:54:00

  编程    openresty  本页

目录

说明

这是Web开发平台OpenResty系列文章中的一篇。

OpenResty的网站给出了几本关于Lua、Nginx、OpenResty的电子书

1 OpenResty的主要作者章宜春写的Programming OpenResty,好像是刚开始写…

2 章宜春写的Nginx Tutorials (version 2016.07.21),这本书有中文版

3 360公司的moonbingbing(真名不知道)组织编写的OpenResty 最佳实践,其中对Lua和Nginx也做了不错的介绍。

其中章宜春写的两本都没有完成,不成系统,360公司的那本相对好一些。

后面的内容只是记录OpenResty的大概框架,具体的使用参考Web开发平台OpenResty(四):项目开发中常用的操作

Nginx部分

OpenResty首先是nginx,然后才是OpenResty,因此Nginx的知识依旧适用。

NginxLuaModule

lua-nginx-module是最重要的模块,它赋予了nginx执行lua脚本的功能。这个模块作用于Nginx的Http子系统,因此只能用来处理HTTP协议族(HTTP 0.9/1.0/1.1/2.0, WebSockets)。对于TCP,引入的模块是stream-lua-nginx-module

实现的指令与作用位置

lua-nginx-moudle实现了多个XXX_by_lua样式的配置指令,指令中包含的是要被执行的Lua代码。

这些指令分别作用于一次Http请求处理过程的不同阶段,如下图所示:

lua-nginx-module指令作用阶段

例如可以在Location中做如下配置:

location /mixed {
    set_by_lua_block $a {
        ngx.log(ngx.ERR, "set_by_lua*")
    }
    rewrite_by_lua_block {
        ngx.log(ngx.ERR, "rewrite_by_lua*")
    }
    access_by_lua_block {
        ngx.log(ngx.ERR, "access_by_lua*")
    }
    content_by_lua_block {
        ngx.log(ngx.ERR, "content_by_lua*")
    }
    header_filter_by_lua_block {
        ngx.log(ngx.ERR, "header_filter_by_lua*")
    }
    body_filter_by_lua_block {
        ngx.log(ngx.ERR, "body_filter_by_lua*")
    }
    log_by_lua_block {
        ngx.log(ngx.ERR, "log_by_lua*")
    }
}

使用OpenResty启动后,访问时,会在nginx的log中看到如下日志:

2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] set_by_lua:2: set_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] rewrite_by_lua(nginx.conf:17):2: rewrite_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] access_by_lua(nginx.conf:20):2: access_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] content_by_lua(nginx.conf:23):2: content_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] header_filter_by_lua:2: header_filter_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] body_filter_by_lua:2: body_filter_by_lua*, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"
2018/10/29 11:24:55 [error] 61573#4416285: *2 [lua] log_by_lua(nginx.conf:32):2: log_by_lua* while logging request, client: 127.0.0.1, server: , request: "GET /trick HTTP/1.1", host: "127.0.0.1:6699"

常用指令和变量

lua-nginx-module/nginx-api-for-lua收录的指令和变量最全。

ngx.ctx

ngx.ctx,当前请求的lua上下文,类型是table,请求结束随之销毁。

ngx.ctx的类型是table,可以在其中记录状态,并且将记录的状态带到后续的阶段,例如:

 location /test {
     rewrite_by_lua_block {
         ngx.ctx.foo = 76
     }
     access_by_lua_block {
         ngx.ctx.foo = ngx.ctx.foo + 3
     }
     content_by_lua_block {
         ngx.say(ngx.ctx.foo)
     }
 }

rewrite阶段,在上下文中添加变量foo,然后在access阶段进行了修改,最后在content阶段被用于生成返回的内容。

GET /test返回的结果将是79(76+3)。

ngx.ctx可以在以下处理阶段中使用,ngx.timer.*是全局的定时器:

 init_worker_by_lua*
 set_by_lua*
 rewrite_by_lua*
 access_by_lua*
 content_by_lua*
 header_filter_by_lua*
 body_filter_by_lua*
 log_by_lua*
 ngx.timer.*
 balancer_by_lua*

参考

  1. GitHub: openresty/lua-nginx-module
  2. stream-lua-nginx-module
  3. lua-nginx-module directives
  4. Nginx: Alphabetical index of variables

关注加微信,一般不闲聊(直接说事)

QQ交流群

区块链实践互助QQ群:576555864

Kubernetes实践互助QQ群:947371129

Prometheus实践互助QQ群:952461804

Kong/Envoy实践互助QQ群:952503851

Ansible实践互助QQ群:955105412

Copyright @2011-2019 All rights reserved. 转载请添加原文连接,合作请加微信lijiaocn或者发送邮件: [email protected],备注网站合作

友情链接:  微信公众号精选文章  发现知识星球