Nginx 模块系统:前篇

2024-01-24 11:18
文章标签 模块 系统 nginx 前篇

本文主要是介绍Nginx 模块系统:前篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Nginx 模块系统:前篇

从 Nginx 第一个版本至今已有 17 个年头,在这十余年里,Nginx 一直把持着 Web 服务软件第一梯队的宝座,它背后的丰富的模块系统,犹如蒙古铁骑举着 Nginx 的旗帜,扫荡了全球该领域的大半的市场。

但是我们知道,软件编译是十分耗时的,非常不利于“快速行军”,除了堆硬件外,Nginx 是如何保持相对高速的迭代过程的呢?这背后模块系统和动态模块设计功不可没。

本篇作为第一篇,聊聊书本之外的 Nginx 模块的一些事情,希望能让你对 Nginx 的模块有更立体的认知。

写在前面

2015 年 Nginx 首席工程师 Ruslan Ermilov 的一篇 PPT 分享粗略的提到了 Nginx 模块系统进化过程,以及如何进行动态模块开发。随后在 Nginx 1.19.7 版本中,代码仓库也正式增加了动态模块的编译方式和相关代码。

在一年之后 2016年10月末,一篇来自 Nginx 官方技术博客的文章 “Compiling Third-Party Dynamic Modules for NGINX and NGINX Plus”正式宣布了 Nginx 的新版本 1.9.11 正式支持三方动态模块功能。

自此之后,构建动态模块,再也不单单是社区其他开源的 “Nginx Like” 软件的特权,使用 Nginx 官方发行软件也能够进行更快速的开发、迭代了。

早在 2012 年的秋天,Tengine 团队推出的 1.4.0 版本便支持了该功能,相比较 Nginx 官方团队迟到的 DSO 功能,足足早了 4 年,我们不知道这四年间基于 Nginx 里做 intra 相关的开发者对着屏幕漫长的编译过程,白白消耗了多少时间。但是我们知道在在此期间的阿里云的业务增幅都是三位数的增长,作为阿里巴巴所有业务七层流量入口,提供了大量“应用功能”的 Tengine 功不可没。

但是迟到总比不到强,不是么。

在聊动态模块之前,我们首先要了解它的模块系统。

Nginx 的模块系统

Nginx 的模块系统主要分为“核心功能模块”和“动态模块”,其中动态模块又分为官方模块和三方模块。某种意义上来看,Nginx 的模块算是一种 AOP 思想的应用实践。

Nginx 的内部模块系统

Nginx 能保持高度曝光发展到今天,除了因为有大量三方模块外,这些拥有稳定质量的内部模块同样功不可没。

分别是负责内部通用数据类型、数据对象、内存管理、文件管理、哈希校验、网络通信、锁、网络连接、日志管理、计时器的“核心模块”;负责在不同操作系统,使用不同的事件方案最优解的“事件模块”;负责门面担当、提供高性能 Web 服务的 “HTTP 模块”;提供通用 TCP 代理服务功能的“流模块”;负责邮件服务代理功能的“邮件功能”;以及解决系统差异的“OS模块”。时至今日,这些模块还在保持着比较高的频率进行小步迭代,不断进行优化。

这些模块是 Nginx 的一部分,在一次次编译后,伴随着二进制软件包被分发至千家万户,跨越国界、跨越操作系统,大到绵延数个国家的跨国商业公司、小到你家里的路由器、甚至是电梯里的工控机中都能看到它的身影。

如果 Nginx 缺少了以上任何一个模块、或者模块和 Nginx 主文件版本不一致,软件都将停止工作、或者无法提供高质量的服务能力,可以被称之“亲儿子模块”,都属于标准的静态模块。

前文提到过,软件编译是十分耗时的,文件/功能越多,依赖越多,时间越长。Nginx 最初版本出现时,算上三方模块,Nginx 一共只有三十余模块,但是时至今日,仅仅是官方模块文档中收录的三方模块,就有一百五十多个,还有许多模块散落在各种代码开源平台、个人博客中。

随着 Nginx 版本迭代更新,如果这些模块没有跟上版本迭代而和 Nginx 一起重新构建编译,那么原本的功能便会失效或者引起软件故障。漫长的编译过程,对于模块维护者,尤其是为爱发电的开源作者们来说,无疑是一个不必要的负担。

所以在 Tengine / Openresty 一经推出 Lua 模块之后,便吸引了大量“刚需”用户,在保持差不多 Nginx 性能的水准下,大幅降低了开发的时间成本和学习成本。

于是官方在 2016 年正式推出了支持“三方动态模块”的功能,也就是下文将要提到的外部模块。

Nginx 的外部模块

提到 Nginx 的外部模块,其实分为两类,一类是官方为了保持具备 Nginx 核心功能的软件包小巧、资源占用高效,而特意剥离出来的拥有完整功能,但是不是每个人都需要的模块。另外一类则是完全由社区用户、一些商业公司提供的功能模块。早些时候,官方推出了一个专门用于陈列动态模块的页面,如果你感兴趣可以访问页面进行更直观的了解。

可以说前者同样是属于“亲儿子”阵营,只是“常常住校”不常在家里,后者只是的名誉上的儿子,我们一般称呼为“干儿子”。

这类模块可以单独进行编译,相比较带着 Nginx 这个妈一起构建,时间缩短了至少一个量级,并且可以做到相同 Nginx 版本下,随意组合模块使用,不论是在分发体验,还是使用体验上都有了巨大的“进化”。

在工程效率有了质的提升之后,Nginx 官方推出的软件功能也越来越多,官方在同年年末博客文章中提到的战略产品 Nginx Plus 的主要功能几乎都是由动态模块实现:Brotli、Cookie-Flag、Encrypted-Session、FIPS Status Check、GeoIP、GeoIP2、Headers-More、HTTP Substitutions Filter、Image-Filter、Lua、njs Scripting Language、NGINX ModSecurity WAF、NGINX Developer Kit、OpenTracing、Phusion Passenger Open Source、Perl、Prometheus-njs、RTMP、Set-Misc、SPNEGO、XSLT…

能够动态的加载外部模块好归好,但是也有许多问题和挑战。虽然每个现代操作系统都提供了类似 dlopen 的动态链接库的系统接口,但是玩过应用“动态化”的工程师都知道这里面是个深坑。比如常见的 “Dependency hell” 的问题,类似这个 Bug;一些加载失败的场景检测和对应的处理;或者是五花八门的跨平台编译错误,如果你有耐心,可以在官方问题追踪系统中找到更多的内容。

相比较之前没有动态模块时的状况来看,Nginx 工程师需要承担的 “客服” 解释答疑、以及修复问题相关工作,明显变多了,但是好处也是实打实的:软件生态更开放了、编译效率提升了。F5 公司的股价在五年内也由最初100刀涨到了一度接近翻番,某种程度印证了一句老话“做产品不如做渠道、做渠道不如做平台、做平台不如做生态”。

最后

观察 Nginx 以及一些其他的基于开源软件成长起来的历程,会发现许多好的软件都是相似的,拥有部分开放的规范和接入能力,允许社区进行贡献,然后深入某个或者某些领域功能,不断进行模块功能优化,最终形成拥有相对完整的生态,细分场景又可以打的很深入的局面。

下篇文章中,我们继续聊聊 Nginx 模块的另外一个话题,如何编写和编译一个 Nginx 模块。

–EOF


我们有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

在不发广告的情况下,我们在里面会一起聊聊软硬件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,备注实名,否则不会通过审核)

关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2021年03月05日
统计字数: 4013字
阅读时间: 9分钟阅读
本文链接: https://soulteary.com/2021/03/05/nginx-module-system-part-1.html

这篇关于Nginx 模块系统:前篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639522

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识