亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > Nginx > 正文

Nginx學習筆記之事件驅動框架處理流程

2024-08-30 12:21:40
字體:
來源:轉載
供稿:網友
Nginx對請求的處理是通過事件觸發的,模塊作為事件消費者,只能被事件收集、分發器調用。在Nginx中,接收到一個請求時,不會產生一個單獨的進程來處理該請求,而是由事件收集、分發器(進程)調用某個模塊,由模塊處理請求,處理完后再返回到事件收集、分發器

ngx_event_core_module模塊的ngx_event_process_init方法對事件模塊做了一些初始化。其中包括將“請求連接”這樣一個讀事件對應的處理方法(handler)設置為ngx_event_accept函數,并將此事件添加到epoll模塊中。當有新連接事件發生時,ngx_event_accept就會被調用。大致流程是這樣:

worker進程在ngx_worker_process_cycle方法中不斷循環調用ngx_process_events_and_timers函數處理事件,這個函數是事件處理的總入口。

ngx_process_events_and_timers會調用ngx_process_events,這是一個宏,相當于ngx_event_actions.process_events,ngx_event_actions是個全局的結構體,存儲了對應事件驅動模塊(這里是epoll模塊)的10個函數接口。所以這里就是調用了ngx_epoll_module_ctx.actions.process_events函數,也就是ngx_epoll_process_events函數來處理事件。

ngx_epoll_process_events調用Linux函數接口epoll_wait獲得“有新連接”這個事件,然后調用這個事件的handler處理函數來對這個事件進行處理。

在上面已經說過handler已經被設置成了ngx_event_accept函數,所以就調用ngx_event_accept進行實際的處理。

下面分析ngx_event_accept方法,它的流程圖如下所示:

經過精簡的代碼如下,注釋中的序號對應上圖的序號:

voidngx_event_accept(ngx_event_t *ev){ socklen_t  socklen; ngx_err_t  err; ngx_log_t  *log; ngx_uint_t  level; ngx_socket_t  s; ngx_event_t  *rev, *wev; ngx_listening_t  *ls; ngx_connection_t *c, *lc; ngx_event_conf_t *ecf; u_char  sa[NGX_SOCKADDRLEN];  if (ev->timedout) {  if (ngx_enable_accept_events((ngx_cycle_t *) ngx_cycle) != NGX_OK) {   return;  }   ev->timedout = 0; }  ecf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_core_module);  if (ngx_event_flags & NGX_USE_RTSIG_EVENT) {  ev->available = 1;  } else if (!(ngx_event_flags & NGX_USE_KQUEUE_EVENT)) {  ev->available = ecf->multi_accept; }  lc = ev->data; ls = lc->listening; ev->ready = 0;  do {  socklen = NGX_SOCKADDRLEN;   /* 1、accept方法試圖建立連接,非阻塞調用 */  s = accept(lc->fd, (struct sockaddr *) sa, &socklen);   if (s == (ngx_socket_t) -1)  {   err = ngx_socket_errno;    if (err == NGX_EAGAIN)   {    /* 沒有連接,直接返回 */    return;   }    level = NGX_LOG_ALERT;    if (err == NGX_ECONNABORTED) {    level = NGX_LOG_ERR;    } else if (err == NGX_EMFILE || err == NGX_ENFILE) {    level = NGX_LOG_CRIT;   }    if (err == NGX_ECONNABORTED) {    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT) {     ev->available--;    }     if (ev->available) {     continue;    }   }    if (err == NGX_EMFILE || err == NGX_ENFILE) {    if (ngx_disable_accept_events((ngx_cycle_t *) ngx_cycle)     != NGX_OK)    {     return;    }     if (ngx_use_accept_mutex) {     if (ngx_accept_mutex_held) {      ngx_shmtx_unlock(&ngx_accept_mutex);      ngx_accept_mutex_held = 0;     }      ngx_accept_disabled = 1;     } else {     ngx_add_timer(ev, ecf->accept_mutex_delay);    }   }    return;  }   /* 2、設置負載均衡閾值 */  ngx_accept_disabled = ngx_cycle->connection_n / 8        - ngx_cycle->free_connection_n;   /* 3、從連接池獲得一個連接對象 */  c = ngx_get_connection(s, ev->log);   /* 4、為連接創建內存池 */  c->pool = ngx_create_pool(ls->pool_size, ev->log);   c->sockaddr = ngx_palloc(c->pool, socklen);   ngx_memcpy(c->sockaddr, sa, socklen);   log = ngx_palloc(c->pool, sizeof(ngx_log_t));   /* set a blocking mode for aio and non-blocking mode for others */  /* 5、設置套接字屬性為阻塞或非阻塞 */  if (ngx_inherited_nonblocking) {   if (ngx_event_flags & NGX_USE_AIO_EVENT) {    if (ngx_blocking(s) == -1) {     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,         ngx_blocking_n " failed");     ngx_close_accepted_connection(c);     return;    }   }   } else {   if (!(ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT))) {    if (ngx_nonblocking(s) == -1) {     ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_socket_errno,         ngx_nonblocking_n " failed");     ngx_close_accepted_connection(c);     return;    }   }  }   *log = ls->log;   c->recv = ngx_recv;  c->send = ngx_send;  c->recv_chain = ngx_recv_chain;  c->send_chain = ngx_send_chain;   c->log = log;  c->pool->log = log;   c->socklen = socklen;  c->listening = ls;  c->local_sockaddr = ls->sockaddr;  c->local_socklen = ls->socklen;   c->unexpected_eof = 1;   rev = c->read;  wev = c->write;   wev->ready = 1;   if (ngx_event_flags & (NGX_USE_AIO_EVENT|NGX_USE_RTSIG_EVENT)) {   /* rtsig, aio, iocp */   rev->ready = 1;  }   if (ev->deferred_accept) {   rev->ready = 1;   }   rev->log = log;  wev->log = log;   /*   * TODO: MT: - ngx_atomic_fetch_add()   *  or protection by critical section or light mutex   *   * TODO: MP: - allocated in a shared memory   *   - ngx_atomic_fetch_add()   *  or protection by critical section or light mutex   */   c->number = ngx_atomic_fetch_add(ngx_connection_counter, 1);   if (ls->addr_ntop) {   c->addr_text.data = ngx_pnalloc(c->pool, ls->addr_text_max_len);   if (c->addr_text.data == NULL) {    ngx_close_accepted_connection(c);    return;   }    c->addr_text.len = ngx_sock_ntop(c->sockaddr, c->socklen,            c->addr_text.data,            ls->addr_text_max_len, 0);   if (c->addr_text.len == 0) {    ngx_close_accepted_connection(c);    return;   }  }   /* 6、將新連接對應的讀寫事件添加到epoll對象中 */  if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {   if (ngx_add_conn(c) == NGX_ERROR) {    ngx_close_accepted_connection(c);    return;   }  }   log->data = NULL;  log->handler = NULL;   /* 7、TCP建立成功調用的方法,這個方法在ngx_listening_t結構體中 */  ls->handler(c);  } while (ev->available); /* available標志表示一次盡可能多的建立連接,由配置項multi_accept決定 */}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲视频专区在线| 国产成人小视频在线观看| 91免费国产视频| 夜夜嗨av一区二区三区免费区| 国产福利视频一区| 亚洲女人被黑人巨大进入| 亚洲一区亚洲二区亚洲三区| 欧美亚洲国产日韩2020| 日韩精品有码在线观看| 51色欧美片视频在线观看| 日韩精品中文字幕视频在线| 日韩av快播网址| 亚洲精品国产精品国自产观看浪潮| 中文字幕久热精品视频在线| 亚洲国产欧美精品| 久久久999成人| 欧美电影免费观看高清| 精品国产网站地址| 国产精品无av码在线观看| 亚洲免费视频一区二区| 国产精品视频一区国模私拍| 国产在线98福利播放视频| 精品福利樱桃av导航| 亚洲人午夜精品免费| 91精品久久久久久久久久久久久| 中文在线资源观看视频网站免费不卡| 国产视频精品久久久| 国产精品jvid在线观看蜜臀| 国产精品成人久久久久| 欧美—级高清免费播放| 亚洲精品资源在线| 日韩在线免费观看视频| 午夜精品久久久久久久男人的天堂| 亚洲国产欧美久久| 中文字幕日韩在线观看| 97热在线精品视频在线观看| 国产精品偷伦免费视频观看的| 日韩av手机在线看| 日韩av电影手机在线观看| 国产欧美日韩中文| 亚洲在线观看视频网站| 一道本无吗dⅴd在线播放一区| 国产精品视频男人的天堂| 久久999免费视频| 国产在线视频一区| 国产精品欧美日韩| 中文字幕无线精品亚洲乱码一区| 亚洲欧美一区二区三区四区| 亚洲在线免费观看| 国产日韩在线亚洲字幕中文| 欧美日韩国产中字| 日韩在线观看视频免费| 91高潮在线观看| 亚洲综合成人婷婷小说| 国产精品高潮在线| 成人xvideos免费视频| 国产成人精品一区二区| 亚洲欧美成人在线| 国外视频精品毛片| 97精品一区二区三区| 日韩在线观看网址| 成人免费在线视频网址| 日韩男女性生活视频| 久久久久免费视频| 国模精品系列视频| 91精品啪在线观看麻豆免费| 久久最新资源网| 欧美成aaa人片在线观看蜜臀| 一区二区亚洲欧洲国产日韩| 韩国精品久久久999| 69av在线播放| 在线观看欧美日韩| 国产99在线|中文| 中文字幕成人精品久久不卡| 国产精品扒开腿做爽爽爽男男| 久久精品欧美视频| 最好看的2019的中文字幕视频| 久久99久久亚洲国产| 国产精品三级久久久久久电影| 国产精品一区专区欧美日韩| 久久久精品在线观看| 亚洲精品视频久久| 色婷婷综合久久久久中文字幕1| 91精品视频免费看| 久久天天躁日日躁| 欧洲亚洲在线视频| 亚洲精品suv精品一区二区| 蜜臀久久99精品久久久久久宅男| 亚洲日本aⅴ片在线观看香蕉| 久久天堂av综合合色| 日韩电影免费观看在线| 色噜噜狠狠狠综合曰曰曰88av| 亚洲日本中文字幕| 精品福利免费观看| 中文国产成人精品久久一| 成人黄色免费片| 色婷婷综合久久久久| 久久久精品一区二区三区| 国产精品色视频| 日韩视频免费观看| 97人人爽人人喊人人模波多| 亚洲视频在线视频| 国产精品久久久久影院日本| 欧美裸体xxxxx| 成人免费看黄网站| 欧美日韩激情美女| 国产精品久久久| 亚洲精品中文字幕女同| 日韩在线观看免费| 色妞一区二区三区| 91久久嫩草影院一区二区| 91牛牛免费视频| 亚洲美女在线视频| 亚洲欧美中文在线视频| 2019中文字幕全在线观看| 欧美电影免费观看高清完整| 91在线播放国产| 亚洲国产精品久久| 亚洲美女中文字幕| 538国产精品一区二区在线| 91免费人成网站在线观看18| 亚洲а∨天堂久久精品喷水| 日韩毛片在线观看| 57pao国产精品一区| 成人免费视频xnxx.com| 欧美性在线观看| 美日韩丰满少妇在线观看| 亚洲久久久久久久久久久| 国产日本欧美在线观看| 欧美一级视频一区二区| 国产精品高潮呻吟久久av无限| 国产一区二区久久精品| 国产一区二区三区毛片| 伊人伊成久久人综合网小说| 久久久精品一区| 亚洲一区二区三区在线视频| 黑人巨大精品欧美一区二区三区| 51视频国产精品一区二区| 成人激情视频小说免费下载| 日本国产欧美一区二区三区| 成人欧美一区二区三区在线湿哒哒| 亚洲第一网中文字幕| 国产人妖伪娘一区91| 国产日韩欧美综合| 欧美日韩在线视频观看| 国产精品久久久久久婷婷天堂| 久久乐国产精品| 亚洲二区中文字幕| 国产精品av在线播放| 日韩精品一二三四区| 欧美精品videosex极品1| 欧美大人香蕉在线| 色噜噜狠狠色综合网图区| 亚洲图片欧美午夜| 国产精品视频精品视频| 亚洲视频一区二区| 色偷偷av一区二区三区乱| 一本色道久久综合狠狠躁篇的优点| 亚洲精品久久久久国产| 国产一区二区黑人欧美xxxx| 欧美日韩国产丝袜另类| 在线观看日韩www视频免费| 欧美精品免费在线| 免费不卡在线观看av|