企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
Nginx原理及模块开发初步 #插件化与模块化 插件与模块化实例: 正如缓存是速度的秘密,插件与模块化一直是项目成长的引擎 功能强大的秘密 • 实体中的可换头螺丝刀 • USB接口 • 函数 •类 • PHP 模块 • Eclipse 插件 • Nginx 模块 ##插件与模块化好处: 1. 模块化使得分工更加清晰,而插件化使得功能的无限扩展成 为可能,而且不影响主体工程 2. 如果说 PHP 模块开发更多是为了效率,而Web服务器的模块 开发,更多是为了功能扩展 #Apache 模块开发 ###概念 1. apache模块扩展方式 静态编译--with-ssl 动态模块.so 2. 动态模块DSO Dynamic SharedObjects(动态共享目标) 3. apache的apxs(Apache eXtenSion) 与php的--with-apxs2、phpize ###条件 1. 从源码安装 Apache 2. 安装 apr (Apache Portable Runtime)库和 apr-util 库 3. /usr/local/apache2/bin/apxs(APache eXtenSion), 编译和安 装扩展模块,用于编译一个或多个源程序或目标代码文件为动态 共享对象,使之可以用由 mod_so 提供的LoadModule 指令在 运行时加载到 Apache 服务器中 ###模块开发 1. 进入 httpd-2.4.12/modules/ 2. /usr/local/apache2/bin/apxs –g –n ucai 3. 配置调整 ![](https://box.kancloud.cn/2016-05-11_5733453fca990.png) 4. http://101.251.196.91:8080/ucai ###模块接口 ![](https://box.kancloud.cn/2016-05-11_57334540015db.png) 模块接口 1. ucai_register_hooks 在启动时调用,相当于 PHP模块中的 MINIT 函数 2. 可以注册多个 Hook 函数,在不同阶段调用 3. 返回值 OK 结束,DECLINED 表示继续进入下面的阶段 4. 详细可调用接口 apache-example.c #Nginx 模块开发 ![](https://box.kancloud.cn/2016-05-11_573345403aaa4.png) ![](https://box.kancloud.cn/2016-05-11_57334540638ad.png) ##Nginx配置是灵魂,core模块简单高效 main(全局设置) events(事件配置) upstream(上游服务器设置) http(通用请求处理) server(主机设置) location(URL匹配特定位置后的设置) ![](https://box.kancloud.cn/2016-05-11_57334540928b5.png) ![](https://box.kancloud.cn/2016-05-11_573345771d92f.png) ![](https://box.kancloud.cn/2016-05-11_57334577815ab.png) • Nginx模块文件组成 config 描述名称和源文件位置,还可以指定依赖库 c 源文件,可以有多个,config里描述 • Nginx模块加载过程 ./configure --add-module=.... 读取config生成Makefile c文件遵循nginx插件规范接口 nginx解析conf文件,core模块分配location到模块指定接口处理 • ningx -V 查询编译参数 Nginx模块组成 1. 模块定义,总流程 ngx_module_t (必须) 2. 模块上下文,Hook注入点ngx_http_module_t(http模块) 3. 模块指令ngx_command_t(loc模块) 4. 参数存储Struct命名ngx_http_[module-name]_[main|srv|loc]_conf_t 5. 模块按类型特有流程装载,例如Handler a)获取配置 ngx_http_get_module_loc_conf(loc模块) b)生成响应,设置ngx_http_request_t c)发送响应头 ngx_http_send_header d)发送响应体 ngx_http_output_filter ##Nginx模块示例 1. headinfo main模块,最少代码 增加头部信息输出 2. ucai_echo location模块 匹配location输出配置参数 3. ucai_auth main模块 读取cookie,匹配redis用户,输出验证信息 yum install redis hiredis hiredis-devel 4. stub_status 自带location模块 内部统计信息 ##Nginx模块分类 objs/ngx_modules.c 全局core模块 event模块 正则模块 http模块 http handler模块 第三方handler模块 http filter模块 第三方filter模块 #LNMP核心模块扩展总结 1、apache、nginx apxs LoadModule、--add-module 2、php module extension=memcache.so 3、Mysql插件 install plugin 每一层都可以扩展 形成了强大的LNMP组合