设为首页 收藏本站
查看: 1200|回复: 0

[经验分享] linux中Nginx与Lua执行顺序详解

[复制链接]

尚未签到

发表于 2017-12-23 20:01:10 | 显示全部楼层 |阅读模式
  from  http://www.111cn.net/sys/linux/64574.htm
  1.1. 介绍
  ngx_lua – 把lua语言嵌入nginx中,使其支持lua来快速开发基于nginx下的业务逻辑
  该模块不在nginx源码包中,需自行下载编译安装。使用lua 5.1(目前不支持lua 5.2) 或 luajit 2.0 。
  添加lua支持后,开发复杂的模块,周期快,依然是100%异步非阻塞。
  ngx_lua 哪些人在用:
  淘宝、腾讯财经、网易财经、360、去哪儿网等
  CloudFlare, CNN, Wingify, Reblaze, Turner, Broadcasting System
  该项目主要开发者:
  chaoslawful Taobao, Alibaba Grp.
  agentzh CloudFlare
  https://github.com/chaoslawful/lua-nginx-module
  1.2. 安装
  1.2.1. 安装JIT平台
  JIT
  通常,程序有两种运行方式:静态编译与动态直译。
  静态编译的程序在执行前全部被翻译为机器码,而动态直译执行的则是一句一句边运行边翻译。
  即时编译(Just-In-Time Compiler)则混合了这二者,一句一句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。
  JAVA、.NET 实现都使用即时编译以提供高速的代码执行。
  注意:
  在nginx.conf中添加”lua_code_cache on/off”,来开启是否将代码缓存,所以每次变更”*.lua”文件时,必须reload nginx才可生效。仅针对”set_by_lua_file, content_by_lua_file, rewrite_by_lua_file, and access_by_lua_file”有效, 因为其他为写在配置文件中,更改代码也必须reload nginx。在生产环境下,不能禁用cache。同时在lua代码中使用”dofile” 或 “loadfie” 来加载外部lua脚本将不会对它进行缓存,应该使用”require”来代替。禁用cache,当且仅当在调式代码下。
  LuaJIT
  是一个利用JIT编译技术把Lua脚本直接编译成机器码由CPU运行
  版本:2.0 与 2.1
  当前稳定版本为 2.0。
  2.1为版本与ngx_lua将有较大性能提升,主要是CloudFlare公司对luajit的捐赠。
  FFI库,是LuaJIT中最重要的一个扩展库。
  1. 它允许从纯Lua代码调用外部C函数,使用C数据结构;
  2. 就不用再像Lua标准math库一样,编写Lua扩展库;
  3. 把开发者从开发Lua扩展C库(语言/功能绑定库)的繁重工作中释放出来;
  1.3. Nginx与Lua执行顺序
  1.3.1. Nginx顺序
  Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序。
  Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是
  post-read、server-rewrite、find-config、rewrite、post-rewrite、 preaccess、access、post-access、try-files、content、log.
  post-read:
  读取请求内容阶段
  Nginx读取并解析完请求头之后就立即开始运行
  例如模块 ngx_realip 就在 post-read 阶段注册了处理程序,它的功能是迫使 Nginx 认为当前请求的来源地址是指定的某一个请求头的值。
  server-rewrite
  Server请求地址重写阶段
  当 ngx_rewrite 模块的set配置指令直接书写在 server 配置块中时,基本上都是运行在 server-rewrite 阶段
  find-config
  配置查找阶段
  这个阶段并不支持 Nginx 模块注册处理程序,而是由 Nginx 核心来完成当前请求与 location 配置块之间的配对工作。
  rewrite
  Location请求地址重写阶段
  当 ngx_rewrite 模块的指令用于 location 块中时,便是运行在这个 rewrite 阶段。
  另外,ngx_set_misc(设置md5、encode_base64等) 模块的指令,还有 ngx_lua 模块的 set_by_lua 指令和 rewrite_by_lua 指令也在此阶段。
  post-rewrite
  请求地址重写提交阶段
  由 Nginx 核心完成 rewrite 阶段所要求的“内部跳转”操作,如果 rewrite 阶段有此要求的话。
  preaccess
  访问权限检查准备阶段
  标准模块 ngx_limit_req 和 ngx_limit_zone 就运行在此阶段,前者可以控制请求的访问频度,而后者可以限制访问的并发度。
  access
  访问权限检查阶段
  标准模块 ngx_access、第三方模块 ngx_auth_request 以及第三方模块 ngx_lua 的 access_by_lua 指令就运行在这个阶段。
  配置指令多是执行访问控制性质的任务,比如检查用户的访问权限,检查用户的来源 IP 地址是否合法
  post-access
  访问权限检查提交阶段
  主要用于配合 access 阶段实现标准 ngx_http_core 模块提供的配置指令 satisfy 的功能。
  satisfy all(与关系)
  satisfy any(或关系)
  try-files
  配置项try_files处理阶段
  专门用于实现标准配置指令 try_files 的功能
  如果前 N-1 个参数所对应的文件系统对象都不存在,try-files 阶段就会立即发起“内部跳转”到最后一个参数(即第 N 个参数)所指定的 URI.
  content
  内容产生阶段
  Nginx 的 content 阶段是所有请求处理阶段中最为重要的一个,因为运行在这个阶段的配置指令一般都肩负着生成“内容”并输出 HTTP 响应的使命。
  log
  日志模块处理阶段
  记录日志
  淘宝有开放一个nginx开发手册,里面包含很多有用的资料
  http://tengine.taobao.org/book/
  作者的google论坛:
  https://groups.google.com/forum/#!forum/openresty
  1.3.2. Lua顺序
  Nginx下Lua处理阶段与使用范围:
  init_by_lua http
  set_by_lua server, server if, location, location if
  rewrite_by_lua http, server, location, location if
  access_by_lua http, server, location, location if
  content_by_lua location, location if
  header_filter_by_lua http, server, location, location if
  body_filter_by_lua http, server, location, location if
  log_by_lua http, server, location, location if
  init_by_lua:
  在nginx重新加载配置文件时,运行里面lua脚本,常用于全局变量的申请。
  例如lua_shared_dict共享内存的申请,只有当nginx重起后,共享内存数据才清空,这常用于统计。
  set_by_lua:
  设置一个变量,常用与计算一个逻辑,然后返回结果
  该阶段不能运行Output API、Control API、Subrequest API、Cosocket API
  rewrite_by_lua:
  在access阶段前运行,主要用于rewrite
  access_by_lua:
  主要用于访问控制,能收集到大部分变量,类似status需要在log阶段才有。
  这条指令运行于nginx access阶段的末尾,因此总是在 allow 和 deny 这样的指令之后运行,虽然它们同属 access 阶段。
  content_by_lua:
  阶段是所有请求处理阶段中最为重要的一个,运行在这个阶段的配置指令一般都肩负着生成内容(content)并输出HTTP响应。
  header_filter_by_lua:
  一般只用于设置Cookie和Headers等
  该阶段不能运行Output API、Control API、Subrequest API、Cosocket API
  body_filter_by_lua:
  一般会在一次请求中被调用多次, 因为这是实现基于 HTTP 1.1 chunked 编码的所谓“流式输出”的。
  该阶段不能运行Output API、Control API、Subrequest API、Cosocket API
  log_by_lua:
  该阶段总是运行在请求结束的时候,用于请求的后续操作,如在共享内存中进行统计数据,如果要高精确的数据统计,应该使用body_filter_by_lua。
  该阶段不能运行Output API、Control API、Subrequest API、Cosocket API

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-427291-1-1.html 上篇帖子: Nginx状态信息(status)配置及信息详解 下篇帖子: 整合Tomcat和Nginx实现动静态负载均衡
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表