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