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

首頁 > 網(wǎng)站 > Nginx > 正文

nginx中的listen指令實例解析

2024-08-30 12:30:04
字體:
供稿:網(wǎng)友

劇情回顧

上一篇文章我們分析了location指令的解析過程,簡單的回顧一下這個內(nèi)容:每個location對應(yīng)一個ngx_http_core_loc_conf_t結(jié)構(gòu)體,所有的location通過一個雙向隊列連接在一起。數(shù)據(jù)結(jié)構(gòu)比較復雜。

listen指令

nginx作為一個高性能的HTTP服務(wù)器,網(wǎng)絡(luò)的處理是其核心,了解網(wǎng)絡(luò)的初始化有助于加深對nginx網(wǎng)絡(luò)處理的了解。與網(wǎng)絡(luò)有關(guān)的配置命令主要有兩個:listen和sever_name。listen命令設(shè)置nginx監(jiān)聽地址,對于IP協(xié)議,這個地址就是address和port,對于UNIX域套接字協(xié)議,這個地址就是path,一條listen指令只能指定一個address或者port,address也可以是主機名

從這一篇文章開始,我們分析listen指令的解析過程,listen指令的配置如下:從nginx.org的手冊中我們可以獲取listen的使用方法:

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [ssl] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];

一個listen指令攜帶的參數(shù)是很復雜的。不過,我們一般很少關(guān)注那些不太常用的參數(shù),以下是一些常用的配置方式:

listen 127.0.0.1:8000;listen 127.0.0.1 不加端口,默認監(jiān)聽80端口;listen 8000listen *:8000listen localhost:8000

解析listen指令中的uri和端口

從上面的內(nèi)容知道,listen有多種用法,我們在解析的時候需要獲取到listen指令的端口號和uri部分,nginx提供了ngx_parse_url()方法來解析uri和port,該函數(shù)在解析listen指令的時候會被調(diào)用。

ngx_int_tngx_parse_url(ngx_pool_t *pool, ngx_url_t *u){ u_char *p; size_t len; p = u->url.data; len = u->url.len; // 這里是解析unix domain的協(xié)議 if (len >= 5 && ngx_strncasecmp(p, (u_char *) "unix:", 5) == 0) { return ngx_parse_unix_domain_url(pool, u); } // 解析IPV6協(xié)議 if (len && p[0] == '[') { return ngx_parse_inet6_url(pool, u); } // 解析IPV4協(xié)議 return ngx_parse_inet_url(pool, u);}

我們使用的是IPV4協(xié)議,這里分析ngx_parse_inet_url()函數(shù)

// u.url = "80";// u.listen = 1;// u.default_port = 80;static ngx_int_tngx_parse_inet_url(ngx_pool_t *pool, ngx_url_t *u){ u_char *p, *host, *port, *last, *uri, *args; size_t len; ngx_int_t n; struct sockaddr_in *sin;#if (NGX_HAVE_INET6) struct sockaddr_in6 *sin6;#endif u->socklen = sizeof(struct sockaddr_in); sin = (struct sockaddr_in *) &u->sockaddr; sin->sin_family = AF_INET;// IPV4類型 u->family = AF_INET;  host = u->url.data; // "80" last = host + u->url.len; // host的最后字符的位置 port = ngx_strlchr(host, last, ':'); // 找到port, 這里為 NULL uri = ngx_strlchr(host, last, '/'); // 找到uri,這里為 NULL args = ngx_strlchr(host, last, '?'); // 找到參數(shù)args,這里為 NULL if (args) { if (uri == NULL || args < uri) { uri = args; } } if (uri) { if (u->listen || !u->uri_part) { u->err = "invalid host"; return NGX_ERROR; } u->uri.len = last - uri; u->uri.data = uri; last = uri; if (uri < port) { port = NULL; } } if (port) { port++; len = last - port; n = ngx_atoi(port, len); if (n < 1 || n > 65535) { u->err = "invalid port"; return NGX_ERROR; } u->port = (in_port_t) n; sin->sin_port = htons((in_port_t) n); u->port_text.len = len; u->port_text.data = port; last = port - 1; } else { if (uri == NULL) { if (u->listen) { /* test value as port only */ n = ngx_atoi(host, last - host); if (n != NGX_ERROR) { if (n < 1 || n > 65535) { u->err = "invalid port"; return NGX_ERROR; } u->port = (in_port_t) n; sin->sin_port = htons((in_port_t) n); u->port_text.len = last - host; u->port_text.data = host; u->wildcard = 1; return NGX_OK; } } } u->no_port = 1; u->port = u->default_port; sin->sin_port = htons(u->default_port); } len = last - host; if (len == 0) { u->err = "no host"; return NGX_ERROR; } u->host.len = len; u->host.data = host; if (u->listen && len == 1 && *host == '*') { sin->sin_addr.s_addr = INADDR_ANY; u->wildcard = 1; return NGX_OK; } sin->sin_addr.s_addr = ngx_inet_addr(host, len); if (sin->sin_addr.s_addr != INADDR_NONE) { if (sin->sin_addr.s_addr == INADDR_ANY) { u->wildcard = 1; } u->naddrs = 1; u->addrs = ngx_pcalloc(pool, sizeof(ngx_addr_t)); if (u->addrs == NULL) { return NGX_ERROR; } sin = ngx_pcalloc(pool, sizeof(struct sockaddr_in)); if (sin == NULL) { return NGX_ERROR; } ngx_memcpy(sin, &u->sockaddr, sizeof(struct sockaddr_in)); u->addrs[0].sockaddr = (struct sockaddr *) sin; u->addrs[0].socklen = sizeof(struct sockaddr_in); p = ngx_pnalloc(pool, u->host.len + sizeof(":65535") - 1); if (p == NULL) { return NGX_ERROR; } u->addrs[0].name.len = ngx_sprintf(p, "%V:%d",  &u->host, u->port) - p; u->addrs[0].name.data = p; return NGX_OK; } if (u->no_resolve) { return NGX_OK; } if (ngx_inet_resolve_host(pool, u) != NGX_OK) { return NGX_ERROR; } u->family = u->addrs[0].sockaddr->sa_family; u->socklen = u->addrs[0].socklen; ngx_memcpy(&u->sockaddr, u->addrs[0].sockaddr, u->addrs[0].socklen); switch (u->family) {#if (NGX_HAVE_INET6) case AF_INET6: sin6 = (struct sockaddr_in6 *) &u->sockaddr; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) { u->wildcard = 1; } break;#endif default: /* AF_INET */ sin = (struct sockaddr_in *) &u->sockaddr; if (sin->sin_addr.s_addr == INADDR_ANY) { u->wildcard = 1; } break; } return NGX_OK;}

這個函數(shù)就是解析了我們listen的地址和端口號,我們的配置文件中,端口號為80,并沒有配置監(jiān)聽地址,所以u->wildcard = 1,表示這是一個通配符,要監(jiān)聽該服務(wù)器所有ip地址的這個端口號。

解析listen指令

下面從源碼中看一下listen的配置:

{  ngx_string("listen"), NGX_HTTP_SRV_CONF|NGX_CONF_1MORE, ngx_http_core_listen, NGX_HTTP_SRV_CONF_OFFSET, 0, NULL }

從配置文件中我們可以知道,listen只能出現(xiàn)在server 模塊中,可以帶有多個參數(shù)。

對應(yīng)的處理函數(shù)為 ngx_http_core_listen,下面我們分析這個函數(shù),我們刪除了一些進行錯誤判斷的代碼,

static char *ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf){ ngx_http_core_srv_conf_t *cscf = conf; ngx_str_t *value, size; ngx_url_t u; ngx_uint_t n; ngx_http_listen_opt_t lsopt; cscf->listen = 1; value = cf->args->elts; ngx_memzero(&u, sizeof(ngx_url_t)); u.url = value[1]; u.listen = 1; u.default_port = 80; if (ngx_parse_url(cf->pool, &u) != NGX_OK) { return NGX_CONF_ERROR; } ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t)); ngx_memcpy(&lsopt.sockaddr.sockaddr, &u.sockaddr, u.socklen); lsopt.socklen = u.socklen; lsopt.backlog = NGX_LISTEN_BACKLOG; lsopt.rcvbuf = -1; lsopt.sndbuf = -1;#if (NGX_HAVE_SETFIB) lsopt.setfib = -1;#endif#if (NGX_HAVE_TCP_FASTOPEN) lsopt.fastopen = -1;#endif lsopt.wildcard = u.wildcard;#if (NGX_HAVE_INET6) lsopt.ipv6only = 1;#endif (void) ngx_sock_ntop(&lsopt.sockaddr.sockaddr, lsopt.socklen, lsopt.addr,  NGX_SOCKADDR_STRLEN, 1); for (n = 2; n < cf->args->nelts; n++) { if (ngx_strcmp(value[n].data, "default_server") == 0 || ngx_strcmp(value[n].data, "default") == 0) { lsopt.default_server = 1; continue; } // 這里面的其他代碼都是處理listen的各種參數(shù),對我們這里的分析沒有用處 } if (ngx_http_add_listen(cf, cscf, &lsopt) == NGX_OK) { return NGX_CONF_OK; } return NGX_CONF_ERROR;}

這個函數(shù)的整體流程就是解析listen指令的各個參數(shù),生成一個 ngx_http_listen_opt_t,顧名思義,這個結(jié)構(gòu)體就是保存一些監(jiān)聽端口的選項(listening port option)。這里調(diào)用了一個函數(shù)ngx_parse_url(),我們上面已經(jīng)分析過了,這個函數(shù)的作用就是解析url中的address和port。

然后最重要的部分就要到了,ngx_http_core_listen()函數(shù)在最后面調(diào)用了ngx_http_add_listen()函數(shù),該函數(shù)是將listen的端口信息保存到ngx_http_core_main_conf_t結(jié)構(gòu)體的ports動態(tài)數(shù)組中。

ngx_http_add_listen()函數(shù)

// cf: 配置結(jié)構(gòu)體// cscf: listen指令所在的server的配置結(jié)構(gòu)體// lsopt : ngx_http_core_listen()生成的listen optionngx_int_tngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf, ngx_http_listen_opt_t *lsopt){ in_port_t     p; ngx_uint_t     i; struct sockaddr   *sa; ngx_http_conf_port_t  *port; ngx_http_core_main_conf_t *cmcf; // 獲取 ngx_http_core_module模塊的main_conf結(jié)構(gòu)體ngx_http_core_main_conf_t cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module); // ports字段是一個數(shù)組 if (cmcf->ports == NULL) {  cmcf->ports = ngx_array_create(cf->temp_pool, 2,          sizeof(ngx_http_conf_port_t));  if (cmcf->ports == NULL) {   return NGX_ERROR;  } } sa = &lsopt->sockaddr.sockaddr; p = ngx_inet_get_port(sa); port = cmcf->ports->elts; for (i = 0; i < cmcf->ports->nelts; i++) {  if (p != port[i].port || sa->sa_family != port[i].family) {   continue;  }  /* a port is already in the port list */  return ngx_http_add_addresses(cf, cscf, &port[i], lsopt); } /* add a port to the port list */ port = ngx_array_push(cmcf->ports); if (port == NULL) {  return NGX_ERROR; } port->family = sa->sa_family; port->port = p; port->addrs.elts = NULL; return ngx_http_add_address(cf, cscf, port, lsopt);}

這個函數(shù)將端口號的信息保存到了 ngx_http_core_main_conf_t結(jié)構(gòu)體的port字段中。

nginx,listen,指令

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到服務(wù)器教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产天堂素人系列在线视频| 日韩欧美在线免费观看| 99精品久久久久久中文字幕| 亚洲免费在线观看| 麻豆tv在线| 精品99999| 在线观看精品自拍视频| 久久激情婷婷| 国产一区二区三区四区五区美女| 国产裸体视频网站| 国产一区高清视频| 91精品综合久久久久久| 最新91在线| 国产精品亚洲综合久久小说| 亚洲资源网站| 9久久9毛片又大又硬又粗| 天堂在线亚洲| 精品免费视频.| 久草在线新资源| 欧美巨大xxxx做受沙滩| 中文字字幕一区二区三区四区五区| 亚洲乱码国产乱码精品精软件| 精品久久蜜桃| 亚洲春色综合另类校园电影| eeuss影院在线播放| 日日摸天天爽天天爽视频| 国产一区二区自拍| 国产精品ⅴa在线观看h| 久久久久久九九九九九| 日韩精品福利在线| 精品熟妇无码av免费久久| 亚洲一区二区三区在线免费观看| 亚洲不卡一卡2卡三卡4卡5卡精品| 99热在线成人| 国产又白又嫩又紧又爽18p| 免费av手机在线观看| 免费国产亚洲视频| 国产黄色精品| 国产成人一区二区精品非洲| 日韩在线一区二区三区免费视频| 美女裸体自慰在线观看| 又色又爽又黄无遮挡的免费视频| 亚洲欧美激情插| 视频免费裸体网站| 秋霞一区二区| 韩国主播福利视频一区二区三区| 欧美婷婷精品激情| 日日摸夜夜夜夜夜添| 91在线porny国产在线看| 日韩在线观看一区| 国产超碰人人模人人爽人人添| 97人人香蕉| 久久久久久久麻豆| 嘿嘿视频在线观看| 影音先锋男人看片资源| bbbbbbbbbbb在线视频| 秋霞影院一区二区三区| 欧美成人三级在线播放| 国产日韩三级在线| 亚洲综合电影一区二区三区| 偷拍自拍亚洲| 艳妇乳肉豪妇荡乳av无码福利| 色欲综合视频天天天| 大地资源网3页在线观看| 亚洲中文字幕在线观看| 麻豆一区在线| 久久草在线看| 一级全黄裸体片| 大吊一区二区三区| 91极品女神私人尤物在线播放| 视频一区二区在线| 久草在线资源视频在线观看| 51自拍视频在线观看| 91久久国产最好的精华液| www.久久精品.com| 欧洲有码在线视频| 亚洲日本一区二区三区在线观看| 本田岬高潮一区二区三区| 亚洲人成无码www久久久| 久久日本片精品aaaaa国产| 在线播放你懂得| 一区二区国产欧美| eeuss影影院www在线播放| 青梅竹马是消防员在线| 欧美性猛交内射兽交老熟妇| 亚洲精品.com| 热久久中文字幕| 婷婷六月国产精品久久不卡| 欧美亚洲韩国| 亚洲性人人天天夜夜摸| 欧美黄色一区二区| 999精品在线观看| 精品无码一区二区三区| 国产精品久久久久久久久久久久午夜片| 91极品尤物在线播放国产| 中文字幕中文字幕在线一区| 国产欧美精品一区二区色综合| 黑人巨大精品欧美一区二区免费| 四色成人av永久网址| 人妻av一区二区| 99免费在线观看视频| 蜜桃传媒一区二区亚洲av| 一级片在线免费观看视频| 婷婷五月色综合香五月| 亚洲免费伊人电影| 国产娇喘精品一区二区三区图片| 亚洲午夜精品一区二区| 偷拍精品福利视频导航| 全亚洲最色的网站在线观看| 日韩精品一区二区亚洲av| 欧美video巨大粗暴18| 大肉大捧一进一出好爽| 国产精品av久久久久久麻豆网| av2014天堂网| 日韩av播放器| 无码人妻久久一区二区三区蜜桃| 亚洲va欧美va人人爽成人影院| 亚洲欧美日韩高清在线| 狠狠躁夜夜躁人人爽天天天天97| 日韩综合视频在线观看| 日日日日人人人夜夜夜2017| 一区二区视频欧美| 777免费视频| 国产精品一区二区你懂的| 午夜国产精品理论片久久影院| 国产成人精品视频ⅴa片软件竹菊| heyzo高清国产精品| 成人听书哪个软件好| 99国产精品久久久久久久久久| 亚洲999一在线观看www| 午夜av不卡| 一级做a爱片久久| 国产嫩bbwbbw高潮| 三级影片在线看| www.男人的天堂| 国产youjizz在线| 久久久影院官网| 欧美美女一区| 亚洲成a人无码| 黄色成年人视频在线观看| 在线观看亚洲成人| 久久精品香蕉视频| 欧美黑人国产人伦爽爽爽| 午夜欧美2019年伦理| 777亚洲妇女| 三级a三级三级三级a十八发禁止| 中文字幕av播放| 一区二区三区在线资源| 伊人久久久大香线蕉综合直播| 欧美肥婆姓交大片| 国产成人aa精品一区在线播放| 99久久国产免费看| 精品美女久久| 天天操天天舔天天干| 欧美 国产 综合| 亚洲欧洲成人| 精品在线观看免费| 中文字幕一区二区三区四区视频| melody高清在线观看| 91麻豆精品一二三区在线| 国产日韩专区| 国产一区二区日韩精品| 国产亚洲第一页| 天天射,天天干| 免费黄色大片| 中文字幕日韩在线播放| 日韩精品 欧美| 国产做受69高潮| www国产亚洲精品久久网站| 亚洲精品中文综合第一页| 国产不卡一区二区三区在线观看| 国产91亚洲精品久久久| 国产精品免费看久久久香蕉| 电影天堂最新网址| 日韩国产在线播放| 免费看黄色三级| 欧美精品第一页在线播放| 国产黄色大片在线观看| 黄色成年人视频在线观看| 视频区 图片区 小说区| 国产欧美一区二区三区在线| 97在线免费视频观看| 日韩男人的天堂| 欧美三级欧美成人高清www| 国产高清在线视频| 男人的天堂视频在线| 日韩免费成人网| 欧美精品在欧美一区二区| 日本高清不卡一区二区三区视频| 波多野结衣黄色网址| 91九色最新地址| 亚洲色图100p| 亚洲三区四区| 国产精美视频| 最新91在线视频| 亚洲国产午夜伦理片大全在线观看网站| 国产成人精品1024| 免费高清在线视频一区·| 噜噜噜久久亚洲精品国产品小说| 欧美日韩在线成人| 欧美专区第一页| 西瓜成人精品人成网站| 最近中文字幕mv免费高清在线| 国产青春久久久国产毛片| 好吊妞视频这里有精品| 国产成人在线电影| 天堂中文在线看| 天堂av免费观看| 国产精品扒开做爽爽爽的视频| 伊人网在线观看| 成人短剧在线观看| 午夜久久电影网| 亚洲黄色av片| 亚洲一区二区在线免费| 在线观看国产91| 国产精品1区2区3区在线观看| 中日韩男男gay无套| 在线观看日韩专区| 天天综合网天天综合色| 国产福利小视频| 日韩电影一区二区三区四区| 精品91自产拍在线观看一区| 亚洲欧美日韩精品久久奇米色影视| 日韩暖暖在线视频| 精品国产乱码一区二区三区| 国产精品综合一区二区三区| 成人精品在线| 日本一本在线视频| 黄色av片三级三级三级免费看| 丁香5月婷婷久久| 国产写真视频在线观看| 成人三级毛片| 日韩精品一二三四| 日欧美一区二区| 久久夜色精品亚洲| 精品视频在线看| 国产成人精品亚洲日本在线桃色| 天天看天天干| 亚洲精品v欧美精品v日韩精品| 亚洲午夜私人影院| 久久久久久久极品| 日本午夜精品理论片a级app发布| 26uuu国产一区二区三区| 色综合久久综合中文综合网| 成人女性文胸| 女女互磨互喷水高潮les呻吟| 91理论电影在线观看| 久久久久久av无码免费网站下载| 亚洲成a人片77777老司机| 日本不卡免费播放| 日韩欧美国产精品一区| 麻豆av一区二区三区| 内射一区二区三区| 国产一区二区精品福利地址| 中文字幕日韩精品在线| 日韩一区二区三区免费视频| 国产精品国产三级在线观看| 国产精品av网站| 欧美成人xxx| 国产成人亚洲精品播放器下载| 欧美性猛交ⅹxxx乱大交免费| 清纯唯美一区二区三区| 欧美虐宫另类残忍视频| 伊人网在线免费观看| 色综合久久六月婷婷中文字幕| 色狠狠综合天天综合综合| 日韩一区二区三区观看| 福利片一区二区三区| 男人草女人视频| 精品中文字幕人| 免费观看日批视频| 国产亚洲精彩久久| 久草手机视频在线观看| 91中文字幕在线| 日本一道本久久| 99久久99久久精品国产片果冰| 激情五月深爱五月| 成人ar影院免费观看视频| 国产v亚洲v天堂无码久久久| 精品少妇一区| 天天色天天干天天| 水蜜桃av无码| 中文字幕一区二区人妻在线不卡| av免费在线网址| 国内精彩免费自拍视频在线观看网址| 中文字幕一区二区三区四区五区人| 4hu最新网址| 国产一级片av| 91麻豆产精品久久久久久| 小泽玛利亚av在线| 深夜视频在线免费| 亚洲久久一区二区| 国产精品网红直播| 天天做综合网| 麻豆精品蜜桃视频网站| 偷偷www综合久久久久久久| 欧美国产精品日韩| 婷婷色在线播放| 美女亚洲一区| 日韩毛片精品高清免费| 中文字幕亚洲一区| 久久久久无码精品国产sm果冻| 国产中文字幕精品| 精品视频久久久久久久| 另类小说视频一区二区| www中文在线| 欧美国产日韩在线播放| 久久久久久福利| 亚洲免费不卡视频| av福利在线| 69堂精品视频在线播放| 1024视频在线| 18加网站在线| 国产一区二区丝袜| 国产999在线观看| 亚洲成人av网址| 伊人久久久大香线蕉综合直播| wwwxxxx欧美| 成人午夜短视频| 成人综合社区| 在线电影中文日韩| 国产一区国产二区国产三区| 中文字幕av网| 国产在线视频网址| www 四虎| 欧美日韩国产小视频| 欧美极品视频在线观看| 中文无码日韩欧|