文档章节

nginx 源码调试

悬崖
 悬崖
发布于 2016/04/14 12:58
字数 499
阅读 183
收藏 3

这段时间正在学习nginx源码,看到一贴子的提问 (帖子:http://www.oschina.net/question/2711991_2165566?p=1#AnchorAnswer1114315),决定试试能不能搞定。

这个帖子的主要问题是,自己写的第三方模块,不能使用gzip压缩,nginx自带模块使用正常。

对nginx 熟悉的大牛,估计一眼就能看出问题所在,对于我这种小菜,比对了helloworld模块跟status模块,也没看出问题所在,只能用绝招跟踪两个模块的源码。

nginx是多个work进程,为了方便调试,把修改nginx.conf配置文件,只启用1个work进程。

现在是status模块可以gzip,  helloword模块不能gzip, 说明gzip模块的配置是正确,初步怀疑是helloword模块中的某些参数配置不正确,导致没有调用到gzip。

查看ngx_http_gzip_filter_module.c代码,ngx_http_gzip_header_filter()函数为此模块的handle函数。

ps -ef|grep nginx  查看nginx进程号,

32259 为nginx工作进程号。

gdb attach 32259   启动gdb 附加到此进程

b ngx_http_gzip_header_filter  打断点,到此函数,

使用curl给nginx 发信息,

curl -I  -H"accept-encoding:gzip" "http://127.0.0.1/hello_world"  

gdb 能断到此函数,说明能进入gzip模块。

然后单步运行,发现在这句(return ngx_http_next_header_filter(r);)返回了,并没有继续执行。

 

之后使用curl -I  -H"accept-encoding:gzip" "http://127.0.0.1/nginx-status" 发送,并没有在此位置退出,说明是上面判断条件成立,使helloword模块返回了。

单步跟踪之后是ngx_http_test_content_type(r, &conf->types) == NULL条件成立,于是根据此函数进去,发现没有进入for循环,p len 为0, 顾发现content_type_len 没有设置。


在helloworld模块中,添加:r->headers_out.content_type_len = sizeof("text/plain") - 1;

 由于要使用压缩,在helloworld 模块,不能指定content_length, 删掉 r->headers_out.content_length_n = content_length;


重新编译源码,测试发送:

此处应有掌声  -_-

————————————————————————————————————————

由于水平有限,文章中有错误在所难免,请大家包含并指教,谢谢!


© 著作权归作者所有

共有 人打赏支持
悬崖
粉丝 3
博文 54
码字总数 22549
作品 0
海淀
程序员
加载中

评论(1)

yizhiniu
yizhiniu
79
Nginx 源码学习资料

转自http://www.cnblogs.com/yjf512/archive/2012/06/13/2548515.html nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源。 首先要做的当然是下载一份nginx源码,可以从n...

小南学技术
2016/08/09
0
0
nginx源码学习资源(不断更新)

nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源。 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的。 看了nginx源码,发现这是一份完全没有注...

王二狗子11
01/08
0
0
c语言开源项目--nigix学习资料总结 by 博客园 叶剑峰

nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源。 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的。 看了nginx源码,发现这是一份完全没有注...

文艺小青年
2017/04/08
0
0
nginx模块_使用gdb调试nginx源码

工欲善其事必先利其器,如何使用调试工具gdb一步步调试nginx是了解nginx的重要手段。 ps:本文的目标人群是像我这样初接触Unix编程的同学,如果有什么地方错误请指正。 熟悉gdb的使用 这里就...

王二狗子11
01/08
0
0
nginx_Nchan调试

Nchan作为Nginx web服务器的一个模块,实现了发布/订阅服务器。我这里的调试通过HTTP POST请求发布消息,通过长轮训来订阅消息。(还有其他的发布、订阅的方式,比如websocket。) 1、 下载n...

一万
2016/07/28
45
0

没有更多内容

加载失败,请刷新页面

加载更多

利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

Linux就该这么学
12分钟前
0
0
图像显示深入学习一:Activity启动过程

一个月左右写了图像显示深入学习之文章开篇文章表明了自己近期的计划,前半年重新学习了opengl es,c++以及Linux的一些知识,觉得是时候开始看图像这一块的源码了,边看边补缺补漏吧。 作为该...

JerryLin123
34分钟前
0
0
给MySQL授权远程访问

putty登录服务器; 登录MySQL: mysql -u root -p 新建远程用户: CREATE USER 'myusername' IDENTIFIED BY 'mypassword'; 授权: grant all on *.* to john@'101.102.103.104' identified by......

sweethome
今天
0
0
在t-io老巢造谣,不过有造谣的就会有反造谣的!

只发当事人的截图,不发表评论,以免有引导嫌疑 PS: 截图是由不同的人发过来的 本人已经不在此微信群 图3:有造谣的,就有反造谣的 图4是2018-09-23的t-io官方群的一个发言小统计,有助于让...

talent-tan
今天
99
0
heartbeat 资源

drbd+apache+heartbeat : http://blog.51cto.com/11838039/1827901 heartbeat双机热备的架设 : http://blog.51cto.com/11838039/1827560 对heaetbeat的深一步认识 : http://blog.51cto.co......

寰宇01
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部