摘要:四監聽套接字的使用假設此處我們使用作為事件處理模塊在增加事件時用戶可以使用中的字段當事件發生時該字段也會帶回。在創建監聽套接字時將結構分為級監聽套接字地址各級都是一對多的關系。
施洪寶
一. 基礎1.1 概述nginx源碼采用1.15.5
后續部分僅討論http中的listen配置解析以及優化流程
假設nginx http模塊的配置如下
http{ server { listen 127.0.0.1:8000; server_name www.baidu.com; root html; location /{ index index.html; } } server { listen 10.0.1.1:8000; server_name www.news.baidu.com; root html; location /{ index index.html; } } server { listen 8000; #相當于0.0.0.0:8000 server_name www.tieba.baidu.com; root html; location /{ index index.html; } } server { listen 127.0.0.1:8000; server_name www.zhidao.baidu.com; location / { root html; index index.html; } } }
端口, 地址, server的關系
1.2 存在的問題端口是指一個端口號, 例如上面的8000端口
地址是ip+port, 例如127.0.0.1:8000, 10.0.1.1:8000, 0.0.0.0:8000, listen后配置的是一個地址。
每個地址可以放到多個server中, 例如上面的127.0.0.1:8000
總而言之, 一個端口可以有多個地址, 每個地址可以有多個server
是否需要在讀取完http塊中所有的server才能建立監聽套接字, 綁定監聽地址?
是的, 因為允許配置通配地址, 故而必須將http塊中的server全部讀取完后, 才能知道如何建立監聽套接字。
一個端口可以對應多個地址, 如何建立監聽套接字, 如何綁定地址?
通常情況下, 每個地址只能綁定一次(只考慮tcp協議), 這種情況下, 我們只能選擇部分地址創建監聽套接字, 綁定監聽地址。
當配置中存在通配地址(0.0.0.0:port)時, 只需要創建一個監聽套接字, 綁定這個通配地址即可, 但需要能夠依據該監聽套接字找到該端口配置的其他地址, 這樣當客戶端發送請求時, 可以根據客戶端請求的地址, 找到對應地址下的相關配置。
當配置中不存在通配地址時, 需要對每個地址都創建一個監聽套接字, 綁定監聽地址。
一個地址多個server的情況下, 如何快速找到客戶端請求的server?
1.3 nginx listen解析的流程比較合適的方案是通過hash表。
為了快速找到客戶端請求的server, nginx以server_name為key, 每個server塊的配置(可以理解為一個指針, 該指針指向整個server塊的配置)為value, 放入到哈希表。
由于server_name中可以出現正則匹配等情況, nginx將server_name具體分為4類進行分別處理(www.baidu.com, *baidu.com, www.baidu*, ~*baidu)。
總體而言分為2步,
將所有http模塊內的配置解析完成, 將listen的相關配置暫存(主要存儲監聽端口以及監聽地址)。
根據上一步暫存的監聽端口以及監聽地址, 創建監聽套接字, 綁定監聽地址
二. 配置解析nginx http塊解析完成后, 會存儲配置文件中配置的監聽端口以及監聽地址, 其核心結構圖如下,
總體而言, 結構可以分為3級, 端口->地址->server
listen的處理流程:
三. 創建監聽套接字ngx_http_core_listen: 讀取配置文件配置
ngx_http_add_listen: 查看之前是否出現過當前監聽的端口, 沒有則新建, 否則追加
ngx_http_add_address: 查看之前該端口下是否監聽過該地址, 沒有則新建, 否則追加。
ngx_http_add_server: 查看server之前是否出現過, 沒有則新建, 否則報錯(重復定義)。
nginx最終創建的監聽套接字及其相關的結構圖如下,
3.1 源碼每個ngx_listening_t結構對應一個監聽套接字, 綁定一個監聽地址
每個ngx_listening_t結構后面需要存儲地址信息, 地址可能不止一個, 因為這個監聽套接字可能綁定的是通配地址, 這個端口下的其他地址都會放在這個監聽套接字下。例如, 1.1節的配置中, 只會創建一個ngx_listening_t結構, 其他地址的配置都會放到這個通配地址下。
每個監聽地址可能對應多個域名(配置文件中的server_name), 需要將這些域名放到哈希表中, 以供后續使用
總體而言, 結構分為3級, 監聽套接字->監聽地址->server
讀取完http塊后, 需要創建監聽套接字綁定監聽地址, 處理函數ngx_http_optimize_servers, 該函數的處理流程:
四. 監聽套接字的使用遍歷所有監聽端口, 針對每個監聽端口, 執行以下3步
對該端口下所有監聽地址排序(listen后配置bind的放在前面, 通配地址放在后面)
遍歷該端口下的所有地址, 將每個地址配置的所有server, 放到該地址的哈希表中。
為該端口建立監聽套接字, 綁定監聽地址。
假設此處我們使用epoll作為事件處理模塊
epoll在增加事件時, 用戶可以使用epoll_event中的data字段, 當事件發生時, 該字段也會帶回。
nginx中的epoll_event指向的是ngx_connection_t結構, 事件發生時, 調用ngx_connection_t結構中的讀寫事件, 負責具體處理事件, 參見下圖。
//c is ngx_connection_t rev = c->read; rev->hadler(rev); wev = c->write; wev->handler(wev);
每個監聽套接字對應一個ngx_connection_t, 該結構的讀事件回調函數為ngx_event_accept, 當用戶發起tcp握手時, 通過ngx_event_accept接受客戶端的連接請求。
五. 總結ngx_event_accept會接受客戶端請求, 初始化一個新的ngx_connection_t結構, 并將其加入到epoll中進行監聽, 最后會調用ngx_connection_t對應的ngx_listening_t的處理函數(http塊對應ngx_http_init_connection, mail塊ngx_mail_init_connection, stream塊對應ngx_stream_init_connection)
nginx在讀取listen相關的配置時, 將結構分為3級, 端口->地址->server, 各級都是一對多的關系。
nginx在創建監聽套接字時, 將結構分為3級, 監聽套接字->地址->server, 各級都是一對多的關系。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/40187.html
摘要:分析的結果,發現內存,基本沒有什么大的變化,網卡流量明顯降低,上下文切換明顯升高。網卡流量降低可以理解,因為當前系統已不能正常返回響應,但上下文切換升高卻不知道什么原因。 原文:http://chuansongme.com/n/797172 背景 據XX部門兄弟反應, 其在將PHP從5.3.8 升級到5.5.13 時, 開始運行正常, 運行一段時間后, 系統負載變高,達到200%以...
摘要:主要涉及到的協議以及的處理流程。并且中必須建立在協議之上。所以對協議的服務發起請求時,一般瀏覽器會建立條連接,并行的去請求不同的資源。表明該字段是否使用了編碼。 運營研發 張仕華 本文通過一個小例子串一遍nginx處理http2的流程。主要涉及到http2的協議以及nginx的處理流程。 http2簡介 http2比較http1.1主要有如下五個方面的不同: 二進制協議 http1....
摘要:無論這個連接是外部主動建立的,還是內部建立的。協議有表示層數據的表示安全壓縮。在整個發展過程中的所有思想和著重點都以一種稱為的文檔格式存在。 部署基礎知識url:協議://網站地址:端口(/)路徑地址?參數eg: http://www.baidu.com:80/abc/dd/ www.baidu.com找服務器 80端口:找服務器上提供服務的應用 nginx uri:/ab...
摘要:無論這個連接是外部主動建立的,還是內部建立的。協議有表示層數據的表示安全壓縮。在整個發展過程中的所有思想和著重點都以一種稱為的文檔格式存在。 部署基礎知識url:協議://網站地址:端口(/)路徑地址?參數eg: http://www.baidu.com:80/abc/dd/ www.baidu.com找服務器 80端口:找服務器上提供服務的應用 nginx uri:/ab...
閱讀 780·2023-04-25 16:55
閱讀 2811·2021-10-11 10:59
閱讀 2077·2021-09-09 11:38
閱讀 1791·2021-09-03 10:40
閱讀 1491·2019-08-30 15:52
閱讀 1131·2019-08-30 15:52
閱讀 960·2019-08-29 15:33
閱讀 3499·2019-08-29 11:26