1、nginx 介紹
Nginx (engine x) 是一個高性能的 HTTP 和 反向代理 服務,也是一個IMAP/POP3/SMTP服務。因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,並在一個BSD-like 協議下發行。其特點是佔有內存少,併發能力強,事實上nginx的併發能力確實在同類型的網頁服務器中表現較好
在高連接併發的情況下,Nginx是Apache服務器不錯的替代品。
創始人伊戈爾·賽索耶夫
2、爲什麼選擇 nginx
Nginx 是一個高性能的 Web 和反向代理服務器, 它具有有很多非常優越的特性:
單機環境下參考服務器配置。 併發連接數在7000+ -8000左右。 集羣模式20000+
作爲 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的併發連接,體現更高的效率,這點使 Nginx 尤其受到虛擬主機提供商的歡迎。能夠支持高達 50,000 個併發連接數的響應。
作爲負載均衡服務器:Nginx 既可以在內部直接支持 Rails 和 PHP,也可以支持作爲 HTTP代理服務器 對外進行服務。Nginx 用 C 編寫, 不論是系統資源開銷還是 CPU 使用效率都比 Perlbal 要好的多。
作爲郵件代理服務器: Nginx 同時也是一個非常優秀的郵件代理服務器(最早開發這個產品的目的之一也是作爲郵件代理服務器),Last.fm 描述了成功並且美妙的使用經驗。
Nginx 安裝非常的簡單,配置文件 非常簡潔(還能夠支持perl語法),Bugs非常少的服務器: Nginx 啓動特別容易,並且幾乎可以做到7*24不間斷運行,即使運行數個月也不需要重新啓動。你還能夠在 不間斷服務的情況下進行軟件版本的升級。
3、IO多路複用
1、I/O multiplexing【多併發】
第一種方法就是最傳統的多進程併發模型 (每進來一個新的I/O流會分配一個新的進程管理。)
第二種方法就是I/O多路複用 (單個線程,通過記錄跟蹤每個I/O流(sock)的狀態,來同時管理多個I/O流 。)
I/O multiplexing 這裏面的 multiplexing 指的其實是在單個線程通過記錄跟蹤每一個Sock(I/O流)的狀態來同
時管理多個I/O流。發明它的原因,是儘量多的提高服務器的吞吐能力。
在同一個線程裏面, 通過撥開關的方式,來同時傳輸多個I/O流。
2、一個請求到來了,nginx使用epoll接收請求的過程是怎樣的?
ngnix會有很多連接進來, epoll會把他們都監視起來,然後像撥開關一樣,誰有數據就撥向誰,然後調用相
應的代碼處理。
- epoll.
epoll 可以說是I/O 多路複用最新的一個實現,epoll 修復了poll 和select絕大部分問題, 比如:
• epoll 線程是安全的。
• epoll 告訴你具體哪個sock有數據,你不用自己去找了。
3、異步,非阻塞
$ pstree |grep nginx
|-+= 81666 root nginx: master process nginx
| |--- 82500 nobody nginx: worker process
| \--- 82501 nobody nginx: worker process
1個master進程,2個work進程
每進來一個request,會有一個worker進程去處理。但不是全程的處理,處理到什麼程度呢?處理到可能發生阻塞的地方,比如向上遊(後端)服務器轉發request,並等待請求返回。那麼,這個處理的worker不會這麼一直等着,他會在發送完請求後,註冊一個事件:“如果upstream返回了,告訴我一聲,我再接着幹”。於是他就休息去了。這就是異步。此時,如果再有request 進來,他就可以很快再按這種方式處理。這就是非阻塞和IO多路複用。而一旦上游服務器返回了,就會觸發這個事件,worker纔會來接手,這個request纔會接着往下走。這就是異步回調。