nginx 源码调试
nginx 源碼調試
這段時間正在學習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;
重新編譯源碼,測試發送:
?
總結
以上是生活随笔為你收集整理的nginx 源码调试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 轻松使用zstd来解压缩
- 下一篇: B树,B-树和B+树、B*树的区别