OpenResty--------核心执行阶段篇

前言

前两篇分别介绍了OpenResty核心概念和,优势与架构等信息,进行本篇之前建议至少观看一遍。

背景

之前篇章介绍了OpenResty是基于Nginx为基础核心的开发平台,
本篇将继续介绍基础平台(Nginx)的主要特性。

特性

执行阶段

OpenResty将应用分为4个大阶段,11个小阶段,如下图所示。

  • 初始化阶段: master进程启动预加载/生成worker进程预加载
  • 转发/访问阶段:url转发,权限判断
  • 内容处理/生成阶段: 内容生成
  • 日志阶段: 日志记录

开发中常用的7阶段

  • set_by_lua*: 流程分支处理判断变量初始化
  • rewrite_by_lua*: 转发、重定向、缓存等功能(例如特定请求代理到外网)
  • access_by_lua*: IP 准入、接口权限等情况集中处理(例如配合 iptable 完成简单防火墙)
  • content_by_lua*: 内容生成
  • header_filter_by_lua*: 响应头部过滤处理(例如添加头部信息)
  • body_filter_by_lua*: 响应体过滤处理(例如完成应答内容统一成大写)
  • log_by_lua*: 会话完成后本地异步完成日志记录(日志可以记录在本地,还可以同步到其他机器)

测试[常用的7阶段]

环境

[[email protected] ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[[email protected] ~]# uname -r
3.10.0-693.el7.x86_64

OpenResty版本

[[email protected] ~]# /opt/openresty-1.13.6.2/bin/openresty -v
nginx version: openresty/1.13.6.2

创建测试项目目录

[[email protected] ~]# mkdir -vp openresty-phase-test/{conf,logs}
mkdir: created directory ‘openresty-phase-test’
mkdir: created directory ‘openresty-phase-test/conf’
mkdir: created directory ‘openresty-phase-test/logs’

编写配置文件

通过ngx.log输出错误级别日志至文件中

[[email protected] ~]# cat openresty-phase-test/conf/nginx.conf
worker_processes 1; # 设置worker数量
error_log logs/error.log; # 指定错误日志文件路径
events {
    worker_connections 1024; # 单个worker进程最大允许同时建立外部连接的数量
}

http {
    server {
        listen 9999; # 设置监听端口, 注意系统其它服务是否已占用该端口

        location / {
            set_by_lua_block $a {
                ngx.log(ngx.ERR, "my is set_by_lua_block phase")
            }

            rewrite_by_lua_block {
                ngx.log(ngx.ERR, "my is rewrite_by_lua_block phase")
            }

            access_by_lua_block {
                ngx.log(ngx.ERR, "my is access_by_lua_block phase")
            }

            content_by_lua_block {
                ngx.log(ngx.ERR, "my is content_by_lua_block phase")
            }

            header_filter_by_lua_block {
                ngx.log(ngx.ERR, "my is header_filter_by_lua_block phase")
            }

            body_filter_by_lua_block {
                ngx.log(ngx.ERR, "my is body_filter_by_lua_block phase")
            }

            log_by_lua_block {
                ngx.log(ngx.ERR, "my is log_by_lua_block phase")
            }
        }
    }
}

通过openresty运行应用

[[email protected] ~]# /opt/openresty-1.13.6.2/bin/openresty -p openresty-phase-test

查看错误日志文件内容

[[email protected] ~]# cat openresty-phase-test/logs/error.log
[[email protected] ~]#

此时错误日志文件内容为空

通过curl工具发起测试请求[本地,端口为配置文件中的9999]

[[email protected] ~]# curl 127.0.0.1:9999                      

查看错误日志文件内容

2019/08/02 05:34:22 [error] 1092#0: *1 [lua] set_by_lua:2: my is set_by_lua_block phase, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:9999"
2019/08/02 05:34:22 [error] 1092#0: *1 [lua] rewrite_by_lua(nginx.conf:18):2: my is rewrite_by_lua_block phase, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:9999"
2019/08/02 05:34:22 [error] 1092#0: *1 [lua] access_by_lua(nginx.conf:22):2: my is access_by_lua_block phase, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:9999"
2019/08/02 05:34:22 [error] 1092#0: *1 [lua] content_by_lua(nginx.conf:27):2: my is content_by_lua_block phase, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:9999"
2019/08/02 05:34:22 [error] 1092#0: *1 [lua] header_filter_by_lua:2: my is header_filter_by_lua_block phase, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:9999"
2019/08/02 05:34:22 [error] 1092#0: *1 [lua] body_filter_by_lua:2: my is body_filter_by_lua_block phase, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:9999"
2019/08/02 05:34:22 [error] 1092#0: *1 [lua] log_by_lua(nginx.conf:39):2: my is log_by_lua_block phase while logging request, client: 127.0.0.1, server: , request: "GET / HTTP/1.1", host: "127.0.0.1:9999"

可以看到安排阶段顺序进行输出

原文地址:https://blog.51cto.com/lisea/2425794

时间: 2024-10-22 17:30:55

OpenResty--------核心执行阶段篇的相关文章

自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)

将陆续上传新书<自己动手写CPU>,今天是第42篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 9.3.2 修改执行阶段 1.修改EX模块 在执行阶段的EX模块会计算加载存储的目的地址,参考图9-19可知,EX模块会增加部

Nginx Lua的执行阶段

对刚接触Ngx_lua的读者来说,可能会存在下面两个困惑. 1.Lua在Nginx的哪些阶段可以执行代码?Lua在Nginx的每个阶段可以执行哪些操作? 2.只有理解了这两个问题,才能在业务中巧妙地利用Ngx_Lua来完成各项需求. Nginx的11个执行阶段,每个阶段都有自己能够执行的指令,并可以实现不同的功能.Ngx_Lua的功能大部分是基于Nginx这11个执行阶段开发和配置的,Lua代码在这些指令块中执行,并依赖于它们的执行顺序.本章将对Ngx_Lua的执行阶段进行一一讲解. 一. in

JS中的预编译(词法分析)阶段和执行阶段

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段,而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行),了解javascript引擎的执行机理,将有助于在写js代码过程中的思路总结 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预

javascript运行过程中的“预编译阶段”和“执行阶段”

javascript相对于其它语言来说是一种弱类型的语言,在其它如java语言中,程序的执行需要有编译的阶段 而在javascript中也有类似的“预编译阶段”(javascript的预编译是以代码块为范围<script></script>,即每遇到一个代码块都会进行  预编译>执行), 首先科普下javascript中的两种声明方式,var和function,前者声明的是变量,后者声明的是方法 在预编译中,javascript对这两种声明做出了两种处理方案 <scri

JS预处理阶段、执行阶段的理解

预处理阶段涉及到变量和(以函数声明方式声明的)函数的声明的提前的原理,并且涉及到声明变量冲突时候的一些问题.需要与执行阶段进行一定的区分,进而加深理解. 1. 预处理阶段将变量保存在window域中,会扫描用var操作符声明的变量以及用函数声明的方式声明的函数指针.因此会产生变量提前和函数声明提前的效果. 需要说明的是: 如果变量并没有用var声明,如b = 1:那么即使在函数执行阶段将其默认为全局变量,在预处理阶段也不会将其添加到window域中.直到执行到这一条语句的时候,才会将其和对应的值

测试执行阶段一般要做哪些事情?

什么是测试执行?测试执行在实际工作过程中一般指1)测试用例编写完成2)测试数据准备完成3)开发完成开发.自测.提测4)测试环境搭建完毕以上四点完成之后,接下来要做的具体工作测试执行阶段要做的事情:1.对软件进行冒烟测试,也叫做预测试2.根据测试方案和测试策略.计划 进行软件的功能测试,执行测试用例3.记录测试结果4.讨论定位确认发现的问题5.发散测试(测试时间充裕的情况下)6.文档测试7.测试总结报告http://www.bcbxhome.com/bcbx/forum.php?mod=viewt

kubernetes之K8s核心原理--第一篇(五)

  本来以为一篇就能搞定,还是低估了自己的废话,好吧,只能通过两篇文章向大家介绍K8s核心原理. 一. Kubernetes API Server 原理分析 1. kubernetes API Server介绍   kubernetes API server的和核心功能是提供了kubernetes各类资源对象(pod.RC .service等)的增.删.改.查以及watch等HTTP Rest接口,是整个系统的数据总线和数据中心.有时候我们使用kubectl创建或者查看pod等资源的时候,发现没

css核心基础总结篇

今日这篇是整合前面的css补充知识的. 我觉得前面的关于css的知识补充进去有点乱,今日整理整理一下. 层叠样式表 层叠是什么意思?为什么这个词如此重要,以至于要出现在它的名称里. 层叠可以简单地理解为冲突的解决方案. 什么是冲突? 就是同个元素在使用不同的选择器选择中后添加相同的样式. 优先级规则可以表述为 行内样式>ID样式>类别样式>标记样式 在复杂的页面中,某一个元素有可能会从很多地方获取样式,例如一个网站的某一 级标题整体设置为使用绿色,而对某个特殊栏目需要使用蓝色,这样在栏目

Android核心分析28篇,强烈推荐android初学者,android进阶者看看这个系列教程

Android核心分析 之一分析方法论探讨之设计意图 http://www.apkbus.com/android-24212-1-1.html Android核心分析 之二方法论探讨之概念空间篇 http://www.apkbus.com/android-24213-1-1.html Android是什么 之三手机之硬件形态 http://www.apkbus.com/android-24215-1-2.html Android核心分析之四手机的软件形态 http://www.apkbus.co