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

2021-08-27 09:39:03 字數 1117 閱讀 4555

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。

競價初學者容易走錯的兩個方向

在搜尋營銷這塊,很多人都覺得光做seo已經不能滿足胃口了,一是因為競價位越來越霸道,二是因為很多行業的seo都被洗牌,不得不開始進行付費推廣。對於剛接觸競價的朋友,以下兩個方向是比較容易走錯的。1 忽視二八定律 對於很多事情,數量不多的20 總是起著決定性作用,在競價領域同樣如此。當乙個競價賬戶需要...

(適合初學者)合併兩個有序鍊錶

示例1 輸入 1 2 4,1 3 4 輸出 1 1 2 3 4 4 限制 0 鍊錶長度 1000 這個題目主要就是說明有兩個鍊錶,每個鍊錶都是排好的順序,想要把這個兩個鍊錶放到乙個鍊錶進行排序。一起看看下面的解析 學過資料結構的同學,應該會很快能夠理解 class listnode 定義乙個類,這個...

IPv6系列 初學者的10個常見困擾

本文緣由 困擾1.ipv4和ipv6只有位址格式不同嗎 困擾2.ipv4到ipv6對應用程式是透明無感知的嗎 困擾3.提供web服務,需要每台伺服器都配置ipv6位址嗎 困擾4.ipv4和ipv6要配在同一張網絡卡上嗎 困擾5.我的網絡卡有fe80開頭的位址,可以用來上公網嗎 困擾6.ipv6位址如...