困擾nginx初學者的兩個小問題

通過在羣裏大家的討論,我總結了兩點問題,很多初學者都問過:

1. ngixn事件處理中關於active和ready的問題

2. ngx_connection_t與ngx_http_connection_t結構的區別與聯繫

這裏分開討論下。

1. ngixn事件處理中關於active和ready的問題

        這倆成員何時爲0,何時又被置1,把很多人搞迷糊了。其實從nginx的設計上來講,它想表達的語義很明確:
        當一個fd第一次加入到epoll中的時候,active會被置1,意味着這個fd是有效的。直到我們把這個fd從epoll中移除,active纔會清零。ready是另一層處理,這個fd雖然在epoll中,但是有時這個fd可以讀寫,有時則是未就緒的。那麼當可讀寫時,ready就會被置1。這樣我們就可以來讀寫數據了。當我們從fd讀寫到EAGAIN時,ready就會被清零,意味着當前這個fd未就緒。但是它不影響active,因爲這個fd仍然在epoll中,ready==0只是要等待後續的讀寫觸發。所以nginx在這兩個變量的使用上是很明確的。

2. ngx_connection_t與ngx_http_connection_t結構的區別與聯繫

        羣裏的朋友問過好幾次了,這裏稍微總結一下:

        在nginx的定義裏面ngx_connection_t可以看做是四層tcp的抽象,當然除了一些必要的連接信息之外,還有很多其他強大的功能,如有些事件控制相關的變量。對於具體的七層服務,如http,mail等,一般都有各自的具體信息。而這些信息通過ngx_connection_t中的data成員來承載,注意到類型爲void *了吧。具體來講,tcp上承載的http相關信息,使用的是ngx_http_connection_t結構,而mail則使用ngx_mail_session_t。

順便提一下,下面這個問題也有很多新人問過:

        “在ngx_http_init_requst中,這裏的c->data 是從ngx_get_connection 拿出來的,原來指向的是下一個free connection 。我跟了下代碼,也沒發現有什麼地方改過c->data”。

        其實在ngx_get_connection函數中,有個操作是ngx_memzero(c, sizeof(ngx_connection_t)),所以初始的c->data是NULL。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章