我也說說Nginx 先搞搞清楚

2022-02-28 09:03:23 字數 3898 閱讀 1066

這個很多文章裡都有,總之就是當年啊有個技術困難叫c10k問題,就是如何解決10萬個客戶端的併發請求問題。然後有個俄羅斯大牛某某某,在02年使用c語言搞了個東東聲稱可以處理每天5億請求,然後還開源了,這個東東就是叫nginx(nginx:"engine x" )的乙個http伺服器及反向**伺服器。還有電子郵件(imap/pop3)功能啥的。據說可以承受5萬併發鏈結,其實我4.9萬就夠用了。

1、當檔案描述符fd就緒,採用系統的**函式之間將fd放入,效率更高

2、最大連線數無限制    cat /proc/sys/fs/file-max

功能模組少, **模組化,因此除了反向**和資源快取等核心功能外,盡可能地避免新增不必要的功能模組。

nginx有許多優秀的標準庫和第三方模組,比如流量和連線監控和限制、影象格式轉換等等。

如果要新增新模組的話,必須將整個程式重新編譯。雖然這樣不如apache http的動態載入來得方便,但是可以保證執行效率的最大化和占用資源的最小化。

把cpu核心和nginx 工作程序繫結,把每個worker程序固定在乙個cpu上執行,減少切換cpu的cache miss,獲得更好效能 。

0拷貝傳輸模式,通過核心空間之間傳輸

高速、輕量、高效能等優點集於一身

nginx在近些年迅速發展並不斷擴大市場份額,甚至在最近其市場份額一舉超過微軟的iis,躍身到第二位,僅次於apache。

但是由於其高效能的特點,尤其適用於高流量**,在全球前 10,000個站點中的市場份額為58.4%,穩居第一。 

1、 http伺服器。提供http服務,可以做網頁靜態伺服器。

2、 虛擬主機。可以實現在一台伺服器虛擬出多個**。例如個人**使用的虛擬主機。

3、 反向**,負載均衡。當**的訪問量達到一定程度後,單台伺服器不能滿足使用者的請求時,需要用多台伺服器集群可以使用nginx做反向**。並且多台伺服器可以平均分擔負載,不會因為某台伺服器負載高宕機而某台伺服器閒置的情況。

nginx很擅長負載均衡和處理html檔案和等靜態資源,但是除了ssi(server side include)技術以外基本不能夠自己動態地生成資源。

這時,其實我們可以通過unix domain socket來讓其他程序處理並返回對應的動態資源。如果該程序位於其他機器上,則可以通過tcp來進行通訊。

特別地,對於和php程式之間的通訊可以使用fastcgi,對於python可以使用uwsgi,對於ruby on rails可以使用phusion passenger。對於dot net 以後再細說

nginx之所以能同時處理大量的請求,原因在於它採用了十分巧妙的事件驅動機制。

作為乙個web伺服器,要同時處理多個請求,不可避免地要面對這麼乙個問題,如何同時處理像磁碟和網路等等的i/o請求,即如何實現i/o復用。

為了解決該問題,作業系統在很久之前就開始提供諸如「select」、「poll」等系統呼叫。apache http的多處理模組(mpm,multi-processing module)就會用到這些系統呼叫。

但是,select/poll為了識別出哪些檔案或者socket已經準備就緒,必須將所有已註冊的檔案描述符(fd)乙個個地檢查一遍。如果註冊列表越長,那麼每次的掃瞄所需的時間也越長。

而nginx的i/o復用機制使用的是「epoll」這個基於事件驅動的系統呼叫。因為epoll會在系統核心管理和監聽這些檔案描述符(fd),並自動把就緒的加入到ready佇列當中。

所以,程式只需在需要時往ready佇列中取出乙個進行處理即可,而不用切換到核心態,然後乙個個地檢查,然後又切換回使用者態。

這樣,無論需要註冊監聽的i/o有多少,都不會影響程式的執行效率。

為了避免select/poll帶來的線性增長的負擔,apache http必須將這些io分散到各個程序/執行緒中處理,這樣勢必會造成占用記憶體的增長。

但是,nginx可以通過利用「epoll」,保證可以使用乙個程序/執行緒完成所有請求的處理,這樣可以大大減少記憶體的占用,從而使應對上萬併發請求成為可能。

一般是指區域網內部的機器通過**伺服器傳送請求到網際網路上的伺服器,**伺服器一般作用在客戶端。應用比如:goagent,fq神器.    乙個完整的**請求過程為:客戶端首先與**伺服器建立連線,接著根據**伺服器所使用的**協議,請求對目標伺服器建立連線、或者獲得目標伺服器的指定資源。 web**(proxy)伺服器是網路的中間實體。 **位於web客戶端和web伺服器之間,扮演「中間人」的角色。http的**伺服器即是web伺服器又是web客戶端。

**伺服器是介於客戶端和web伺服器之間的另一台伺服器,有了它之後,瀏覽器不是直接到web伺服器去取回網頁而是向**伺服器發出請求,訊號會先送到**伺服器,由**伺服器來取回瀏覽器所需要的資訊並傳送給你的瀏覽器。

正向**是乙個位於客戶端和原始伺服器直接的伺服器,**伺服器對於客戶端是可見的,為了從原始伺服器取得內容,客戶端需要先進行**配置,然後向**伺服器傳送請求並制定目標,之後**伺服器其訪問指定的目標伺服器並把響應內容返回給客戶端。 

典型的應用比如vpn。我們通過連線vpn輸入登入名密碼,然後就可以訪問google了。

它一般有著幾個作用:

fq加速訪問

cache作用

客戶端授權訪問

反向**中,客戶端是不知道反向**伺服器的存在的,也不需要進行特別的設定,因為反向**伺服器對於客戶端而已就像原始伺服器一般。 

客戶端向反向**的命名空間(name-space)中的內容發生普通請求,然後反向**伺服器將判斷向哪乙個原始伺服器轉交(非**)請求,並將獲得你 內容返回給客戶端。

反向**的作用:

保護和隱藏原始伺服器 

2.負載均衡

這時反向**伺服器就是乙個前置機,根據流量和原始伺服器的負載壓力對請求進行動態調整。

檔案描述符在形式上是乙個非負整數。實際上,它是乙個索引值,指向核心為每乙個程序所維護的該程序開啟檔案的記錄表。當程式開啟乙個現有檔案或者建立乙個新檔案時,核心向程序返回乙個檔案描述符。在程式設計中,一些涉及底層的程式編寫往往會圍繞著檔案描述符展開。但是檔案描述符這一概念往往只適用於unix、linux這樣的作業系統。

cpu可以訪問記憶體所有資料, 包括外圍裝置, 例如硬碟, 網絡卡. cpu也可以將自己從乙個程式切換到另乙個程式

只能受限的訪問記憶體, 且不允許訪問外圍裝置. 占用cpu的能力被剝奪, cpu資源可以被其他程式獲取

由於需要限制不同的程式之間的訪問能力, 防止他們獲取別的程式的記憶體資料, 或者獲取外圍裝置的資料, 併發送到網路, cpu劃分出兩個許可權等級 --使用者態核心態

所有使用者程式都是執行在使用者態的, 但是有時候程式確實需要做一些核心態的事情, 例如從硬碟讀取資料, 或者從鍵盤獲取輸入等. 而唯一可以做這些事情的就是作業系統, 所以此時程式就需要先作業系統請求以程式的名義來執行這些操作.

這時需要乙個這樣的機制: 使用者態程式切換到核心態, 但是不能控制在核心態中執行的指令

這種機制叫系統呼叫, 在cpu中的實現稱之為陷阱指令(trap instruction)

他們的工作流程如下:

使用者態程式將一些資料值放在暫存器中, 或者使用引數建立乙個堆疊(stack frame), 以此表明需要作業系統提供的服務.

使用者態程式執行陷阱指令

cpu切換到核心態, 並跳到位於記憶體指定位置的指令, 這些指令是作業系統的一部分, 他們具有記憶體保護, 不可被使用者態程式訪問

這些指令稱之為陷阱(trap)或者系統呼叫處理器(system call handler). 他們會讀取程式放入記憶體的資料引數, 並執行程式請求的服務

系統呼叫完成後, 作業系統會重置cpu為使用者態並返回系統呼叫的結果

我也說說bogomips

曾經一直很困惑linux是如何實現udelay的,因為如果使用cpu中斷,每一微秒就中斷加1,那麼cpu就會一直不停的處理中斷,這樣對於cpu的負荷是很大的。那麼肯定不能這麼去設計。那麼回憶一下曾經是如何做8051微控制器的延時的,那時計算乙個指令週期,然後讓乙個指令迴圈多次,然後做出延遲的效果。其...

我也說說OpenSSO

昨天看到oracle要關閉opensso的訊息,還說要停止原始碼的下載,我立刻cvs了一下.說來也巧呀,最近正在做sso的東西,專案經理讓我先研究一下opensso這個專案,正好昨天要下載它的原始碼,呵呵.個人覺得opensso這個專案還是很不錯的,看它的features,確實使挺大,支援的特性比較...

我也說說CIO

cio chief imformation office 資訊管理辦公室的領導。前面看到有一文說,中國企業裡面通常叫it主管,或資訊辦主任,不叫cio。的確,我贊同文中的觀點,很多企業對於資訊化的重視程度遠遠不夠,另外很多it主管本身沒有把自已定位在cio的角色也有關係。從我個人的理解來說,cio至...