OpenResty 中的 Nginx 基础知识

news2024/11/17 19:44:54

Nginx 版本

OpenResty 的版本,落后于标准 Nginx 版本不少,所以较新的 Nginx 支持的功能,OpenResty 不一定支持

Nginx 进程模型

当启动 Nginx 后我们使用 ps 来查看相关进程:

$ ps -ef --forest | grep nginx
root     32475     1  0 13:36 ?        00:00:00 nginx: master process /usr/sbin/nginx
                                                -c /etc/nginx/nginx.conf
nginx    32476 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32477 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32479 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32480 32475  0 13:36 ?        00:00:00  _ nginx: worker process
nginx    32481 32475  0 13:36 ?        00:00:00  _ nginx: cache manager process
nginx    32482 32475  0 13:36 ?        00:00:00  _ nginx: cache loader process

Nginx 有且只有一个 Master 进程来执行一些高权限的操作,比如读取配置和绑定端口等,但不负责处理请求,而 Worker 进程的数量一般与宿主机 CPU 逻辑核数保持一致。当 Nginx 启动或重载时,Master 进程会 fork 出 Worker 进程集合,它们之间相互独立,有点像 Chrome 浏览器的标签页,某一个崩溃了并不会影响到其他的。

正式如此的架构赋予了 Nginx 二进制热升级的能力。

热升级通过向旧的 Master 进程发送 USR2 和 WINCH 信号量来启动新的 Master 进程和逐步关掉 Worker 进程。这时如果需要回滚,依旧可以给旧的 Master 发送 HUP 信号量,如果确定不需要回滚,就可以给旧 Master 发送 KILL 信号量来退出。

Nginx 架构官方文档:https://www.nginx.com/blog/inside-nginx-how-we-designed-for-performance-scale/

Nginx 执行阶段

Nginx 有 11 个执行阶段,可以从源码 https://github.com/nginx/nginx/blob/master/src/http/ngx_http_core_module.h 中看到:

typedef enum {
    NGX_HTTP_POST_READ_PHASE = 0,

    NGX_HTTP_SERVER_REWRITE_PHASE,

    NGX_HTTP_FIND_CONFIG_PHASE,
    NGX_HTTP_REWRITE_PHASE,
    NGX_HTTP_POST_REWRITE_PHASE,

    NGX_HTTP_PREACCESS_PHASE,

    NGX_HTTP_ACCESS_PHASE,
    NGX_HTTP_POST_ACCESS_PHASE,

    NGX_HTTP_PRECONTENT_PHASE,

    NGX_HTTP_CONTENT_PHASE,

    NGX_HTTP_LOG_PHASE
} ngx_http_phases;

OpenResty 中 *_by_lua 指令与 Nginx 其中 4 个阶段的关系如下图:

这也是 OpenResty 开发时需要时刻对照的一张图。

  • init_by_lua 在 Nginx Master 进程创建时执行,也就是在整个 Nginx 生命周期中只会执行一次

    通常在 init_by_lua 阶段预先加载 Lua 模块和公共的只读数据,这样可以利用操作系统的 COW (copy on write) 特性来节省一些内存。

    # this runs before forking out nginx worker processes:
    init_by_lua_block { require "cjson" }
    
    server {
        location = /api {
            content_by_lua_block {
                -- the following require() will just  return
                -- the alrady loaded module from package.loaded:
                ngx.say(require "cjson".encode{dog = 5, cat = 6})
            }
        }
    }
    
  • init_worker_by_lua 在每个 Nginx Worker 进程创建时执行,这个锚点经常用于创建定时器(通过 ngx.timer.at Lua API)。

    init_worker_by_lua '
        local delay = 3  -- in seconds
        local new_timer = ngx.timer.at
        local log = ngx.log
        local ERR = ngx.ERR
        local check
    
        check = function(premature)
            if not premature then
                -- do the health check or other routine work
                local ok, err = new_timer(delay, check)
                if not ok then
                    log(ERR, "failed to create timer: ", err)
                    return
                end
            end
        end
    
        local hdl, err = new_timer(delay, check)
        if not hdl then
            log(ERR, "failed to create timer: ", err)
            return
        end
    ';
    
  • set_by_lua

    业务代码的操作通常可以在从 set_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

    日志记录

OpenResty lua-nginx-module 文档 https://github.com/openresty/lua-nginx-module/blob/master/README.markdown 对每个指令的用法都有非常详尽的描述。

尤其要注意每个锚点支持的 Nginx context,也就是 Nginx 配置文件中指令的作用域。指令被写在不支持的上下文中会导致 OpenResty 启动失败。

OpenResty 开发原则

  • 尽可能少地得配置 nginx.conf
  • 避免使用 if、set 、rewrite 等多个指令的配合
  • 尽量用 Lua 脚本来控制 Nginx 的行为

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL超级第12章学习笔记:管线监控

前言 本篇在讲什么 OpenGL蓝宝书第十二章学习笔记之管线监控 本篇适合什么 适合初学OpenGL的小白 本篇需要什么 对C语法有简单认知 对OpenGL有简单认知 最好是有OpenGL超级宝典蓝宝书 依赖Visual Studio编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c…

C++编译过程

How the C Compiler works? 文章目录 How the C Compiler works?compilingExamples总结欢迎关注公众号【三戒纪元】 通过编程,是的text程序编程可执行文件,基本上主要有2个操作发生: compiling 编译linking 链接 compiling C 编辑器要做的…

VXLAN:数据中心网络的未来

概要 随着云计算和虚拟化技术的快速发展,数据中心网络正面临着越来越大的挑战。传统的网络架构在适应大规模数据中心的需求方面存在一些限制,如扩展性、隔离性和灵活性等方面。为了克服这些限制,并为数据中心网络提供更好的性能和可扩展性&am…

【好书精读】网络是怎样连接的 之 连接服务器

(该图由AI制作 学习AI绘图 联系我) 目录 1 连接是什么意思 1.1 连接实际上是通信双方交换控制信息 2 负责保存控制信息的头部 2.1 客户端与服务器之间交换的控制信息 连接操作的实际过程 1 连接是什么意思 创建套接字之后 , 应用程序 …

Selenium教程__使用execute_script执行JavaScript(11)

selenium的包含的方法已能完全满足UI自动化,但是有些时候又不得不用到执行JS的情况,比如在一个富文本框中输入1W个字,使用send_keys方法将经历漫长的输入过程,如果换成使用JS的innerHTML方法就能够很快的完成输入。 selenium执行…

Shell 函数实现Go语言多版本管理轻量级方案

现有的工具方案 https://github.com/moovweb/gvmhttps://github.com/voidint/g 我的方案 优点: 原生:基于 go 语言本身支持多版本的能力实现,可以下载任何官方发布的版本简单:shell 函数实现,直接集成到 bashrc 或…

软件测试技能,JMeter压力测试教程,HTTP Cookie管理器(四)

目录 前言 一、场景案例 二、HTTP Cookie管理器 三、302 重定向 前言 Web网站的请求大部分都有cookies,jmeter的HTTP Cookie管理器可以很好的管理cookies 我用的 jmeter5.1 版本,直接加一个HTTP Cookie管理器放到请求的最前面,就可以自…

用docker搭建selenium grid分布式环境实践

目录 前言: selenium jar包直接启动节点 用docker命令直接启动 docker-compose 启动 Hub和node在一台机器上 Hub和node不在一台机器上 遗留问题 总结 前言: Selenium是一个流行的自动化测试工具,支持多种编程语言和多种浏览器。Sele…

【微服务架构演进】一文读懂单片到微服务架构的模式和最佳实践

在本文中,我们将学习如何使用设计模式、原则和最佳实践来设计微服务架构。我们将使用正确的架构设计模式和技术。 在本文结束时,您将了解如何在微服务分布式架构上设计系统以实现高可用性、高可扩展性、低延迟和对网络故障的弹性,从而处理数百…

学习Spring之声明式事务

什么是事务? 一个业务有一组操作,要么都成功,要么都失败 事务的四大特性:ACID A 原子性:一组操作,要么都成功,要么都失败 C 一致性 :事务的前后要保证事务的一致性 I 隔离性 &…

QLabel的使用

QLabel介绍 QLabel 是 Qt 框架中的一个控件类,用于显示文本或图像。它可以在窗口或其他容器中显示静态文本,并且可以根据需要设置格式、对齐方式和尺寸。 主要作用如下: 显示文本内容:QLabel 可以显示文字内容,可以…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二天

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

Spring Boot 中使用 @EventListener 注解监听事件

Spring Boot 中使用 EventListener 注解监听事件 Spring Boot 是一个流行的 Java Web 框架,它提供了丰富的功能和工具来简化开发人员的工作。其中一个非常有用的功能是事件监听器。在 Spring Boot 中,我们可以使用 EventListener 注解来监听事件&#x…

一天时间完成Python入坑(开发环境搭建、excel解析、exe打包三步走)

0.为什么要入坑Python 早就知道Python好,Python妙,Python用起来呱呱叫。工作上一直没有什么用得上Python的必要性,就一直没有接触,本次终于来了机会:【图新地球桌面端要对外开放Python API】,开放图新地球的…

【mars3d】Cesium实现雷达放射波

Cesium实现雷达放射波 1、雷达放射波 先看效果图 说明&#xff1a;使用的是mars3d框架&#xff0c;原生的Cesium实现方式可以绕道~ 实现方式&#xff1a; <template><div id"mars3dContainer"></div> </template><script setup> i…

Fiddler抓包基础使用

目录 一、设置抓谷歌浏览器https数据包 1、选中以下选项即可 2、若是选中后还是未抓到HTTPS数据包&#xff0c;则可进行以下操作 二、设置抓取Firefox浏览器HTTPS数据包 1、Firefox的代理需设置系统代理&#xff0c;设置→高级→网络设置&#xff0c;设置为系统代理&#…

【深度学习】5-3 与学习相关的技巧 - Batch Normalization

如果为了使各层拥有适当的广度&#xff0c;“强制性”地调整激活值的分布会怎样呢&#xff1f;实际上&#xff0c;Batch Normalization 方法就是基于这个想法而产生的 为什么Batch Norm这么惹人注目呢?因为Batch Norm有以下优点&#xff1a; 可以使学习快速进行(可以增大学习…

广工赢清华,炸裂!

去年2022年广工对阵清华&#xff0c;我在知乎写了文章 清华赢球靠的是广东第一高中生邹阳和2022届CBA状元王岚嵚。 比分焦灼的第四节关键时刻&#xff0c;邹阳在左角底线持球高高举起篮球&#xff0c;那个球的弧度非常高&#xff0c;皮球以稳稳的抛物线弧度掉入篮筐。 之后&…

Python基础(21)——Python函数实战、递归、lambda、高阶函数

Python基础&#xff08;21&#xff09;——Python函数实战、递归、lambda、高阶函数 文章目录 Python基础&#xff08;21&#xff09;——Python函数实战、递归、lambda、高阶函数目标一. 应用&#xff1a;学员管理系统1.1 系统简介1.2 步骤分析1.3 需求实现1.3.1 显示功能界面…

Streamlit基础教程

streamlit是什么 streamlit是一个开源的python库&#xff0c;它能够快速的帮助我们创建定制化的web应用&#xff0c;而且还非常便于和他人分享&#xff0c;特别是在机器学习和数据科学领域。整个过程不需要你了解任何前端的知识&#xff0c;包括html、css、javascript等&#x…