nginx学习十 ngx_cycle_t 、ngx_connection_t 和ngx_listening_t
最近在開始看nginx的事件模塊,經常看到ngx_cycle_t、ngx_connection_t和ngx_listening_t這三個結構體,剛開始沒在意,看到了就重新上網變量的意思,后來覺得不弄懂這三個結構體或者不清出其中變量的意義實在是無法看下去,因為有很多函數都涉及這三個結構體。因為ngx_listening_t存儲監聽有關的信息,ngx_connection_t存儲連接有關的信息和讀寫事件,而ngx_cycle_t這個結構體幾乎就是核心結構體,在nginx初始化時這個結構體存儲了許多東西,而且它有個初始化的函數:ngx_init_cycle,這個函數的代碼有700多行。可見這個結構體有多種要。于是就花了半天來找這幾個結構體里面成員的意思,方便查閱,由于這些資料是來自課本和互聯網難免有錯誤,以后還會修改和繼續添加其他常用的結構體。
http://blog.csdn.net/xiaoliangsky/article/details/39831035
1ngx_listening_t
在core/ngx_connection.h中
struct ngx_listening_s {ngx_socket_t ? ? ? ?fd;//套接字句柄struct sockaddr ? ?*sockaddr;//監聽sockaddr地址socklen_t ? ? ? ? ? socklen; ? ?/*sockaddr地址長度 size of sockaddr */size_t ? ? ? ? ? ? ?addr_text_max_len;//存儲ip地址的字符串addr_text最大長度ngx_str_t ? ? ? ? ? addr_text;//以字符串形式存儲ip地址//套接字類型。types是SOCK_STREAM時,表示是tcpint ? ? ? ? ? ? ? ? type;//TCP實現監聽時的backlog隊列,它表示允許正在通過三次握手建立tcp連接但還沒有任何進程開始處理的連接最大個數int ? ? ? ? ? ? ? ? backlog;int ? ? ? ? ? ? ? ? rcvbuf;//套接字接收緩沖區大小int ? ? ? ? ? ? ? ? sndbuf;//套接字發送緩沖區大小/* handler of accepted connection */ngx_connection_handler_pt ? handler;//當新的tcp連接成功建立后的處理方法//目前主要用于HTTP或者mail等模塊,用于保存當前監聽端口對應著的所有主機名void ? ? ? ? ? ? ? *servers; ?/* array of ngx_http_in_addr_t, for example */ngx_log_t ? ? ? ? ? log;//日志ngx_log_t ? ? ? ? ?*logp;//日志指針size_t ? ? ? ? ? ? ?pool_size;//如果為新的tcp連接創建內存池,則內存池的初始大小應該是pool_size。/* should be here because of the AcceptEx() preread */size_t ? ? ? ? ? ? ?post_accept_buffer_size;/* should be here because of the deferred accept */ngx_msec_t ? ? ? ? ?post_accept_timeout;//~秒后仍然沒有收到用戶的數據,就丟棄該連接//前一個ngx_listening_t結構,用于組成單鏈表ngx_listening_t ? ?*previous;ngx_connection_t ? *connection;//當前監聽句柄對應的ngx_connection_t結構體unsigned ? ? ? ? ? ?open:1;//為1表示監聽句柄有效,為0表示正常關閉unsigned ? ? ? ? ? ?remain:1;//為1表示不關閉原先打開的監聽端口,為0表示關閉曾經打開的監聽端口unsigned ? ? ? ? ? ?ignore:1;//為1表示跳過設置當前ngx_listening_t結構體中的套接字,為0時正常初始化套接字unsigned ? ? ? ? ? ?bound:1; ? ? ? /* already bound */unsigned ? ? ? ? ? ?inherited:1; ? /* inherited from previous process */unsigned ? ? ? ? ? ?nonblocking_accept:1;unsigned ? ? ? ? ? ?listen:1;//為1表示當前結構體對應的套接字已經監聽unsigned ? ? ? ? ? ?nonblocking:1;unsigned ? ? ? ? ? ?shared:1; ? ?/* shared between threads or processes */unsigned ? ? ? ? ? ?addr_ntop:1;//為1表示將網絡地址轉變為字符串形式的地址#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)unsigned ? ? ? ? ? ?ipv6only:2; #endif#if (NGX_HAVE_DEFERRED_ACCEPT)unsigned ? ? ? ? ? ?deferred_accept:1;unsigned ? ? ? ? ? ?delete_deferred:1;unsigned ? ? ? ? ? ?add_deferred:1; #ifdef SO_ACCEPTFILTERchar ? ? ? ? ? ? ? *accept_filter; #endif #endif #if (NGX_HAVE_SETFIB)int ? ? ? ? ? ? ? ? setfib; #endif};2ngx_connction_t
在core/ngx_connection.h中
?
struct ngx_connection_s {//連接未使用時,data用于充當連接池中空閑鏈表中的next指針。連接使用時由模塊而定,HTTP中,data指向ngx_http_request_tvoid ? ? ? ? ? ? ? *data;ngx_event_t ? ? ? ?*read;//連接對應的讀事件ngx_event_t ? ? ? ?*write;//連接對應的寫事件ngx_socket_t ? ? ? ?fd;//套接字對應的句柄ngx_recv_pt ? ? ? ? recv;//直接接收網絡字符流的方法ngx_send_pt ? ? ? ? send;//直接發送網絡字符流的方法ngx_recv_chain_pt ? recv_chain;//以鏈表來接收網絡字符流的方法ngx_send_chain_pt ? send_chain;//以鏈表來發送網絡字符流的方法//這個連接對應的ngx_listening_t監聽對象,此連接由listening監聽端口的事件建立ngx_listening_t ? ?*listening;off_t ? ? ? ? ? ? ? sent;//這個連接上已發送的字節數ngx_log_t ? ? ? ? ?*log;//日志對象/*內存池。一般在accept一個新的連接時,會創建一個內存池,而在這個連接結束時會銷毀內存池。內存池大小是由上面listening成員的pool_size決定的*/ngx_pool_t ? ? ? ? *pool;struct sockaddr ? ?*sockaddr;//連接客戶端的sockaddrsocklen_t ? ? ? ? ? socklen;//sockaddr結構體的長度ngx_str_t ? ? ? ? ? addr_text;//連接客戶段字符串形式的IP地址#if (NGX_SSL)ngx_ssl_connection_t ?*ssl; #endif//本機監聽端口對應的sockaddr結構體,實際上就是listening監聽對象的sockaddr成員struct sockaddr ? ?*local_sockaddr;ngx_buf_t ? ? ? ? ?*buffer;//用戶接受、緩存客戶端發來的字符流,buffer是由連接內存池分配的,大小自由決定/*用來將當前連接以雙向鏈表元素的形式添加到ngx_cycle_t核心結構體的reuseable_connection_queue雙向鏈表中,表示可以重用的連接*/ngx_queue_t ? ? ? ? queue;/*連接使用次數。ngx_connection_t結構體每次建立一條來自客戶端的連接,或者主動向后端服務器發起連接時,number都會加1*/ngx_atomic_uint_t ? number;ngx_uint_t ? ? ? ? ?requests;//處理的請求次數//緩存中的業務類型。unsigned ? ? ? ? ? ?buffered:8;//本連接的日志級別,占用3位,取值范圍為0~7,但實際只定義了5個值,由ngx_connection_log_error_e枚舉表示。unsigned ? ? ? ? ? ?log_error:3; ? ? /* ngx_connection_log_error_e */unsigned ? ? ? ? ? ?single_connection:1;//為1時表示獨立的連接,為0表示依靠其他連接行為而建立起來的非獨立連接unsigned ? ? ? ? ? ?unexpected_eof:1;//為1表示不期待字符流結束unsigned ? ? ? ? ? ?timedout:1;//為1表示連接已經超時unsigned ? ? ? ? ? ?error:1;//為1表示連接處理過程中出現錯誤unsigned ? ? ? ? ? ?destroyed:1;//為1表示連接已經銷毀unsigned ? ? ? ? ? ?idle:1;//為1表示連接處于空閑狀態,如keepalive兩次請求中間的狀態unsigned ? ? ? ? ? ?reusable:1;//為1表示連接可重用,與上面的queue字段對應使用unsigned ? ? ? ? ? ?close:1;//為1表示連接關閉unsigned ? ? ? ? ? ?sendfile:1;//為1表示正在將文件中的數據發往連接的另一端/*為1表示只有連接套接字對應的發送緩沖區必須滿足最低設置的大小閥值時,事件驅動模塊才會分發該事件。這與ngx_handle_write_event方法中的lowat參數是對應的*/unsigned ? ? ? ? ? ?sndlowat:1;unsigned ? ? ? ? ? ?tcp_nodelay:2; ? /* ngx_connection_tcp_nodelay_e */unsigned ? ? ? ? ? ?tcp_nopush:2; ? ?/* ngx_connection_tcp_nopush_e */#if (NGX_HAVE_IOCP)unsigned ? ? ? ? ? ?accept_context_updated:1; #endif#if (NGX_HAVE_AIO_SENDFILE)unsigned ? ? ? ? ? ?aio_sendfile:1;ngx_buf_t ? ? ? ? ?*busy_sendfile; #endif#if (NGX_THREADS)ngx_atomic_t ? ? ? ?lock; #endif };
3ngx_cycle_t
在core/ngx_cycle.h中
?
struct ngx_cycle_s {/*保存著所有模塊存儲配置項的結構體指針,它首先是一個數組,每個數組成員又是一個指針,這個指針指向另一個存儲著指針的數組*/void ? ? ? ? ? ? ? ? ?****conf_ctx;ngx_pool_t ? ? ? ? ? ? ? *pool;//內存池/*日志模塊中提供了生成基本ngx_log_t日志對象的功能,這里的log實際上是在還沒有執行ngx_init_cycle方法前,也就是還沒解析配置前,如果有信息需要輸出到日志,就會暫時使用log對象,它會輸出到屏幕。在ngx_init_cycle方法執行后,將會根據nginx.conf配置文件中的配置項,構造出正確的日志文件,此時會對log重新賦值*/ngx_log_t ? ? ? ? ? ? ? ?*log;/*調用ngx_init_cycle方法后,會用new_log的地址覆蓋上面的log指針*/ngx_log_t ? ? ? ? ? ? ? ? new_log;//fiels保存所有ngx_connection_t的指針組成的數組,files_n就是指針的總數,而文件句柄的值用來訪問files數組成員ngx_connection_t ? ? ? ?**files;//空閑連接池,與free_connection_n配合使用ngx_connection_t ? ? ? ? *free_connections;//空閑連接池中連接的總數ngx_uint_t ? ? ? ? ? ? ? ?free_connection_n;//可重復使用的雙向連接隊列,成員類型是ngx_connection_tngx_queue_t ? ? ? ? ? ? ? reusable_connections_queue;//存儲ngx_listening_t成員ngx_array_t ? ? ? ? ? ? ? listening;//保存著Nginx所有要操作的目錄,如果目錄不存在,則會試圖創建,而創建目錄失敗將會導致Nginx啟動失敗。ngx_array_t ? ? ? ? ? ? ? pathes;//保存Nginx已經打開的所有文件(ngx_open_file_t結構體)的單鏈表。ngx_list_t ? ? ? ? ? ? ? ?open_files;//單鏈表存儲ngx_shm_zone_t,每個元素表示一塊共享內存。ngx_list_t ? ? ? ? ? ? ? ?shared_memory;//表示當前進程中所有連接對象的總數,與下面的connections成員配合使用ngx_uint_t ? ? ? ? ? ? ? ?connection_n;//表示files數組中ngx_connection_t指針的總數ngx_uint_t ? ? ? ? ? ? ? ?files_n;//指向當前進程中的所有連接對象,每個連接對象對應一個寫事件和一個讀事件ngx_connection_t ? ? ? ? *connections;//指向當前進程中的所有寫事件對象,connection_n同時表示所有讀事件的總數ngx_event_t ? ? ? ? ? ? ?*read_events;//指向當前進程中的所有寫事件對象,connection_n同時表示所有寫事件的總數ngx_event_t ? ? ? ? ? ? ?*write_events;/*舊的ngx_cycle_t對象用于引用上一個ngx_cycle_t對象中的成員,例如ngx_init_cycle方法,在啟動初期,需要建立一個臨時的ngx_cycle_t對象保存一些變量,在調用ngx_init_cycle方法時,就可以把舊的ngx_cycle_t的對象傳進去,而這時old_clcle對象就會保存這個前期的ngx_clcle_t對象。*/ngx_cycle_t ? ? ? ? ? ? ?*old_cycle;//配置文件相對于安裝目錄的路徑名稱ngx_str_t ? ? ? ? ? ? ? ? conf_file;//Nginx處理配置文件時需要特殊處理的在命令行攜帶的參數,一般是-g選項攜帶的參數ngx_str_t ? ? ? ? ? ? ? ? conf_param;//Nginx配置文件所在的路徑ngx_str_t ? ? ? ? ? ? ? ? conf_prefix;//Nginx安裝目錄的路徑ngx_str_t ? ? ? ? ? ? ? ? prefix;//用于進程間同步的文件鎖名稱ngx_str_t ? ? ? ? ? ? ? ? lock_file;//使用gethostname系統調用得到的主機名ngx_str_t ? ? ? ? ? ? ? ? hostname; };
4ngx_conf_t
在core/ngx_conf_file.h
---------------------?
作者:yanziguilai?
來源:CSDN?
原文:https://blog.csdn.net/xiaoliangsky/article/details/39831035?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的nginx学习十 ngx_cycle_t 、ngx_connection_t 和ngx_listening_t的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nginx基本数据结构之ngx_hash
- 下一篇: nginx监听事件流程