Nginx模块开发手册
- 格式:doc
- 大小:141.50 KB
- 文档页数:26
Nginx入门教程题目Nginx入门教程作者杨新彦状态创建完成时间 2012 年 7 月2 日1 Nginx概述Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。
Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器。
(更多介绍参照百科,更多使用参照GOOGLE,广而告之)2 Nginx安装2.1 Nginx下载地址本文以windows平台下nginx/Windows-1.3.2安装为例,其下载地址为/en/download.html;2.2 安装下载后解压缩放到D:\tools目录下,如下图2-1所示图2-1进入dos命令行界面,通过命令start nginx启动服务器,如下图2-2所示图2-2启动瞬间感觉到屏幕一闪而过,看一下logs目录下是不是多一个nginx.pid文件,cmd窗口输入D:\tools\nginx-1.3.2>tasklist /fi "imagename eq nginx.exe";结果如下图2-3所示:图2-3说明nginx已经成功启动,有两个进程,按照官方解释,nginx是守护进程,其中一个是一直等待处理时间当中,当有事件被触发时,就启动另外一个进程处理相关请求。
Nginx默认端口号为80,可以访问http://localhost ,如下图2-4所示图2-42.3 ngnix常见命令3 配置测试3.1反向代理反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端此时代理服务器对外就表现为一个服务器。
Nginx配置详解序言Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。
从2004年发布至今,凭借开源的力量,已经接近成熟与完善。
Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。
支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。
并且支持很多第三方的模块扩展。
Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。
牛逼吹的差不多啦,如果你还不过瘾,你可以百度百科或者一些书上找到这样的夸耀,比比皆是。
Nginx常用功能1、Http代理,反向代理:作为web服务器最常用的功能之一,尤其是反向代理。
这里我给来2张图,对正向代理与反响代理做个诠释,具体细节,大家可以翻阅下资料。
Nginx在做反向代理时,提供性能稳定,并且能够提供配置灵活的转发功能。
Nginx 可以根据不同的正则匹配,采取不同的转发策略,比如图片文件结尾的走文件服务器,动态页面走web服务器,只要你正则写的没问题,又有相对应的服务器解决方案,你就可以随心所欲的玩。
并且Nginx对返回结果进行错误页跳转,异常判断等。
如果被分发的服务器存在异常,他可以将请求重新转发给另外一台服务器,然后自动去除异常服务器。
2、负载均衡Nginx提供的负载均衡策略有2种:内置策略和扩展策略。
内置策略为轮询,加权轮询,Ip hash。
扩展策略,就天马行空,只有你想不到的没有他做不到的啦,你可以参照所有的负载均衡算法,给他一一找出来做下实现。
上3个图,理解这三种负载均衡算法的实现Ip hash算法,对客户端请求的ip进行hash操作,然后根据hash结果将同一个客户端ip的请求分发给同一台服务器进行处理,可以解决session不共享的问题。
3、web缓存Nginx可以对不同的文件做不同的缓存处理,配置灵活,并且支持FastCGI_Cache,主要用于对FastCGI的动态程序进行缓存。
nginx文档吴东April 28, 2009Contents1前言52基本配置72.1安装 (7)2.2配置说明 (10)2.3启动和控制 (25)3深入源码273.1源码结构 (27)3.2configure配置 (27)3.3nginx源码习惯 (27)3.4常用基础库 (28)3.5core模块 (40)3.6event模块 (44)3.7http模块 (46)4模块编写554.1http模块编写 (55)4.2基于nginx的高性能服务器开发. . . . . . . . . 555附录575.1编译器参数 (57)5.2系统函数 (59)CONTENTS CONTENTSChapter 1前言在互联网编程中,http服务器编程作为一个非常重要方向一直为各种语言所重视,从c语言的apache,Lighttpd到当前非常流行的nginx。
Java有tom-cat,jetty,websphere等众多服务器,pyhoen的zope等服务器。
既有重量级的服务器,又有轻量级的,嵌入式的服务器。
从互联网的应用来说,c语言的http 服务器一直占有主导地位,当前最流行的三个开源服务器有apache,Lighttpd和nginx。
Apache作为经典的Web服务器,除了慢没有别的缺点了,Apache2对fcgi支持并不好,非常好用的proxy和proxy_ajp (很多人用它作为tomcat的前端),不支持epoll(这年头,epoll几乎是性能的必备)。
Lighttpd作为杀手级的静态文件能力,杀手级的fcgi能力但是proxy模块不够稳定。
Nginx速度快,占用资源少,杀手级的proxy和rewrite,非常不错的静态文件能力,最适合作为整个网站的前端服务(将php、svn等不同请求发送往后端apache)。
现在国内Nginx的用户越来越多了,多数拥抱Nginx的网站都钟意其优异的性能表现,如果是相对比较大的网站,节约下来的服务器成本无疑是客观的。
开发者开发手册介绍本开发手册旨在指导开发人员进行应用程序的开发。
它包含了一系列的准则和最佳实践,帮助开发人员提高开发效率并保证代码质量。
开发环境设置在开始开发之前,请确保以下开发环境设置已完成:- 安装适当版本的开发工具,如IDE或文本编辑器。
- 配置相关的开发环境变量。
- 安装任何必要的依赖项和库。
项目结构为了保持项目的组织和可扩展性,在开始开发之前,请确保项目的结构清晰合理。
以下是一个示例项目结构的建议:├── app.py├── config.py├── requirements.txt├── README.md├──/static│ ├── css│ ├── js│ └── img└──/templates编码规范编码规范可以帮助开发人员统一代码风格,提高代码可读性和维护性。
以下是一些常见的编码规范建议:- 使用有意义的变量和函数命名,避免使用缩写或不清晰的命名。
- 为代码添加适当的注释,解释代码用途和意图。
- 遵循一致的缩进规范,如使用4个空格或制表符。
- 每个函数或方法应尽量保持简短,只关注单一功能。
文档化良好的文档化是开发中不可或缺的一部分。
以下是一些建议:- 为项目添加适当的README文件,提供项目的概述、安装说明、使用示例等。
- 为项目中的重要代码块添加注释,解释其功能和用法。
- 在代码中使用文档化字符串,提供函数和方法的用途、参数和返回值的说明。
- 为API和其他公共接口提供详细的文档。
测试测试是确保代码质量和功能正常的重要一环。
以下是一些建议:- 编写单元测试来验证函数和方法的正确性。
- 编写集成测试来验证各个组件的交互是否正常。
- 使用自动化测试框架并进行持续集成,以确保每次代码提交都通过测试。
版本控制使用版本控制可以方便地管理代码历史记录和团队协作。
以下是一些建议:- 使用一个可靠的版本控制系统,如Git。
- 建立合适的分支策略,如主分支、开发分支和特性分支。
- 定期进行代码提交和合并,保持代码库的整洁和可维护性。
agentzh 的 Nginx 教程(版本 2012.03.27)目录缘起Nginx 教程的连载计划Nginx 变量漫谈(一)Nginx 变量漫谈(二)Nginx 变量漫谈(三)Nginx 变量漫谈(四)Nginx 变量漫谈(五)Nginx 变量漫谈(六)Nginx 变量漫谈(七)Nginx 变量漫谈(八)Nginx 配置指令的执行顺序(一)Nginx 配置指令的执行顺序(二)Nginx 配置指令的执行顺序(三)Nginx 配置指令的执行顺序(四)Nginx 配置指令的执行顺序(五)Nginx 配置指令的执行顺序(六)Nginx 配置指令的执行顺序(七)Nginx 配置指令的执行顺序(八)Nginx 配置指令的执行顺序(九)Nginx 配置指令的执行顺序(十)Nginx 配置指令的执行顺序(十一)缘起其实这两年为 Nginx 世界做了这么多的事情,一直想通过一系列教程性的文章把我的那些工作成果和所学所知都介绍给更多的朋友。
现在终于下决心在新浪博客/openresty 上面用中文写点东西,每一篇东西都会有一个小主题,但次序和组织上就不那么讲究了,毕竟并不是一本完整的图书,或许未来我会将之整理出书也不一定。
我现在编写的教程是按所谓的“系列”来划分的,比如首先连载的“Nginx 变量漫谈”系列。
每一个系列基本上都可以粗略对应到未来出的 Nginx 书中的一“章”(当然内部还会重新组织内容并划分出“节”来)。
我面向的读者是各个水平层次的 Nginx 用户,同时也包括未使用过 Nginx 的 Apache、Lighttpd 等服务器的老用户。
我只保证这些教程中的例子至少兼容到 Nginx 0.8.54,别用更老的版本来找我的错处,我一概不管,毕竟眼下最新的稳定版已经是1.0.10了。
凡在教程里面提到的模块,都是经过生产环境检验过的。
即便是标准模块,如果没有达到生产标准,或者有重要的 bug,我也不会提及。
软件开发流程标准化操作手册第一章软件开发概述 (4)1.1 软件开发基本概念 (4)1.2 软件开发流程简介 (4)第二章需求分析 (4)2.1 需求收集 (4)2.2 需求确认 (4)2.3 需求变更管理 (4)第三章设计阶段 (4)3.1 系统架构设计 (4)3.2 模块划分与设计 (4)3.3 数据库设计 (4)第四章编码规范 (4)4.1 编码规范制定 (4)4.2 代码审查 (4)4.3 代码重构 (4)第五章测试阶段 (4)5.1 测试策略制定 (4)5.2 测试用例编写 (4)5.3 测试执行与缺陷管理 (4)第六章部署与实施 (4)6.1 系统部署 (4)6.2 系统实施 (5)6.3 运维维护 (5)第七章项目管理 (5)7.1 项目计划制定 (5)7.2 项目进度监控 (5)7.3 风险管理 (5)第八章质量保证 (5)8.1 质量管理计划 (5)8.2 质量控制 (5)8.3 质量评估 (5)第九章团队协作与沟通 (5)9.1 团队建设 (5)9.2 沟通协作 (5)9.3 知识共享 (5)第十章文档管理 (5)10.1 文档编写规范 (5)10.2 文档分类与存储 (5)10.3 文档维护与更新 (5)第十一章安全与合规 (5)11.1 信息安全 (5)11.3 数据保护 (5)第十二章持续改进与优化 (5)12.1 过程评估与改进 (5)12.2 技术创新 (5)12.3 优化与升级 (5)第一章软件开发概述 (5)1.1 软件开发基本概念 (5)1.2 软件开发流程简介 (6)第二章需求分析 (6)2.1 需求收集 (6)2.2 需求确认 (7)2.3 需求变更管理 (7)第三章设计阶段 (8)3.1 系统架构设计 (8)3.2 模块划分与设计 (8)3.3 数据库设计 (9)第四章编码规范 (9)4.1 编码规范制定 (9)4.2 代码审查 (10)4.3 代码重构 (10)第五章测试阶段 (11)5.1 测试策略制定 (11)5.2 测试用例编写 (11)5.3 测试执行与缺陷管理 (12)第六章部署与实施 (12)6.1 系统部署 (12)6.1.1 硬件安装与检查 (12)6.1.2 系统安装 (13)6.1.3 网络配置 (13)6.1.4 软件部署 (13)6.2 系统实施 (13)6.2.1 业务模块部署 (13)6.2.2 系统测试 (13)6.2.3 用户培训 (13)6.2.4 系统上线 (13)6.3 运维维护 (13)6.3.1 系统监控 (14)6.3.2 系统升级与更新 (14)6.3.3 备份与恢复 (14)6.3.4 故障处理 (14)6.3.5 用户支持与反馈 (14)第七章项目管理 (14)7.1 项目计划制定 (14)7.1.2 制定项目任务 (14)7.1.3 分配资源 (14)7.1.4 设定项目时间范围 (15)7.1.5 制定项目管理计划 (15)7.2 项目进度监控 (15)7.2.1 创建进度计划 (15)7.2.2 跟踪项目进度 (15)7.2.3 分析进度数据 (15)7.2.4 调整进度计划 (15)7.3 风险管理 (15)7.3.1 风险识别 (15)7.3.2 风险评估 (16)7.3.3 风险应对策略 (16)7.3.4 风险监控与报告 (16)第八章质量保证 (16)8.1 质量管理计划 (16)8.2 质量控制 (16)8.3 质量评估 (17)第九章团队协作与沟通 (17)9.1 团队建设 (17)9.1.1 团队目标 (17)9.1.2 角色定位 (17)9.1.3 沟通机制 (17)9.1.4 团队文化 (18)9.2 沟通协作 (18)9.2.1 沟通技巧 (18)9.2.2 协作工具 (18)9.2.3 沟通频率 (18)9.2.4 跨部门协作 (18)9.3 知识共享 (18)9.3.1 建立知识库 (18)9.3.2 定期培训 (18)9.3.3 交流分享 (18)9.3.4 激励机制 (19)第十章文档管理 (19)10.1 文档编写规范 (19)10.1.1 编写原则 (19)10.1.2 编写要求 (19)10.2 文档分类与存储 (19)10.2.1 文档分类 (19)10.2.2 文档存储 (19)10.3 文档维护与更新 (20)10.3.1 维护要求 (20)第十一章安全与合规 (20)11.1 信息安全 (20)11.2 法律法规合规 (20)11.3 数据保护 (21)第十二章持续改进与优化 (21)12.1 过程评估与改进 (21)12.2 技术创新 (22)12.3 优化与升级 (22)第一章软件开发概述1.1 软件开发基本概念1.2 软件开发流程简介第二章需求分析2.1 需求收集2.2 需求确认2.3 需求变更管理第三章设计阶段3.1 系统架构设计3.2 模块划分与设计3.3 数据库设计第四章编码规范4.1 编码规范制定4.2 代码审查4.3 代码重构第五章测试阶段5.1 测试策略制定5.2 测试用例编写5.3 测试执行与缺陷管理第六章部署与实施6.1 系统部署6.2 系统实施6.3 运维维护第七章项目管理7.1 项目计划制定7.2 项目进度监控7.3 风险管理第八章质量保证8.1 质量管理计划8.2 质量控制8.3 质量评估第九章团队协作与沟通9.1 团队建设9.2 沟通协作9.3 知识共享第十章文档管理10.1 文档编写规范10.2 文档分类与存储10.3 文档维护与更新第十一章安全与合规11.1 信息安全11.2 法律法规合规11.3 数据保护第十二章持续改进与优化12.1 过程评估与改进12.2 技术创新12.3 优化与升级第一章软件开发概述1.1 软件开发基本概念软件开发,简称软件开发(Software Development),是指使用一系列的工程化方法、工具和技术,按照特定需求进行软件产品的设计、开发、测试和维护的过程。
实训1:使用Nginx搭建Web服务器
概述:
本文档旨在提供关于如何使用Nginx搭建Web服务器的详细指南。
Nginx是一个高性能的开源服务器软件,被广泛用于搭建静态和动态内容的Web服务器。
步骤:
- 安装Nginx软件,并按照安装程序的指示进行操作。
2. 配置Nginx:
- 打开Nginx的配置文件,该文件通常位于安装目录下的
`nginx.conf`。
- 根据需要,进行以下配置:
- 指定服务器的监听端口。
- 配置服务器的根目录。
- 配置访问日志和错误日志的位置。
- 配置虚拟主机,并将域名和相关的网站目录进行绑定。
3. 启动Nginx:
- 打开命令行工具,并转到Nginx的安装目录。
- 输入命令`nginx`启动Nginx服务器。
4. 验证服务器是否正常工作:
- 打开Web浏览器,并输入服务器的IP地址或域名。
- 如果看到服务器默认页面,表示Nginx服务器已经成功搭建。
5. 配置其他功能:
- 根据需要,可以配置Nginx提供的其他功能,如反向代理、
负载均衡等。
- 参考Nginx官方文档了解更多信息和配置选项。
注意事项:
- 在进行任何配置更改之前,请备份原始配置文件。
- 确保服务器的防火墙配置允许通过所选端口进行访问。
- 遵守服务器安全最佳实践并定期更新Nginx软件以获取最新
的安全补丁。
参考资料:
以上是使用Nginx搭建Web服务器的简要指南,希望对你有所帮助。
如果需要进一步的帮助或有其他问题,请随时联系我们。
要非常感谢nginx,它帮助我更加了解蝙蝠侠这个喜剧角色。
蝙蝠侠很快,nginx也很快。
蝙蝠侠在与罪恶斗争,nginx在与浪费CPU、内存泄漏等现象做斗争。
蝙蝠侠在压力下能保持良好状态,nginx在强大的服务请求压力下表现出色。
但是,蝙蝠侠如果没有那根蝙蝠侠万能腰带(batman utility belt),那他就什么都不是。
在任何时候,蝙蝠侠的万能腰带都应该包括一个锁扣、几个batarang(蝙蝠侠的特殊武器)、几个bat-cuff(护腕)、夜视眼镜、bat-tracer(跟踪器?)、几个bat-darts(蝙蝠镖)...或者还包括一个apple iphone。
当蝙蝠侠需要使他的敌人失明、失聪、或者晕倒,或者当他需要跟踪他的敌人,或者给他的敌人发个短信,你最好相信他正在他的万能腰带上找一个合适的工具。
这根腰带对蝙蝠侠的行动如此至关重要,所以,当蝙蝠侠在选择穿裤子还是穿腰带的时候,他肯定会选择穿腰带。
事实上他确实选择了腰带,这就是为什么蝙蝠侠穿着紧绷的橡胶衣,而没有穿裤子。
虽然nginx没有这样一条万能腰带,但是nginx有一个模块链(module chain),当nginx需要对应答进行gzip或chunked编码时,它会拿出一个模块来做这个工作。
当nginx基于IP或http认证来阻拦对某些资源的访问时,也是由一个模块来做这些工作的。
同样,当nginx需要和memcahed或者fastCGI交互时,也分别由对应的模块来做相应的工作。
尽管蝙蝠侠的万能腰带上有很多小玩意,但是有时候他还是需要一个新的小工具。
也许他有新的敌人,而他现在的武器(如batarang或bat-cuff)都不足以对付这个敌人。
也许他需要有新的技能,比如在水下呼吸。
所以他会让Lucius Fox来帮他设计这些小工具。
这个文档会告诉你nginx模块链表(module chain)的一些细节,这样你就可以做到像Lucius Fox一样。
nginxecho模块及使用作为服务器软件中的佼佼者,Nginx凭借着其高效的性能和灵活的扩展性,以及对高并发情境的迎合,一直占据着互联网服务器的半壁江山。
但是,在开发过程中也不可避免地遇到一些问题,比如如何快速构建服务,如何对接入请求进行统一的处理,如何动态调整日志输出等等。
这时候,Nginx交给我们的答案可能就是模块。
相信很多人都耳熟能详地了解到过Nginx各类标准模块和第三方模块的使用,那么今天我们不妨来了解一款常用的Nginx第三方扩展模块:NginxEcho模块。
# NginxEcho模块NginxEcho模块是Nginx的一个第三方扩展模块,它可以用来对Nginx的请求进行控制和输出,也就是说,我们可以利用NginxEcho模块,将我们想要的信息返回给客户端。
NginxEcho模块可以实现从Nginx服务器端直接输出信息,而无需通过后端应用程序进行中转或者处理,因此可以节约后端应用程序的处理时间,从而提高整个服务的响应速度。
但是需要指出的是,NginxEcho模块并不是标准的Nginx模块,它是由OpenResty社区的开发者根据自己的需求自行开发的,并没有包含在Nginx的标准发行版中,因此,在使用和安装该模块之前,需要确保已安装了OpenResty或者相关的Nginx版本。
# 安装安装NginxEcho模块其实非常简单,有两种方式:## 方式一:使用luarocks如果你已经安装有LuaRocks包管理器,可以通过以下命令直接安装:```luarocks install lua-resty-echo```## 方式二:手动下载从GitHub上下载最新的NginxEcho源码,并把它放置在OpenResty(或者其他Nginx的安装路径)的源码库中,然后在编译Nginx时加入相应的参数即可。
# 使用NginxEcho模块的使用非常简单,只需要通过Nginx配置中进行相关指令参数的设定即可。
1. 预备知识你应当比较熟悉C语言。
不光是“C-语法",你起码还得知道结构体和预处理指令,同时保证看到指针和函数引用出现时心里不会发毛。
否则的话,就算信春哥也是没用的,看看K&R吧。
你得对HTTP协议有一定的了解,毕竟你是在和一个web server打交道。
如果你熟悉Nginx的配置文件就太好不过了。
如果不熟悉,也没关系,这里简单介绍一下,知道概念先:Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置)和location(URL匹配特定位置后的设置)。
每部分包含若干个指令。
main部分设置的指令将影响其它所有设置;server部分的指令主要用于指定主机和端口;upstream的指令用于设置一系列的后端服务器;location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。
他们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。
它有自己的特殊指令,不需要在其他地方的应用。
在下面很多地方都会涉及这四个部分,切记。
好了,让我们开始吧。
2. Nginx模块委派概述Nginx的模块有三种角色:* handlers 处理http请求并构造输出* filters 处理handler产生的输出* load-balancers 当有多于一个的后端服务器时,选择一台将http请求发送过去许多可能你认为是web server的工作,实际上都是由模块来完成的:任何时候,Nginx提供文件或者转发请求到另一个server,都是通过handler来实现的;而当需要Nginx用gzip压缩输出或者在服务端加一些东东的话,filter就派上用场了;Nginx的core模块主要管理网络层和应用层协议,并启动针对特定请求的一系列后续模块。
这种分散式的体系结构使得由你自己来实现强大的内部单元成为了可能。
注意:不像Apache的模块那样,Nginx的模块都_不是动态链接的。
(换句话说,Nginx的模块都是静态编译的)模块是如何被调用的呢?典型地说,当server启动时,每一个handler都有机会去处理配置文件中的location定义,如果有多个handler被配置成需要处理某一特定的location时,只有其中一个handler能够“获胜”(掌握正确配置规则的你当然不会让这样的冲突发生啦)。
一个handler有三种返回方式:正常;错误;放弃处理转由默认的handler来处理(典型地如处理静态文件的时候)。
如果handler的作用是把请求反向代理到后端服务器,那么就是刚才说的模块的第三种角色load-balancer了。
load-balancer主要是负责决定将请求发送给哪个后端服务器。
Nginx目前支持两种load-balancer模块:round-robin(轮询,处理请求就像打扑克时发牌那样)和IP hash(众多请求时,保证来自同一ip的请求被分发的同一个后端服务器)。
如果handler返回(译者注:就是http响应,即filter的输入)正确无误,那么fileter就被调用了。
每个location配置里都可以添加多个filter,所以说(比如)响应可以被压缩和分块。
多个filter的执行顺序是编译时就确定了的。
filter采用了经典的“接力链表(CHAIN OF RESPONSIBILITY)”模式:一个filter 被调用并处理,接下来调用下一个filter,直到最后一个filter被调用完成,Nginx 才真正完成响应流程。
最帅的部分是在filter链中,每个filter不会等待之前的filter完全完工,它可以处理之前filter正在输出的内容,这有一点像Unix中的管道。
Filter的操作都基于buffers_,buffer通常情况下等于一个页的大小(4k),你也可以在nginx.conf里改变它的大小。
这意味着,比如说,模块可以在从后端服务器收到全部的响应之前,就开始压缩这个响应并流化(stream to)给客户端了。
好牛逼啊~ 总结一下上面的内容,一个典型的周期应当是这样的:客户端发送HTTP request →Nginx基于location的配置选择一个合适的handler →(如果有) load-balancer选择一个后端服务器→Handler处理请求并顺序将每一个响应buffer 发送给第一个filter →第一个filter讲输出交给第二个filter →第二个给第三个→第三个给第四个→以此类推→最终响应发送给客户端我之所以说“典型地”是因为Ngingx的模块具有很强的定制性。
模块开发者需要花很多精力精确定义模块在何时如何产生作用(我认为是件不容易的事)。
模块调用实际上是通过一系列的回调函数做到的,很多很多。
名义上来说,你的函数可以在以下时候被执行:* server读取配置文件之前* 读取location和server的每一条配置指令* 当Nginx初始化main配置段时* 当Nginx初始化server配置段时(例如:host/port)* 当Nginx合并server配置和main配置时* 当Nginx初始化location配置时* 当Nginx合并location配置和它的父server配置时* 当Nginx的主进程启动时* 当一个新的worker进程启动时* 当一个worker进程退出时* 当主进程退出时* handle 一个请求* Filter响应头* Filter响应体* 选择一个后端服务器* 初始化一个将发往后端服务器的请求* 重新-初始化一个将发往后端服务器的请求* 处理来自后端服务器的响应* 完成与后端服务器的交互难以置信!有这么多的功能任你处置,而你只需仅仅通过多组有用的钩子(由函数指针组成的结构体)和相应的实现函数。
让我们开始接触一些模块吧。
3. Nginx模块的组成我说过,Nginx模块的构建是很灵活的。
这一节讲描述的东西会经常出现。
它可以帮助你理解模块,也可以作为开发模块的手册。
3.1. 模块配置Struct(s)模块的配置struct有三种,分别是main,server和location。
绝大多数模块仅需要一个location配置。
名称约定如下:ngx_http_<module name>_(main|srv|loc)_conf_t. 这里有一个dav模块中的例子:typedef struct {ngx_uint_t methods;ngx_flag_t create_full_put_path;ngx_uint_t access;} ngx_http_dav_loc_conf_t;注意到上面展示了Nginx的一些特殊类型:(ngx_uint_t 和ngx_flag_t); 这些只是基本类型的别名而已。
(如果想知道具体是什么的别名,可以参考core/ngx_config.h ). 这些类型用在配置结构体中的情形很多。
3.2. 模块指令模块的指令是定义在一个叫做ngx_command_t的静态数组中的。
下面举个我自己写的小模块中的例子,来告诉你模块指令是如何声明的:static ngx_command_t ngx_http_circle_gif_commands[] = {{ ngx_string("circle_gif"),NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,ngx_http_circle_gif,NGX_HTTP_LOC_CONF_OFFSET,0,NULL },{ ngx_string("circle_gif_min_radius"),NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1, ngx_conf_set_num_slot,NGX_HTTP_LOC_CONF_OFFSET,offsetof(ngx_http_circle_gif_loc_conf_t, min_radius),NULL },...ngx_null_command};下面是结构体ngx_command_t(静态数组里的每一个元素)的定义, 你可以在core/ngx_conf_file.h找到它:struct ngx_command_t {ngx_str_t name;ngx_uint_t type;char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);ngx_uint_t conf;ngx_uint_t offset;void *post;};结构体成员是多了点,不过各司其职,都有用处。
分别来看:结构体成员name 是指令的字符串(顾名思义就是指令名称),不能包含空格. 它的类型是ngx_str_t, 通常都是以像(e.g.) ngx_str("proxy_pass")这样的方式来实例化. 注意:ngx_str_t 包含一个存放字符串内容的data字段,和一个存放字符串长度的len 字段。
Nginx广泛地使用这个类型来存放字符串。
结构体成员type是标识的集合,表明这个指令在哪里出现是合法的、指令的参数有几个。
应用中,标识一般是下面多个值的BIT或:* NGX_HTTP_MAIN_CONF: 指令出现在main配置部分是合法的* NGX_HTTP_SRV_CONF: 指令在server配置部分出现是合法的config* NGX_HTTP_LOC_CONF: 指令在location配置部分出现是合法的* NGX_HTTP_UPS_CONF: 指令在upstream配置部分出现是合法的* NGX_CONF_NOARGS: 指令没有参数* NGX_CONF_TAKE1: 指令读入1个参数* NGX_CONF_TAKE2: 指令读入2个参数* ...* NGX_CONF_TAKE7: 指令读入7个参数* NGX_CONF_FLAG: 指令读入1个布尔型数据("on" or "off")* NGX_CONF_1MORE: 指令至少读入1个参数* NGX_CONF_2MORE: 指令至少读入2个参数这里还有很多其他的选项:core/ngx_conf_file.h. 结构体成员set 是一个函数指针,它指向的函数用来进行模块配置;这个设定函数一般用来将配置文件中的参数传递给程序,并保存在配置结构体中。