nginx 源碼調試

這段時間正在學習nginx源碼,看到一貼子的提問 (帖子:http://www.oschina.net/question/2711991_2165566?p=1#AnchorAnswer1114315),決定試試能不能搞定。
nginx

這個帖子的主要問題是,本身寫的第三方模塊,不能使用gzip壓縮,nginx自帶模塊使用正常。curl

對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函數。url

ps -ef|grep nginx  查看nginx進程號,.net

32259 爲nginx工做進程號。調試

gdb attach 32259   啓動gdb 附加到此進程進程

b ngx_http_gzip_header_filter  打斷點,到此函數,ip

使用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;


從新編譯源碼,測試發送:

此處應有掌聲  -_-

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

因爲水平有限,文章中有錯誤在所不免,請你們包含並指教,謝謝!

相關文章
相關標籤/搜索