得益于nginx的模塊化設(shè)計(jì),用nginx做模塊化開發(fā)很方便,但是也帶來了代碼復(fù)雜,難以讀懂的問題,首先看一下http模塊是怎么準(zhǔn)備的,真正處理http請(qǐng)求的函數(shù)(或者說是handler,句柄)是ngx_http_wait_request_handler。
rev->handler = ngx_http_wait_request_handler;
以這個(gè)函數(shù)為例,我們來看看http模塊是怎么將這個(gè)handler掛載好的,如下圖
ngx_http_block()則就是一個(gè)典型的nginx中的module函數(shù)了,當(dāng)整個(gè)模塊加載的時(shí)候就會(huì)調(diào)用這個(gè)函數(shù)
掛好了handler,什么時(shí)候去調(diào)用這個(gè)handler呢?
這就要靠nginx的event模塊了,event模塊實(shí)現(xiàn)的功能就是將用來accept的fd注冊(cè)到epoll中,等有client的請(qǐng)求到來,生成一個(gè)新的connfd,然后從連接池里拿出一個(gè)連接,將這個(gè)連接初始化(也就是把剛剛我們的讀寫事件的回調(diào)等東西寫進(jìn)連接中),然后一并注冊(cè)到epoll中去,這樣,只要這個(gè)connfd就緒,就可以根據(jù)fd的讀寫狀態(tài)調(diào)用其相應(yīng)讀寫事件的handler了。
來看下event模塊是怎么初始化然后監(jiān)聽用來accept_fd的: