文档章节

nginx 源码调试

悬崖
 悬崖
发布于 2016/04/14 12:58
字数 499
阅读 197
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

阿里千万级高性能、高并发架构的经验之谈

架构以及我理解中架构的本质 在开始谈我对架构本质的理解之前,先谈谈对今天技术沙龙主题的个人见解,千万级规模的网站感觉数量级是非常大的,对这个数量级我们战略上 要重 视 它 , 战术上又...

别打我会飞
29分钟前
4
0
Adnroid架构的详细说明

armeabi armeabi是一个非常老的基于ARM的架构。从Android 4.4开始,CDD(compatibility definition)严格要求ARMv7读取CDD文档。 CDD是Google向设备制造商提供的每个Android版本的规范,它包...

CrazyManDF
31分钟前
3
0
微信小程序内嵌网页web-view

web-view 组件是一个可以用来承载网页的容器,会自动铺满整个小程序页面。个人类型与海外类型的小程序暂不支持使用。 客户端 6.7.2 版本开始,navigationStyle: custom 对 <web-view> 组件无...

xiaogg
32分钟前
2
0
单例模式

第一种方式 public class SingletonA { public static final SingletonA INSTANCE = new SingletonA(); private SingletonA(){ //do something }} 第二种方式 public......

wuyiyi
33分钟前
2
0
git: Authentication failed for错误解决

如果push遇到在输入密码是输错后,就会报这个错误fatal: Authentication failed for 解决办法: git config --system --unset credential.helper 之后你在push就会提示输入名称和密码...

落雪飞声
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部