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

相关文章

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

前端如何通过nginx访问本地端口

《前端如何通过nginx访问本地端口》:本文主要介绍前端如何通过nginx访问本地端口的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、nginx安装1、下载(1)下载地址(2)系统选择(3)版本选择2、安装部署(1)解压(2)配置文件修改(3)启动(4)

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Nginx 重写与重定向配置方法

《Nginx重写与重定向配置方法》Nginx重写与重定向区别:重写修改路径(客户端无感知),重定向跳转新URL(客户端感知),try_files检查文件/目录存在性,return301直接返回永久重... 目录一.try_files指令二.return指令三.rewrite指令区分重写与重定向重写: 请求

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

Nginx 配置跨域的实现及常见问题解决

《Nginx配置跨域的实现及常见问题解决》本文主要介绍了Nginx配置跨域的实现及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来... 目录1. 跨域1.1 同源策略1.2 跨域资源共享(CORS)2. Nginx 配置跨域的场景2.1

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构