nginx的module开发很弱,首先它不是采用动态库的形式被主进程加载,而是要求module的源码必须和nginx的源码一起编译。我是第一次见到这么BT的家伙,呵呵。所以呢,对module开发者来说,nginx就是一个开发平台,可以把它理解为在nginx这个“OS”上用C语言开发application,而且要遵循nginx的框架。
既然是平台,那么像其他OS一样,我们需要搞明白几点:1、程序入口和调用方式。2、HTTP处理框架。3、对Http
body的处理。4、Upstream机制。5、内存使用。6、配置文件的使用。7、LOG的API。
1、先要搞明白程序入口,就像在LINUX上写可执行程序会自动去找main方法一样。下面我会用一个例子来说明一下处理流程。
nginx的程序入口先要在module所在目录的config文件里配置,类似:
USE_SHA1=YES
ngx_addon_name=ngx_XXX_module
HTTP_MODULES="$HTTP_MODULES ngx_XXX_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_XXX_module.
同时在module源文件中,定义如下结构:
static ngx_command_t ngx_XXX_commands[] = {
{
ngx_string("XXX"),
NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,
ngx_XXX_init,
0,
0,
NULL
}
};
static ngx_http_module_t ngx_XXX_module_ctx = {
NULL, //ngx_XXX_add_variables, /* preconfiguration */
NULL, /* postconfiguration */
NULL, /* create main configuration */
NULL, /* init main configuration */
NULL, /* create server configuration */
NULL, /* merge server configuration */
ngx_XXX_create_loc_conf, /* create location configuration */
ngx_XXX_merge_loc_conf /* merge location configuration */
};
ngx_module_t ngx_XXX_module = {
NGX_MODULE_V1,
&ngx_XXX_module_ctx,
ngx_XXX_commands,
NGX_HTTP_MODULE,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
NGX_MODULE_V1_PADDING
};
那么,nginx主进程在启动时,就会在执行代码里找相应的ngx_module_t(ngx_XXX_module)变量,找到后,在其中ngx_command_t(ngx_XXX_commands)指定的函数ngx_XXX_init里开始初始化模块。所有的工作都要在这里进行了,包括后续对每个请求的处理订阅。
Nginx启动时,会先启动一个master管理进程,然后根据配置启动数个worker进程。实际的module里的勾子函数(例如ngx_XXX_handle),都是被worker进程所调用的。默认情况下,nginx并不是多线程的,所以,如果你的勾子函数被调用了,那么你绝对不可以有任何阻塞操作,否则会使得nginx
worker不去处理已经在链表中的其他connection,这就完全毁了nginx,如果你去同步请求硬盘IO资源,否则其他SERVER的网络IO,那么它和apach+CGI这种低性能SERVER也没啥两样了,除了epoll可以hold住大量连接。
分享到:
相关推荐
### Nginx Module 开发详解 #### 模块的角色与功能 Nginx 的模块扮演着不同的角色,这些角色共同确保了服务器能够高效且灵活地处理 HTTP 请求。 1. **Handlers** (处理器): 这些模块负责处理 HTTP 请求并构造响应...
Redis2-NGINX-Module 是由 OpenResty 团队开发的,OpenResty 是一个基于 NGINX 的高性能 Web 和反向代理服务器,它包含了大量的 LuaJIT 脚本支持,能够进行动态编程。通过这个模块,开发者可以在 NGINX 配置中直接...
2. 下载 FastDFS-nginx-module:获取最新的 1.24 版本源码包,并解压到指定目录。 3. 编译和安装模块:将模块编译进 Nginx,通常涉及到修改 Nginx 的配置文件,添加模块路径。 4. 配置 Nginx:配置 Nginx 的 server ...
Nginx-Module-VTS是Nginx的一个增强模块,主要功能是提供详细的Web服务器访问统计和性能监控。Prometheus是一款流行的开源监控和警报工具,广泛用于收集和分析各种系统的指标。在本场景中,Nginx-Module-VTS与...
标题中的"fastdfs-nginx-module_v1.16.tar.gz"是一个开源项目,它是一个用于Nginx服务器的模块,旨在使Nginx能够与FastDFS文件存储系统无缝集成。FastDFS是一个轻量级的开源分布式文件系统,适用于互联网和企业内部...
Lua-Nginx-Module由OpenResty团队开发,旨在提供一种轻量级、高效且易于使用的机制,使开发者能够在Nginx内部处理复杂的业务逻辑,如动态内容生成、流量控制、API网关等功能,从而避免了传统的CGI或FastCGI等模型...
《FastDFS-Nginx-Module V1.19:构建高效稳定的文件服务器系统》 FastDFS-Nginx-Module V1.19 是一个专为Nginx设计的FastDFS扩展模块,它允许Nginx直接与FastDFS进行交互,从而实现高效的文件上传和下载服务。...
总之,"lua-nginx-module-master.zip"包含的lua-nginx-module是将Lua语言的强大功能引入Nginx的关键,它为开发人员提供了一种灵活且高效的方式,以应对复杂的Web服务场景。正确理解和使用这个模块,可以显著提升...
《FastDFS-Nginx-Module 1.22:构建高效Web服务器的融合解决方案》 在互联网服务领域,Nginx以其高效的性能和强大的反向代理能力被广泛应用于Web服务器,而FastDFS作为轻量级的分布式文件系统,能够有效地解决...
《headers_more_nginx_module_0.34:深入解析Nginx扩展模块的增强功能》 在Web服务器领域,Nginx以其高性能、高并发能力而广受赞誉。而headers_more_nginx_module作为Nginx的一个扩展模块,进一步提升了其在处理...
2. **配置Nginx**: 找到Nginx的配置文件(通常是`/etc/nginx/nginx.conf`),在http上下文中添加fastdfs模块的配置。例如: ``` location ~* /group[0-9]/ { ngx_fastdfs_module; } ``` 这里,"/group[0-9]...
2. 编译FastDFS-nginx-module,将其添加到Nginx的源码树中,并重新编译Nginx。 3. 配置Nginx的配置文件,添加FastDFS-nginx-module的相关指令,如`fdfs_tracker_server`和`http_server_url`,指定FastDFS的Tracker...
2. **URL路径格式**:FastDFS-Nginx-Module识别特定的URL格式,例如`/group1/M00/00/00/wKgFQFwGz0iAYZjWAAJZo6s2D7840.jpg`,其中`group1`是文件组名,`M00`是存储节点标识,`00/00`是文件所在的目录,`wKgFQFwGz0...
而为了更好地优化和调试Nginx的配置,开发者们开发了一系列的模块,其中echo-nginx-module是其中之一。本文将详细解析echo-nginx-module的功能、使用场景以及如何配合Nginx进行调试。 一、echo-nginx-module概述 ...
nginx sticky是nginx的module,可以实现基于cookie的负载均衡。 下载后,在编译安装nginx时,用--add-module选项,指到sticky所在目录。类似命令如下: ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=...
通过上述分析,《Nginx Module Extension》这本书不仅深入介绍了Nginx的核心特性,还提供了详细的自定义模块开发指南。对于希望深入了解并充分利用Nginx强大功能的专业人士来说,这是一本非常有价值的参考资料。无论...
解压之后安装如下:mv nginx-module-vts-0.1.18 /usr/local/ yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel cd /usr/local/nginx/nginx-1.13.7 ./configure --add-module=/...
2. **Nginx的集成**:`fastdfs-nginx-module`使得Nginx可以识别并解析FastDFS的文件路径格式,这种格式通常包含组名、卷名和文件ID。通过配置Nginx的服务器块,我们可以指定FastDFS的URL路径规则,使得HTTP请求能够...
echo-nginx-module是Nginx的一个扩展模块,由Philipp Kewisch(@agentzh)开发,它提供了一系列用于处理HTTP响应体的指令,极大地丰富了Nginx的输出处理能力。echo-nginx-module的主要目标是支持HTTP服务器内部的...
2. **编译Nginx**:在编译Nginx时,需要将lua-nginx-module源码路径作为参数传递给`--add-module`选项。同时,确保已经正确配置了ngx_devel_kit的路径。 3. **配置Nginx**:在Nginx的配置文件中,启用lua模块并指定...