Nginx記錄-Nginx介紹

Nginx 是一個高性能的 Web 和反向代理服務器, 它具備有不少很是優越的特性:nginx

做爲 Web 服務器:相比 Apache,Nginx 使用更少的資源,支持更多的併發鏈接,體現更高的效率,這點使 Nginx 尤爲受到虛擬主機提供商的歡迎。可以支持高達 50,000 個併發鏈接數的響應,感謝 Nginx 爲咱們選擇了 epoll and kqueue 做爲開發模型.數據庫

做爲負載均衡服務器:Nginx 既能夠在內部直接支持 Rails 和 PHP,也能夠支持做爲 HTTP代理服務器 對外進行服務。Nginx 用 C 編寫, 不管是系統資源開銷仍是 CPU 使用效率都比 Perlbal 要好的多。緩存

做爲郵件代理服務器: Nginx 同時也是一個很是優秀的郵件代理服務器(最先開發這個產品的目的之一也是做爲郵件代理服務器),Last.fm 描述了成功而且美妙的使用經驗。安全

Nginx 安裝很是的簡單,配置文件 很是簡潔(還可以支持perl語法),Bugs很是少的服務器: Nginx 啓動特別容易,而且幾乎能夠作到7*24不間斷運行,即便運行數個月也不須要從新啓動。你還可以在 不間斷服務的狀況下進行軟件版本的升級。服務器

代碼結構

nginx工做(worker)碼包括核心和功能模塊。 nginx的核心是負責維護嚴格的運行循環,並在請求處理的每一個階段執行模塊代碼的適當部分。 模塊構成了大部分的演示和應用層功能。 模塊讀取和寫入網絡和存儲,轉換內容,執行出站過濾,應用服務器端包含操做,並在代理啓動時將請求傳遞給上游服務器。網絡

nginx的模塊化架構一般容許開發人員擴展一組Web服務器功能,而無需修改nginx內核。 nginx模塊略有不一樣,即核心模塊,事件模塊,階段處理程序,協議,可變處理程序,過濾器,上游和負載平衡器。nginx不支持動態加載的模塊; 即在構建階段將模塊與核心一塊兒編譯。架構

在處理與接受,處理和管理網絡鏈接和內容檢索相關的各類操做時,nginx在基於Linux,Solaris和BSD的操做系統中使用事件通知機制和一些磁盤I/O性能加強,如:kqueue,epoll, 和事件端口。 目標是爲操做系統提供儘量多的提示,以便及時獲取入站和出站流量,磁盤操做,讀取或寫入套接字,超時等異步反饋。 對於每一個基於Unix的nginx運行的操做系統,大量優化了複用和高級I/O操做的不一樣方法的使用。併發

nginx架構的高級概述以下圖所示 -負載均衡

工做模式

如前所述,nginx不會爲每一個鏈接生成一個進程或線程。 相反,工做(worker)進程接受來自共享「listen」套接字的新請求,並在每一個工做(worker)內執行高效的運行循環,以處理每一個工做(worker)中的數千個鏈接。 沒有專門的仲裁或分配與nginx工做(worker)的聯繫; 這個工做(worker)是由操做系統內核機制完成的。 啓動後,將建立一組初始偵聽套接字。 而後,工做(worker)在處理HTTP請求和響應時不斷接受,讀取和寫入套接字。異步

運行循環是nginx工做(worker)代碼中最複雜的部分。 它包括全面的內部調用,而且在很大程度上依賴異步任務處理的想法。 異步操做經過模塊化,事件通知,普遍使用回調函數和微調定時器來實現。 整體而言,關鍵原則是儘量不阻塞。 nginx仍然能夠阻塞的惟一狀況是工做(worker)進程沒有足夠的磁盤存儲。

因爲nginx不會鏈接一個進程或線程,因此在絕大多數狀況下,內存使用很是保守,很是有效。 nginx也節省CPU週期,由於進程或線程沒有持續的建立 - 銷燬模式。 nginx的做用是檢查網絡和存儲的狀態,初始化新鏈接,將其添加到運行循環中,並異步處理直到完成,此時鏈接被從新分配並從運行循環中刪除。 結合仔細使用系統調用(syscall)和精確實現支持接口(如poolslab內存分配器),nginx一般能夠在極端工做負載下實現中到低的CPU使用。

在一些磁盤使用和CPU負載模式,應調整nginx工做(worker)的數量。 在這裏說一點基礎規則:系統管理員應該爲其工做負載嘗試幾個配置。 通常建議可能以下:若是負載模式是CPU密集型的,例如,處理大量TCP/IP,執行SSL或壓縮,則nginx工做(worker)的數量應與CPU內核數量相匹配; 若是負載大可能是磁盤I/O綁定,例如,從存儲或重代理服務不一樣的內容集合 - 工做(worker)的數量多是核心數量的一到兩倍。有些工程師會根據我的存儲單元的數量選擇工做(worker)的數量,但這種方法的效率取決於磁盤存儲的類型和配置。

nginx的開發人員將在即將推出的版本中解決的一個主要問題是如何避免磁盤I/O上的大多數阻塞。 目前,若是沒有足夠的存儲性能來提供特定工做(worker)生成的磁盤操做,該工做(worker)可能仍然阻止從磁盤讀取/寫入。 存在許多機制和配置文件指令來減輕此類磁盤I/O阻塞狀況。要注意的是,諸如:sendfile和AIO之類的選項的組合一般會爲磁盤性能帶來很大的餘量。 應該根據數據集,可用於nginx的內存量和底層存儲架構來規劃安裝一個nginx服務器。

現有工做(worker)模式的另外一個問題是與嵌入式腳本的有限支持有關。 一個使用標準的nginx分發,只支持嵌入Perl腳本。一個簡單的解釋:關鍵問題是嵌入式腳本阻止任何操做或意外退出的可能性。 這兩種類型的行爲將當即致使工做(worker)掛起的狀況,同時影響到數千個鏈接。 更多的工做(worker)計劃是使nginx的嵌入式腳本更簡單,更可靠,適用於更普遍的應用。

nginx進程角色

nginx在內存中運行多個進程; 有一個主進程和幾個工做(worker)進程。 還有一些特殊用途的過程,特別是緩存加載器和緩存管理器。 全部進程都是單線程版本爲1.x的nginx。 全部進程主要使用共享內存機制進行進程間通訊。主進程做爲root用戶運行。 緩存加載器,緩存管理器和工做(worker)則以無權限用戶運行。

主程序負責如下任務:

  • 讀取和驗證配置
  • 建立,綁定和關閉套接字
  • 啓動,終止和維護配置的工做(worker)進程數
  • 從新配置,無需中斷服務
  • 控制不間斷的二進制升級(若是須要,啓動新的二進制並回滾)
  • 從新打開日誌文件
  • 編譯嵌入式Perl腳本

工做(worker)進程接受,處理和處理來自客戶端的鏈接,提供反向代理和過濾功能,並執行幾乎全部其餘的nginx能力。 關於監視nginx實例的行爲,系統管理員應該關注工做(worker)進程,由於它們是反映Web服務器實際平常操做的過程。

緩存加載器進程負責檢查磁盤緩存項目,並使用緩存元數據填充nginx的內存數據庫。 本質上,緩存加載器準備nginx實例來處理已經存儲在磁盤上的特定分配的目錄結構中的文件。 它遍歷目錄,檢查緩存內容元數據,更新共享內存中的相關條目,而後在全部內容清潔並準備使用時退出。
緩存管理器主要負責緩存到期和無效。 在正常的nginx操做期間它保持在內存中,而且在失敗的狀況下由主進程從新啓動。

nginx緩存簡介

在nginx中的緩存以文件系統上的分層數據存儲的形式實現。 緩存密鑰是可配置的,而且可使用不一樣的請求特定參數來控制進入緩存的內容。 緩存密鑰和緩存元數據存儲在共享存儲器段中,高速緩存加載器,緩存管理器和工做(worker)能夠訪問它們。 目前,除了操做系統的虛擬文件系統機制暗示的優化以外,沒有任何內存中的文件緩存。 每一個緩存的響應都放在文件系統上的不一樣文件中。 層次結構(級別和命名細節)經過nginx配置指令進行控制。 當響應寫入緩存目錄結構時,文件的路徑和名稱將從代理URL的MD5哈希導出。

將內容放置在緩存中的過程以下:當nginx從上游服務器讀取響應時,內容首先寫入緩存目錄結構以外的臨時文件。 當nginx完成處理請求時,它重命名臨時文件並將其移動到緩存目錄。 若是用於代理的臨時文件目錄位於另外一個文件系統上,則該文件將被複制,所以建議將臨時文件目錄和緩存目錄保存在同一文件系統上。 當須要顯式清除緩存目錄結構時,從文件中刪除文件也是很是安全的。 nginx有第三方擴展,能夠遠程控制緩存的內容,還有更多的工做計劃將此功能集成到主分發中。

相關文章
相關標籤/搜索