Nginx 是什麼
Nginx ("engine x") 是一個開源的,支持高性能、高併發的 Web 服務和代理服務軟件。它是由俄羅斯人 Igor Sysoev 開發的,最初被應用在俄羅斯的大型網站 www.rambler.ru 上。後來做者將源代碼以類 BSD 許可的形式開源出來供全球使用。html
Nginx 的官方介紹見 http://nginx.org/en/
Nginx 中文介紹見 http://tengine.taobao.org/nginx_docs/cn/前端
Nginx 的重要特性
Nginx 基本特性
- 可針對靜態資源高速高併發訪問及緩存。
- 可以使用反向代理加速,而且可進行數據緩存。
- 具備簡單負載均衡、節點健康檢查和容錯功能。
- 支持遠程 FastCGI 服務的緩存加速。
- 支持 FastCGI、Uwsgi、SCGI、Memcached Servers 的加速和緩存。
- 支持SSL、TLS、SNI。
- 具備模塊化的架構:過濾器包括 gzip 壓縮、ranges 支持、chunked 響應、XSLT、SSI 及圖像縮放等功能。在SSI 過濾中,一個包含多個 SSI 的頁面,若是經由 FastCGI 或反向代理,可被並行處理。
Nginx Web 服務特性
- 支持基於名字、端口及IP的多虛擬主機站點。
- 支持 Keep-alive 和 pipelined 鏈接。
- 可進行簡單、方便、靈活的配置和管理。
- 支持修改 Nginx 配置,而且在代碼上線時,可平滑重啓,不中斷業務訪問。
- 可自定義訪問日誌格式,臨時緩衝寫日誌操做,快速日誌輪詢及經過 rsyslog 處理日誌。
- 可利用信號控制 Nginx 進程。
- 支持 3xx-5xx HTTP狀態碼重定向。
- 支持 rewrite 模塊,支持 URI 重寫及正則表達式匹配。
- 支持基於客戶端 IP 地址和 HTTP 基本認證的訪問控制。
- 支持 PUT、DELETE、MKCOL、COPY 及 MOVE 等特殊的 HTTP 請求方法。
- 支持 FLV 流和 MP4 流技術產品應用。
- 支持 HTTP 響應速率限制。
- 支持同一 IP 地址的併發鏈接或請求數限制。
- 支持郵件服務代理。
面試必答特性
- 支持高併發:能支持幾萬併發鏈接(特別是靜態小文件業務環境)。
- 資源消耗少:在3萬併發鏈接下,開啓10個 Nginx 線程消耗的內存不到200MB。
- 能夠作 HTTP 反向代理及加速緩存,即負載均衡功能,內置對 RS 節點服務器健康檢查功能,這至關於專業的 Haproxy 軟件或 LVS 的功能。
- 具有 Squid 等專業緩存軟件等的緩存功能。
- 支持異步網絡 I/O 事件模型 epoll( Linux 2.6 內核 以上)。
Nginx 在企業中的應用
做爲 Web 服務軟件
Nginx 是一個支持高性能、高併發的 Web 服務軟件,它具備不少優秀的特性,做爲 Web 服務器,與 Apache 相比,Nginx 可以支持更多的併發鏈接訪問,但佔用的資源卻更少,效率更高,在功能上也強大了不少,幾乎不遜色於 Apache。java
反向代理或負載均衡服務
在反向代理或負載均衡服務方面,Nginx 能夠做爲 Web 服務、PHP 等動態服務及 Memcached 緩存的代理服務器,它具備相似專業反向代理軟件(如 Haproxy)的功能,同時也是一個優秀的郵件代理服務軟件(最先開發這個產品的目的之一就是做爲郵件代理服務),同時 Nginx 的代理在 Nginx 1.9.0 發佈以後,還支持 TCP 的代理。nginx
前端業務數據緩存服務
在 Web 緩存服務方面, Nginx 可經過自身的 proxy_cache 模塊實現類 Squid 等專業緩存軟件的功能。web
Nginx的這三大功能中, Web服務、反向代理或負載均衡服務是國內使用 Nginx 的主要場景。面試
Nginx 與其餘 Web軟件產品的對比
Apache 軟件特色
- Apache2.2 版本很是穩定強大,據官方說,Aapche 2.4 版本性能更強。
- prefork 模式取消了進程建立開銷,性能很高。
- 處理動態業務數據時,因關聯到後端的引擎和數據庫,瓶頸不在 Apache 上。
- 高併發時消耗資源相對多一些。
- 基於傳統的 select 模型,高併發能力有限。
- 支持擴展庫,能夠經過 DSO、apxs 方法編譯安裝額外的插件功能,不須要從新編譯 Apache。
- 功能多,更穩定,更安全,插件也多。
- 市場份額在逐年遞減。
Lighttpd 軟件特色
- 基於異步網絡 I/O 模型,性能、併發都與 Nginx 相近。
- 擴展庫是 SO 模式,比 Nginx 靈活。
- 目前國內使用率比較低,安全性沒有 Apache 和 Nginx 好。
- 經過插件(mod_secdownload)可實現文件 URL 地址加密(優勢)。
- 社區不活躍,市場份額交較低。
Nginx、Apache、Lighttpd 對比
- 處理靜態小文件(小於1MB)時,Nginx 和 Lighttpd 比 Apache 更有優點(高併發、資源佔用少)。這是由於 Nginx 和 Lighttpd 是基於異步網絡 I/O 模型,而 Apache 基於傳統的 select 模型。
- 處理動態數據時,三者差距不大,Apache 更有優點一點。這是由於處理動態數據的能力取決於 PHP(java)和後端數據庫的服務能力,也就是說瓶頸不在 Web 服務器上,通常狀況下普通的 PHP 引擎支持的併發鏈接參考值爲 300~1000,Java 引擎和數據庫的併發鏈接參考值爲 300~1500。業務場景及網站架構不一樣,併發鏈接數也會有上下浮動,這些數字僅供參考。
- Nginx 不支持相似 Apache 的動態模塊加載,安裝擴展模塊必須從新編譯 Nginx( Tengine 支持動態模塊加載)。
- Nginx 不只支持 Web服務,同時還能作反向代理或負載均衡服務以及前端業務數據緩存服務。
- Nginx 市場份額逐年快速增加,社區很是活躍。
Apache select 和 Nginx epoll 對比
下面用兩個通俗的比喻來解釋 Apache 採用的 select 模型 和 Nginx 採用的 epoll 模型之間的區別。正則表達式
第一個比喻:假設你在大學讀書,住的宿舍樓有不少房間,你的朋友要來找你。select 版宿管大媽就會帶着你的朋友到各房間挨個去找,直到找到你位置。而 epoll 版宿管大媽會先記下每位入住同窗的房間號,你的朋友來找你時,只須要告訴你的朋友你住在哪一個房間便可,不用親自帶着你的朋友滿宿舍樓找人了。若是同時來了 100 我的,都要找本身住在這棟樓的同窗, epoll 版宿管大媽的效率要更高。數據庫
第二個比喻:select 的調用複雜度是線性的,即O(n)。舉個例子,一個保姆照看一羣孩子,若是把孩子是否須要尿尿比做網絡 I/O 事件,select 的做用就比如這個保姆挨個詢問每一個孩子「你要尿尿嗎?」若是孩子回答是,保姆則把孩子領出去放到另一個地方。當全部的孩子詢問完以後,保姆領着這些要尿尿的孩子去上廁所(處理網絡 I/O 事件)。在 epoll 機制下,保姆不須要挨個詢問每一個孩子是否須要尿尿。取而代之的是,若是孩子須要尿尿,他就自主動站到事先約定好的地方,而保姆的職責就是查看事先約定好的地方是否有孩子。若是有小孩,則領着孩子去上廁所(網絡事件處理)。所以,epoll 的這種機制,可以高效地處理成千上萬的併發鏈接,並且性能不會隨着鏈接數增長而降低太多。apache
Apache select 和 Nginx epoll 技術對比後端
指標 |
select |
epoll |
性能 |
隨着鏈接數的增長性能急劇降低。處理成千上萬併發鏈接時,性能不好 |
隨着鏈接數的增長,性能基本上沒有降低。處理成千上萬併發鏈接時,性能很好 |
鏈接數 |
鏈接數有限制,處理的最大鏈接數不超過 1024 個 。若是超過 1024 個則需修改 FD_SETSIZE 宏,並從新編譯 |
鏈接數無限制 |
內在處理機制 |
線性輪詢 |
回調 callback |
開發複雜性 |
低 |
中 |
更多關於 select 和 epoll 原理及深刻區別
Apache select和Nginx epoll模型區別
Kqueue與epoll機制
怎樣理解阻塞非阻塞與同步異步的區別?
如何正確選擇 Web 服務器
雖然國內不少人都在使用 Nginx ,可是 Apache、Lighttpd 這兩個 Web 服務器一樣很是強大且使用,尤爲 Apache ,到目前爲止還是全球使用最普遍的 Web 服務軟件。
在實際工做中,咱們須要根據業務需求來選擇合適的業務服務軟件,建議以下:
- 靜態業務:如果高併發場景,儘可能採用 Nginx 或 Lighttpd ,首選 Nginx。
- 動態業務:理論上採用 Nginx 和 Apache 都可,建議選擇 Nginx,爲了不相同業務服務軟件多樣化,增長額外維護成本。動態業務能夠由 Nginx 兼作前端代理,再根據頁面元素的類型或目錄,轉發到後端相應的服務器進行處理。
- 既有靜態又有動態業務:採用 Nginx。