自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Nginx源碼分析之開篇

開發(fā) 前端
Nginx源碼構(gòu)思精巧,每每閱讀頗有收獲,寫此文與各碼農(nóng)分享。閱讀從main開始,流程非常清晰。

Nginx源碼構(gòu)思精巧,每每閱讀頗有收獲,寫此文與各碼農(nóng)分享。

閱讀從main開始,流程非常清晰。

  1. /* 系統(tǒng)錯(cuò)誤初始化,將構(gòu)建ngx_sys_errlist */ 
  2.  
  3. ngx_strerror_init();  
  4. /* 選項(xiàng)處理 */ 
  5. ngx_get_options(argc, argv);  
  6.  
  7. /* 時(shí)間初始化, 當(dāng)前時(shí)間:ngx_current_msec */ 
  8. ngx_time_init();  
  9.  
  10. /* 日志初始化 */ 
  11. log = ngx_log_init(ngx_prefix);  
  12.  
  13. /* 選項(xiàng)處理 */ 
  14. ngx_save_argv(..., argc, argv);  
  15. ngx_process_options(...);  
  16.  
  17. /* 操作系統(tǒng)初始化處理 */ 
  18. ngx_os_init(log);  
  19.  
  20. /* 模塊點(diǎn)名, ngx_modules代表所有模塊,是個(gè)數(shù)組 */ 
  21. ngx_max_module = 0;  
  22. for (i = 0; ngx_modules[i]; i++) {  
  23.     ngx_modules[i]->index = ngx_max_module++;  
  24. }  
  25.  
  26. /*  
  27.  * 系統(tǒng)初始化,這里將發(fā)生配置文件解析,模塊上下文注冊(cè)鉤子調(diào)用,模塊初始化  
  28.  * module     : 模塊  
  29.  * commands  : 模塊指令集,負(fù)責(zé)解析配置文件的選項(xiàng),一個(gè)指令對(duì)應(yīng)一個(gè)配置選項(xiàng)  
  30.  * conf            : 模塊配置結(jié)構(gòu)體,指令解析后的值就是存儲(chǔ)在這個(gè)里面,每個(gè)模塊都有自已的一個(gè)conf  
  31.  * ctx              : 模塊上下文,有四種,core, event, http, mail,有注冊(cè)鉤子功能。比如 create conf, init conf  
  32.  */ 
  33. cycle = ngx_init_cycle(&init_cycle);  
  34.  
  35. /* 創(chuàng)建進(jìn)程id文件 */ 
  36. ngx_create_pidfile(&ccf->pid, cycle->log);  
  37.  
  38. /*  
  39.  * 進(jìn)程處理  
  40.  * 主進(jìn)程(master)產(chǎn)生多個(gè)工作進(jìn)程(worker)  
  41.  * 這里將做各模塊進(jìn)程初始化,監(jiān)聽,接受,請(qǐng)求處理,還有信號(hào)等  
  42.  */ 
  43. ngx_master_process_cycle(cycle) {  
  44.     ngx_start_worker_processes(cycle, ccf->worker_processes,  
  45.                                NGX_PROCESS_RESPAWN) {  
  46.         for ( ... ) {  
  47.             ngx_spawn_process(cycle, ngx_worker_process_cycle, NULL,  
  48.                           "worker process", type);  
  49.         }  
  50.     }  
  51. }  
  52.  
  53.  
  54. goto: 繼續(xù)  
  55. /* 生產(chǎn)進(jìn)程都在這個(gè)函數(shù)里處理 */ 
  56. ngx_worker_process_cycle {  
  57.     /* 各模塊進(jìn)程注冊(cè)鉤子調(diào)用 */ 
  58.     ngx_worker_process_init();  
  59.      
  60.     for ( ;; ) {  
  61.         ngx_process_events_and_timers(cycle);  
  62.     }  
  63. }  
  64.      
  65.  
  66. goto: 繼續(xù)  
  67. ngx_process_events_and_timers(cycle) {  
  68.     /*  
  69.      * 定時(shí)器,用紅黑樹實(shí)現(xiàn),這里找出某個(gè)event(事件)的超時(shí)時(shí)間  
  70.      * 每個(gè)事件在紅黑樹里的key的值為:ngx_currnet_msec + 超時(shí)時(shí)間(默認(rèn)60s)  
  71.      * timer的值為 -1 (如果沒有事件),或 ngx_current_msec - key  
  72.      */ 
  73.     timer = ngx_event_find_timer();  
  74.  
  75.     /* epoll 機(jī)制,這里將做 epoll_wait(..., timer); */ 
  76.     ngx_process_events(cycle, timer, flags);  
  77.      
  78.     /* 先處理所有可能超時(shí)的事件,如果超時(shí),將event的timedout設(shè)為1,并且馬上event->handler(ev); */ 
  79.     ngx_event_expire_timers();  
  80.  
  81.     /* 事件存隊(duì)列方式,開始遍歷,調(diào)用 */ 
  82.     ngx_event_process_posted(cycle, &ngx_posted_events);  
  83. }  
  84.  
  85.  
  86. /*  
  87.  * 幾個(gè)重要的結(jié)構(gòu)體  
  88.  * ngx_listening_t       : 監(jiān)聽套接字的結(jié)構(gòu)體,比如地址,端口等  
  89.  * ngx_connection_t   : 每個(gè)socket將對(duì)應(yīng)一個(gè)connection,意為連接,里面存著 fd,read(讀事件),  
  90.  *                               write(寫事件) 等。  
  91.  * ngx_event_t    : 事件結(jié)構(gòu)體,有個(gè)重要的函數(shù)指針handler,fd事件被驅(qū)動(dòng)時(shí),將調(diào)用這個(gè)函數(shù)。  
  92.  *                               它有幾個(gè)重要成員  
  93.  *                                     timer_set  : 每個(gè)event在epoll_wait前,要先進(jìn)入定時(shí)器紅黑樹,這個(gè)標(biāo)記就是  
  94.  *                                                       標(biāo)記是否在定時(shí)器里, 超時(shí)處理用的.  
  95.  *                                     active       : 當(dāng)ngx_add_event里(添加或更新事件) 進(jìn)入epoll時(shí),會(huì)置為1.  
  96.  *                                     ready       : 進(jìn)入事件隊(duì)列里,將置為1,只有為1,它對(duì)應(yīng)的socket fd才可以讀  
  97.  *                                     timedout   : 此事件對(duì)應(yīng)的socket fd將視為超時(shí)  
  98.  */ 
  99.  
  100.  
  101. /*  
  102.  * http處理  
  103.  * 當(dāng) listen fd 有連接過來(lái)時(shí),它將調(diào)用函數(shù) ngx_http_init_connection  
  104.  * 當(dāng) accept fd 有傳送東東時(shí),它將調(diào)用函數(shù) ngx_http_init_request,所以的處理都將從這函數(shù)開始  
  105.  */ 
  106. ngx_http_init_request {  
  107.     ngx_http_process_request_line {  
  108.         /* 讀請(qǐng)求頭 */ 
  109.         ngx_http_read_request_header(...);  
  110.  
  111.         /* 解析請(qǐng)求行 */ 
  112.         ngx_http_parse_request_line(...);  
  113.  
  114.         /* 處理請(qǐng)求頭部信息 */ 
  115.         ngx_http_process_request_headers(...) {  
  116.             for ( ;; ) {  
  117.                 /* 解析每一行 */ 
  118.                 ngx_http_parse_header_line(...);  
  119.             }  
  120.  
  121.             /* 解析之后對(duì)所有行的處理 */ 
  122.             ngx_http_process_request_header(...);  
  123.  
  124.             /* 真正開始處理請(qǐng)求 */ 
  125.             ngx_http_process_request(r) {  
  126.                 ngx_http_handler(r) {  
  127.                     /* 非常巧妙的設(shè)計(jì)處理即將開始 */ 
  128.                     ngx_http_core_run_phases(r);  
  129.                 }  
  130.             }  
  131.         }  
  132.  
  133.     }  
  134. }  
  135.  
  136.  
  137. /*  
  138.  * 精巧的設(shè)計(jì)函數(shù):責(zé)任鏈模式  
  139.  * http的每個(gè)請(qǐng)求可以分為好幾個(gè)階段  
  140.  *        規(guī)則重寫(rewrite)  
  141.  *        處理配置(不同url有不同的配置)  
  142.  *        權(quán)限訪問處理  
  143.  *        核心內(nèi)容處理(是走fastcgi,還是直接輸出或從緩存獲取等)  
  144.  *        日志處理  
  145.  *  
  146.  * 每個(gè)階段都可以由好幾個(gè)模塊處理,這些模塊組成一個(gè)鏈,  
  147.  * 這是設(shè)計(jì)模式里的一種,責(zé)任鏈模式  
  148.  */ 
  149.  ngx_http_core_run_phases(r) {  
  150.     while (ph[r->phase_handler].checker) {  
  151.  
  152.         rc = ph[r->phase_handler].checker(r, &ph[r->phase_handler]);  
  153.  
  154.         if (rc == NGX_OK) {  
  155.             return;  
  156.         }  
  157.     }  
  158.  }  

 原文鏈接:http://my.oschina.net/fqing/blog/79145

責(zé)任編輯:林師授 來(lái)源: OSCHINA
相關(guān)推薦

2021-09-22 07:57:23

Vue3 插件Vue應(yīng)用

2011-08-16 09:34:34

Nginx

2011-05-26 10:05:48

MongoDB

2023-02-26 08:42:10

源碼demouseEffect

2021-07-06 09:29:38

Cobar源碼AST

2021-03-23 09:17:58

SpringMVCHttpServletJavaEE

2024-06-13 07:55:19

2011-05-26 16:18:51

Mongodb

2020-07-28 08:54:39

內(nèi)核通信Netlink

2012-09-06 10:07:26

jQuery

2021-09-05 07:35:58

lifecycleAndroid組件原理

2009-07-08 13:22:30

JDK源碼分析Set

2017-01-12 14:52:03

JVMFinalRefere源碼

2022-08-27 08:02:09

SQL函數(shù)語(yǔ)法

2022-01-06 07:06:52

KubernetesResourceAPI

2022-05-30 07:36:54

vmstoragevmselect

2021-10-19 11:22:08

SentinelGo源碼

2017-02-09 15:46:09

數(shù)據(jù)分析互聯(lián)網(wǎng)

2019-09-09 06:30:06

Springboot程序員開發(fā)

2023-03-17 07:53:20

K8sAPIServerKubernetes
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)