`
russelltao
  • 浏览: 157821 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

nginx module 开发谈(2)

 
阅读更多

nginxmodule开发很弱,首先它不是采用动态库的形式被主进程加载,而是要求module的源码必须和nginx的源码一起编译。我是第一次见到这么BT的家伙,呵呵。所以呢,对module开发者来说,nginx就是一个开发平台,可以把它理解为在nginx这个“OS”上用C语言开发application,而且要遵循nginx的框架。

既然是平台,那么像其他OS一样,我们需要搞明白几点:1、程序入口和调用方式。2HTTP处理框架。3、对Http body的处理。4Upstream机制。5、内存使用。6、配置文件的使用。7LOGAPI

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_tngx_XXX_module)变量,找到后,在其中ngx_command_tngx_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 Module 开发详解 #### 模块的角色与功能 Nginx 的模块扮演着不同的角色,这些角色共同确保了服务器能够高效且灵活地处理 HTTP 请求。 1. **Handlers** (处理器): 这些模块负责处理 HTTP 请求并构造响应...

    redis2-nginx-module-0.15

    Redis2-NGINX-Module 是由 OpenResty 团队开发的,OpenResty 是一个基于 NGINX 的高性能 Web 和反向代理服务器,它包含了大量的 LuaJIT 脚本支持,能够进行动态编程。通过这个模块,开发者可以在 NGINX 配置中直接...

    fastdfs-nginx-module-1.24

    2. 下载 FastDFS-nginx-module:获取最新的 1.24 版本源码包,并解压到指定目录。 3. 编译和安装模块:将模块编译进 Nginx,通常涉及到修改 Nginx 的配置文件,添加模块路径。 4. 配置 Nginx:配置 Nginx 的 server ...

    nginx-module-vts.tar.gz

    Nginx-Module-VTS是Nginx的一个增强模块,主要功能是提供详细的Web服务器访问统计和性能监控。Prometheus是一款流行的开源监控和警报工具,广泛用于收集和分析各种系统的指标。在本场景中,Nginx-Module-VTS与...

    fastdfs-nginx-module_v1.16.tar.gz源码包,nginx支

    标题中的"fastdfs-nginx-module_v1.16.tar.gz"是一个开源项目,它是一个用于Nginx服务器的模块,旨在使Nginx能够与FastDFS文件存储系统无缝集成。FastDFS是一个轻量级的开源分布式文件系统,适用于互联网和企业内部...

    lua-nginx-module-0.10.13

    Lua-Nginx-Module由OpenResty团队开发,旨在提供一种轻量级、高效且易于使用的机制,使开发者能够在Nginx内部处理复杂的业务逻辑,如动态内容生成、流量控制、API网关等功能,从而避免了传统的CGI或FastCGI等模型...

    fastdfs-nginx-module-正版V1.19-亲测可用 .zip

    《FastDFS-Nginx-Module V1.19:构建高效稳定的文件服务器系统》 FastDFS-Nginx-Module V1.19 是一个专为Nginx设计的FastDFS扩展模块,它允许Nginx直接与FastDFS进行交互,从而实现高效的文件上传和下载服务。...

    lua-nginx-module-master.zip

    总之,"lua-nginx-module-master.zip"包含的lua-nginx-module是将Lua语言的强大功能引入Nginx的关键,它为开发人员提供了一种灵活且高效的方式,以应对复杂的Web服务场景。正确理解和使用这个模块,可以显著提升...

    fastdfs-nginx-module-1.22.zip

    《FastDFS-Nginx-Module 1.22:构建高效Web服务器的融合解决方案》 在互联网服务领域,Nginx以其高效的性能和强大的反向代理能力被广泛应用于Web服务器,而FastDFS作为轻量级的分布式文件系统,能够有效地解决...

    headers-more-nginx-module-0.34

    《headers_more_nginx_module_0.34:深入解析Nginx扩展模块的增强功能》 在Web服务器领域,Nginx以其高性能、高并发能力而广受赞誉。而headers_more_nginx_module作为Nginx的一个扩展模块,进一步提升了其在处理...

    fastdfs-nginx-module-1.20.zip

    2. **配置Nginx**: 找到Nginx的配置文件(通常是`/etc/nginx/nginx.conf`),在http上下文中添加fastdfs模块的配置。例如: ``` location ~* /group[0-9]/ { ngx_fastdfs_module; } ``` 这里,"/group[0-9]...

    fastdfs-nginx-module_master.zip

    2. 编译FastDFS-nginx-module,将其添加到Nginx的源码树中,并重新编译Nginx。 3. 配置Nginx的配置文件,添加FastDFS-nginx-module的相关指令,如`fdfs_tracker_server`和`http_server_url`,指定FastDFS的Tracker...

    fastdfs-nginx-module1.20

    2. **URL路径格式**:FastDFS-Nginx-Module识别特定的URL格式,例如`/group1/M00/00/00/wKgFQFwGz0iAYZjWAAJZo6s2D7840.jpg`,其中`group1`是文件组名,`M00`是存储节点标识,`00/00`是文件所在的目录,`wKgFQFwGz0...

    echo-nginx-module-0.58.tar.gz

    而为了更好地优化和调试Nginx的配置,开发者们开发了一系列的模块,其中echo-nginx-module是其中之一。本文将详细解析echo-nginx-module的功能、使用场景以及如何配合Nginx进行调试。 一、echo-nginx-module概述 ...

    nginx-sticky-module-1.25.zip

    nginx sticky是nginx的module,可以实现基于cookie的负载均衡。 下载后,在编译安装nginx时,用--add-module选项,指到sticky所在目录。类似命令如下: ./configure --prefix=/usr/local/nginx-1.6.0 --add-module=...

    Nginx Module Extension

    通过上述分析,《Nginx Module Extension》这本书不仅深入介绍了Nginx的核心特性,还提供了详细的自定义模块开发指南。对于希望深入了解并充分利用Nginx强大功能的专业人士来说,这是一本非常有价值的参考资料。无论...

    nginx-module-vts-0.1.18.tar.gz

    解压之后安装如下: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=/...

    fastdfs-nginx-module.zip

    2. **Nginx的集成**:`fastdfs-nginx-module`使得Nginx可以识别并解析FastDFS的文件路径格式,这种格式通常包含组名、卷名和文件ID。通过配置Nginx的服务器块,我们可以指定FastDFS的URL路径规则,使得HTTP请求能够...

    echo-nginx-module-0.61.tar.gz

    echo-nginx-module是Nginx的一个扩展模块,由Philipp Kewisch(@agentzh)开发,它提供了一系列用于处理HTTP响应体的指令,极大地丰富了Nginx的输出处理能力。echo-nginx-module的主要目标是支持HTTP服务器内部的...

    lua-nginx-module-0.10.9rc7

    2. **编译Nginx**:在编译Nginx时,需要将lua-nginx-module源码路径作为参数传递给`--add-module`选项。同时,确保已经正确配置了ngx_devel_kit的路径。 3. **配置Nginx**:在Nginx的配置文件中,启用lua模块并指定...

Global site tag (gtag.js) - Google Analytics