nginx原始碼分析—nginx的配置
nginx都是乙個master程序來管理多個worker程序。worker程序的數量與伺服器上的cpu核心數相等。master是管理worker,接受外部訊號,worker程序之間通過共享記憶體、原子操作實現通訊和同步。
任意乙個worker程序出現錯誤從而導致coredump時,master程序會立刻啟動新的worker程序繼續服務。
不同worker程序之間處理併發請求幾乎沒有同步鎖的限制,(可以參考程序間通訊機制中的介紹)
實現負載均衡使用的是負載均衡鎖,accept_mutex,每乙個worker程序都在嘗試獲取這個鎖,只有獲取了這個鎖的worker程序才可以接受客戶端的連線。預設是開啟的,如果某乙個程序沒有得到這個鎖,那麼等待accept_mutex_delay 時間以後再去嘗試獲取這個鎖。
由於ip位址的數量有限,經常存在多個主機網域名稱對應著同乙個ip位址的情況,這時在nginx.conf中就可以按照server_name(對應使用者請求中的主機網域名稱)並通過server塊來定義虛擬主機,每個server塊就是乙個虛擬主機,它只處理與之相對應的主機網域名稱當前請求。這樣,一台伺服器上的nginx就可以不同的方式處理訪問不同主機網域名稱的http請求了
server_name後可以跟多個主機名稱,在開始處理乙個http請求時,nginx會去除header頭中的host,與每個server中的serve_name進行匹配,以此決定到底由哪乙個server塊來處理這個請求。為了提高尋找server name 的能力,使用雜湊表來儲存server name
ngxin對於每個建立成功的tcp連線會預先分配乙個記憶體池。也就是ngx_connection_t結構體中的pool,在處理http請求時,將會為每個請求分配乙個記憶體池。
反向**方式是指用**伺服器來接受internet上的連線請求,然後將請求**給內部網路中的上游伺服器,並將從上游伺服器上得到的結果返回給internet上請求連線的客戶端,此時**伺服器對外的表現就是乙個web伺服器。
一般nginx可以作為靜態伺服器,對於乙個動態請求,可以在別的伺服器上,這時nginx就是乙個反向**伺服器,作為乙個反向**伺服器,如果上游伺服器返回內容,則不會先完整的快取到nginx**伺服器再向客戶端**,而是邊接收邊**到客戶端;使用者發來的請求將會完整的快取到ngingx**伺服器,之後才會向後端伺服器**;nginx反向**伺服器可以根據多種方案從上游伺服器的集群中選擇一台,他的負載均衡方案包括安ip位址做雜湊等。
客戶端發http請求,nginx進行快取,知道接收到乙個完整的http請求包體,缺點是延長了乙個請求的處理時間,但是降低了上游伺服器的負載,因為ngxin和請求時外網,nginx和上游伺服器是內網。
方向**負載均衡可以通過權重或者ip_hash來實現均衡。我們希望來自某乙個使用者的請求始終落到固定的一台上游伺服器中,例如,假設上游伺服器會快取一些資訊,如果同乙個使用者的請求任意地**到集群中的任一台上游伺服器中,那麼每一台上游伺服器都有可能會快取同乙份資訊,ip_hash解決上述問題,如果乙個上游伺服器暫時不用,不要刪除,使用down表示,保證**策略一貫性
nginx原始碼分析 從原始碼看nginx框架總結
nginx原始碼總結 1 中沒有特別繞特別彆扭的編碼實現,從變數的定義呼叫函式的實現封裝,都非常恰當,比如從函式命名或者變數命名就可以看出來定義的大體意義,函式的基本功能,再好的架構實現在編碼習慣差的人實現也會黯然失色,如果透徹理解 的實現,領悟架構的設計初衷,覺得每塊 就想經過耐心雕琢一樣,不僅僅...
nginx 原始碼分析
近期準備研究一下nginx原始碼,此處記錄一下。計畫 1 了解evan miller 的文章 2 了解nginx的組織架構 3 了解nginx的基本資料結構 4 熟悉nginx的主要module及執行機制,主要是core http event os 5 簡單的module開發及測試 一 準備 為了方...
Nginx原始碼分析 connections陣列
本文的標題讓我糾結了好久,不知道是connections陣列合適,還是connections鍊錶更合適 nginx在此或多或少的注入了二者的特點,先不管是叫陣列還是叫鍊錶吧,只要能夠弄明白這個connections是怎麼回事就大功告成。nginx的每個worker程序都使用乙個相同的connecti...