nginx學習的一點摘錄

1.daemon的方式在後臺運行,後臺進程包含一個master進程和多個worker進程。


2.如何調試nginx,關閉後臺模式,以單進程方式運行。


3.nginx的進程模型以及事件處理模型。


4.我們要控制nginx,只需要通過kill向master進程發送信號就行了。


5.每個worker進程都是從master進程fork過來,在master進程裏面,
先建立好需要listen的socket(listenfd)之後,然後再fork出多個worker進程。


6.所有worker進程在註冊listenfd讀事件前搶accept_mutex,
搶到互斥鎖的那個進程註冊listenfd讀事件,在讀事件裏調用accept接受該連接。


7.對於一個基本的web服務器來說,事件通常有三種類型,網絡事件、信號、定時器。


8.關於信號的處理,大家可以學習一些專業書籍。


9.   我們看看nginx是如何處理一個連接的。首先,nginx在啓動時,會解析配置文件, 得到需要監聽的端口與ip地址,然後在nginx的master進程裏面,先初始化好這個監控的socket(創建socket,設置addrreuse等選項,綁定到指定的ip地址端口,再listen), 然後再fork出多個子進程出來,然後子進程會競爭accept新的連接。此時,客戶端就可以向nginx發起連接了。 當客戶端與服務端通過三次握手建立好一個連接後, nginx的某一個子進程會accept成功,得到這個建立好的連接的socket,然後創建nginx對連接的封裝,
即ngx_connection_t結構體。接着,設置讀寫事件處理函數並添加讀寫事件來與客戶端進行數據的交換。 最後,nginx或客戶端來主動關掉連接,到此,一個連接就壽終正寢了。
       nginx也是可以作爲客戶端來請求其它server的數據的(如upstream模塊),
此時,與其它server創建的連接,也封裝在ngx_connection_t中。作爲客戶端,
nginx先獲取一個ngx_connection_t結構體,然後創建socket,並設置socket的屬性( 比如非阻塞)。
然後再通過添加讀寫事件,調用connect/read/write來調用連接,最後關掉連接,並釋放ngx_connection_t。


10.nginx通過設置worker_connectons來設置每個進程支持的最大連接數,最大連接數是worker_connections * worker_processes。


11.nginx會控制進程是否添加accept事件,只有獲得了accept_mutex的進程纔會去添加accept事件。


12.nginx使用一個叫ngx_accept_disabled的變量來控制是否去競爭accept_mutex鎖。


13.ngx_http_request_t是對一個http請求的封裝。


14.用filter來過濾數據,對數據進行加工,如truncked傳輸、gzip壓縮等。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章