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

nginx module 开发谈(3)

 
阅读更多

2HTTP框架

继续上面这个例子,比如当nginx收到一个http请求时,我的module需要处理这个请求,那么我应该怎么做?实际这个问题还要再细分。如果是希望nginx收到完整的HTTP请求,再交给我的module处理?又或者只需要接收到完整的http header就给我呢?我把接收完header就交给module处理的code列下,再说下它的处理流程。

首先我要在ngx_XXX_init里注册对这种请求的处理函数。

static char * ngx_XXX_init(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)

{

//... code 省略

clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);

clcf->handler = ngx_XXX_handler;

return NGX_CONF_OK;

}

好了,现在有个简单的GET请求进入后,nginx在接收完header,就来调用ngx_XXX_handler方法了。好,现在我们调试下,看看nginx是如何进入ngx_XXX_handler方法的。

#0 ngx_XXX_handler (r=0x6d5650)

at nginx_XXX_module/ngx_XXX_module.c:646

#1 0x0000000000429e77 in ngx_http_core_content_phase (r=0x6d5650, ph=0x6e17d8)

at src/http/ngx_http_core_module.c:1262

#2 0x00000000004292d0 in ngx_http_core_run_phases (r=0x6d5650)

at src/http/ngx_http_core_module.c:800

#3 0x0000000000429284 in ngx_http_handler (r=0x6d5650)

at src/http/ngx_http_core_module.c:783

#4 0x000000000043165c in ngx_http_process_request (r=0x6d5650)

at src/http/ngx_http_request.c:1615

#5 0x0000000000430845 in ngx_http_process_request_headers (rev=0x6d60d0)

at src/http/ngx_http_request.c:1064

#6 0x00000000004303a0 in ngx_http_process_request_line (rev=0x6e3730)

at src/http/ngx_http_request.c:869

#7 0x000000000042fa8a in ngx_http_init_request (rev=0x6e3730)

at src/http/ngx_http_request.c:510

#8 0x0000000000422d6f in ngx_epoll_process_events (cycle=0x6cb1d0, timer=Variable "timer" is not available.

)

at src/event/modules/ngx_epoll_module.c:518

#9 0x00000000004181cb in ngx_process_events_and_timers (cycle=0x6cb1d0)

at src/event/ngx_event.c:245

#10 0x0000000000420351 in ngx_worker_process_cycle (cycle=0x6cb1d0, data=Variable "data" is not available.

)

at src/os/unix/ngx_process_cycle.c:791

#11 0x000000000041e19b in ngx_spawn_process (cycle=0x6cb1d0,

proc=0x420271 <ngx_worker_process_cycle>, data=0x0, name=0x5171a4 "worker process",

respawn=-3) at src/os/unix/ngx_process.c:194

#12 0x000000000041f8df in ngx_start_worker_processes (cycle=0x6cb1d0, n=1, type=-3)

at src/os/unix/ngx_process_cycle.c:355

#13 0x000000000041f24d in ngx_master_process_cycle (cycle=0x6cb1d0)

at src/os/unix/ngx_process_cycle.c:136

#14 0x0000000000403dea in main (argc=1, argv=Variable "argv" is not available.

) at src/core/nginx.c:396

上面这个栈信息,可以初步看到nginx是如果调用ngx_XXX_handler,我再详细说下。

ngx_epoll_process_events接收到网络IO事件EPOLLIN后(socket上有数据可读),rev->handler(rev);调用了这个回调方法(ngx_http_init_request)。ngx_http_init_request开始处理这个事件,首先它把基本的ngx_http_request_t变量(nginx HTTP框架中由始至终的东东)初始化,并从内存池中分配了第一块接收内存,然后开始调用ngx_http_process_request_line方法处理具体内容。

ngx_http_process_request_line开始处理具体接收到的消息了,它首先会调用ngx_http_read_request_header方法去读取socket上的字节,读完后(仅仅是当前socket上的缓冲)调用ngx_http_parse_request_line方法分析协议,ngx_http_parse_request_line方法就是一个HTTP协议的状态机实现,分析HTTP协议并赋值到ngx_http_request_t相应的字段里,如果不完整,就返回epoll等待这个socket上的下一次EPOLLIN事件。如果HTTP协议头完整了,就开始调用ngx_http_process_request_headers处理http header的内容了。

ngx_http_process_request_headers方法会先调用ngx_http_parse_header_line去分析http headerngx_http_parse_header_line也是一个状态机,仅用来解析http header,之后开始调用ngx_http_process_request方法处理已经解析成功的ngx_http_request_t对象。ngx_http_process_request简单的调用ngx_http_handler方法,ngx_http_handler方法把事件发布到ngx_http_core_run_phases阶段,开始回调我们在ngx_XXX_init方法中注册的ngx_XXX_handle方法。

现在大家清楚一个最基本的module处理流程是怎样的了吧?如果大家还是不大明白,我画个活动图帮助大家理解下:

分享到:
评论

相关推荐

    nginx module开发指南(中文版)

    ### Nginx Module 开发详解 #### 模块的角色与功能 Nginx 的模块扮演着不同的角色,这些角色共同确保了服务器能够高效且灵活地处理 HTTP 请求。 1. **Handlers** (处理器): 这些模块负责处理 HTTP 请求并构造响应...

    fastdfs-nginx-module-1.24

    《FastDFS-Nginx-Module 1.24:高效文件服务器集成详解》 FastDFS-nginx-module 1.24 是一个针对 FastDFS 文件系统的 Nginx 模块,它使得 Nginx 可以无缝地与 FastDFS 集成,提供了高效的文件上传、下载服务。这一...

    nginx-module-vts.tar.gz

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

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

    3. **FastDFS-nginx-module的功能**:这个模块使得Nginx可以直接通过HTTP协议访问FastDFS存储的文件,无需经过FastDFS的Tracker Server,提高了访问速度。它还支持防盗链、HTTP头部控制、访问统计等功能。 4. **...

    lua-nginx-module-0.10.13

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

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

    3. 集成Fastdfs-nginx-module:将解压后的fastdfs-nginx-module-master目录中的源码合并到Nginx的源码树中,然后重新编译Nginx,以便包含该模块。 4. 配置FastDFS和Nginx:配置FastDFS的连接参数,如tracker服务器...

    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

    3. 删除头部:有时,我们需要移除某些可能带来安全隐患或不适应当前场景的头部,如Server头部,headers_more_nginx_module提供了这一功能。 三、配置指令 headers_more_nginx_module提供了一系列的配置指令,使得...

    fastdfs-nginx-module-1.20.zip

    本文将详细解析如何将FastDFS的Nginx模块(fastdfs-nginx-module-1.20.zip)安装并配置到Nginx中,实现高效、稳定的服务。 首先,确保你已经安装了FastDFS和Nginx的基础环境。FastDFS提供了数据存储和文件管理的...

    fastdfs-nginx-module_master.zip

    3. 配置Nginx的配置文件,添加FastDFS-nginx-module的相关指令,如`fdfs_tracker_server`和`http_server_url`,指定FastDFS的Tracker服务器地址和文件访问URL前缀。 4. 启动Nginx,测试文件上传和下载功能是否正常。...

    fastdfs-nginx-module1.20

    3. **负载均衡**:Nginx可以根据配置进行负载均衡,将文件请求分发到不同的FastDFS存储节点,确保服务的高可用性。 4. **权限控制**:FastDFS-Nginx-Module支持基于HTTP头的权限验证,可以通过Nginx的访问控制策略...

    redis2-nginx-module-0.15

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

    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

    在这个场景下,`fastdfs-nginx-module.zip`扮演着关键的角色,它是FastDFS与Nginx之间的重要桥梁。 FastDFS通常与Nginx结合使用,Nginx作为一个强大的反向代理和负载均衡服务器,负责接收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

    3. **配置Nginx**:在Nginx的配置文件中,启用lua模块并指定Lua脚本的路径。例如,使用`lua_code_cache on|off`来控制Lua代码缓存策略,用`set_by_lua_file`或`access_by_lua_file`等指令执行Lua脚本。 4. **测试与...

Global site tag (gtag.js) - Google Analytics