這段時間正在學習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;
從新編譯源碼,測試發送:
此處應有掌聲 -_-
————————————————————————————————————————
因爲水平有限,文章中有錯誤在所不免,請你們包含並指教,謝謝!