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组合
- SWOOLE及php网络编程
- LNMP架构与Socket,http协议
- 如何高效学习
- 开发工具箱
- 编写高效的js
- js闭包编写全功能的购物车
- JSON和JSONP
- 多级分类的开发与应用
- 设计安全的登录注册流程
- 前端性能优化
- 前端架构优化
- 使用第三方云服务加速产品开发
- 移动互联网之API开发
- php分层
- 全文检索的实践与部署
- webIM的原理及前后端实现
- 如何配置高效的数据库以及MySQL的代码及插件开发
- NoSql.队列,任务队列
- 构建本机缓存,构建分布式缓存池
- 数据库分库分表的设计
- Nginx原理及模块开发初步
- 无限扩充的数据库架构
- php构建分库分表分布式数据库连接池
- 静态文件上传、分布式存储与分发
- MySQL Cluster,Proxy分析与实践
- 架构解密