在之前一篇博客中我們講述了httpd網絡服務器,那么httpd是個非常穩定安全的一個服務器,這次我們介紹一個新的網絡服務器—-nginx。
Nginx 是俄羅斯人編寫的十分輕量級的 HTTP 服務器,Nginx,它的發音為“engine X”,是一個高性能的HTTP和反向代理服務器(我們主要圍繞這兩點),同時也是一個 IMAP/POP3/SMTP 代理服務器,還能作為TCP/UDP的反向代理服務器,意味著還能可以完全代理MySQL,Nginx 是由俄羅斯人 Igor Sysoev 為俄羅斯訪問量第二的 Rambler.ru 站點開發的。Igor Sysoev 在建立的項目時,使用基于BSD 許可。
1、httpd與nginx
自從nginx出現之后,就一路飆升,步步蠶食httpd的市場空間,但是在nginx出現之前httpd是非?;鸬模敲礊槭裁丛趆ttpd非常火的時候,nginx就出現的呢?這是因為出現了一個叫C10K的問題,所謂的C10K問題就是10K Connections,我們都知道1K=1000,10K就是10000,也就是說,這是httpd的并發瓶頸,最大也就是支持10000的并發請求量,所以nginx這樣一款輕量級的服務器就出來了。
那么為什么會由這樣的結果呢?原因在于處理的模塊不同,現在http的2.4版本共有三種模塊,分別是:
prefork:進程模型,兩級結構,主進程master負責生成與銷毀子進程以及接收請求報文,每個子進程worker負責響應一個請求。 worker:線程模型,三級結構,主進程master負責生成與銷毀子進程并接收請求報文,而每個子進程worker負責生出多個線程,每個線程處理一個請求。 event:進程模型,兩級結構,主進程master生成并銷毀子進程以及接收請求,而子進程worker可處理多個請求并與之響應。
當時的httpd采用就是前兩種類型,worker模式線程與進程的等級是差不多,在性能方面上提高不了多少,而event也是近幾年才有的模型。
2、Nginx設計架構
Nginx在兩級結構的設計上,一種是master,另一個worker進程,后者可生成多個,master本身不響應用戶的請求,只負責生成監控worker進程,以及加載配置文件的管理,平滑升級,負責應用配置文件并應用新配置,用戶的請求報文通常是由master來接收。
worker進程是直接用來處理請求的,每個worker可以處理多個用戶請求,worker的生成應小于CPU的核心數,而處理的請求完成IO調用時,利用epoll等多路IO,還包含sendfile機制,mmap內存映射,所以特點是基于事件驅動,異步,非阻塞。
再由master進程將請求報文發送給worker直接處理請求,同時還有緩存相關的進程,一個是cache loader叫做載入緩存對象,另一種是cache manager叫做管理緩存對象。
3、I/O模型
無論nginx和httpd都會發起系統調用運行I/O加載資源處理請求完成IO調用時響應客戶端,同時還要記錄日志,那么如何加載、如何調用?
I/O模型共分為以下幾類:阻塞型、非阻塞型、復用型、信號驅動型、異步
我們進行一次IO請求都會由兩個階段組成,第一步就是等待數據,就是將數據從磁盤復制到內核內存當中,第二部就是復制數據,即將數據從內核內存當中復制到進程內存中。
首先我們來說一下關于同步和異步,區分調用者與被調用者的關系。

3.1、同步、異步調用
同步和異步關注的就是消息的推送通知機制,同步是程序調用者發起IO調用,IO則就成為了被調用者,那調用者處于等待狀態,要等待被調用者調用完成之后,返回一個成功的一個消息,而后調用者才能將程序繼續執行下去。
異步就是調用者發起IO調用,IO成為被調用者,只不過就是調用者不會處于等待狀態,而調用者可以去執行其它任務,當被調用者調用完成之后,通過狀態、通知或回調機制通知調用者被調用者的運行狀態。
3.2、阻塞、非阻塞
阻塞與非阻塞關注的就是調用者在等待結果返回之前所處的狀態是什么樣的,阻塞狀態就是調用結果返回之前,調用者是處于一個掛起狀態;而非阻塞就是調用結果返回之前,調用者是不會被掛起的。
(圖)
4、Nginx特性
Nginx作為http服務器來說,有以下幾種特性:
1、它是靜態的web資源服務器,處理靜態文件(如:可做成圖片服務器,或js/css/html/txt等靜態資源服務器)。
2、結合FastCGI/uwSGI/SCGI等協議反代動態資源的請求,能夠實現簡單的負載和容錯。
3、能夠進行http和https協議的反向代理,說明支持SSL和TLSSNI。
4、支持imap4/pop3協議的反向代理。
5、支持tcp/udp的轉發。
6、Nginx轉為性能優化而開發,性能是其最重要的考量,實現上非常注重效率,支持Poll模型,對高負載來說是沒有問題的。
7、支持熱部署
8、采用master-slave模型,充分利用SMP優勢,減少在磁盤上的IO阻塞延遲,當采用select()/poll()調用時,還可以限制每個進程的連接數。
5、Nginx安裝配置
Nginx提供無非就常用的兩種方法,一種是RPM,另一種是源碼包的安裝,其Nginx的官方站點為:nginx.org那么官方的預制包站在http://nginx.org/packages/centos/7/x86_64/RPMS/。
對于RPM包來說,這個包基本沒有什么依賴性,不過要在絕對路徑下,因此可以直接使用rpm命令安裝也可以,或者使用yum。
# rpm -ivh ./nginx-1.10.2-1.el7.ngx.x86_64.rpm # yum -y install nginx
以上就是RPM包安裝的方式,還有一種是編譯安裝,不過我們要先使用yum命令安裝開發套件以及nginx所依賴的庫和輔助包。
# yum -y groupinstall 'Development Tools' 'system platform server' # yum -y install openssl-devel pcre-devel
以上的包安裝完成之后,就可以開始編譯了
# ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_dav_module --with-http_stub_status_module --with-threads --with-file-aio # make && make install
安裝完成之后在客戶端打開瀏覽器輸入在地址欄上輸入ip:port就可以看到你想要的結果了
原創文章,作者:劉 祥宇,如若轉載,請注明出處:http://www.www58058.com/70290