1. 程式人生 > >Nginx伺服器及其配置

Nginx伺服器及其配置

  Nginx(engine x)是一個高效能HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。

一、nginx工作原理

  Nginx由核心和模組兩部分構成,核心的工作非常簡單,就是通過配置檔案將請求對映到一個location block,在location中配置的指令會啟動不同的模組去完成相應的工作。模組包括HTTP等核心模組、基礎模組和第三方模組。使用者可以根據自己的需求開發模組,直接編譯進nginx。啟動nginx後,模組被自動載入。在解析配置檔案時,每個模組都有可能去處理請求,但是同一請求只能由一個模組來完成。

  Nginx使用一個多程序模型來提供服務。啟動時,系統會自動建立一個master程序和多個worker程序,數量與nginx的配置有關,一般會設定與及其CPU核數一致。Master程序主要用來管理worker程序,以及負責nginx的配置解析、模組註冊、訊號管理等。Worker程序負責接收和處理客戶端請求。

  Nginx採用非同步非阻塞的方式來處理請求,可以同時處理成千上萬個請求。這種機制可以同時監控多個請求,worker程序在處理時會有I/O呼叫,如果不能立即得到響應,程序會轉去處理其他客戶端請求,I/O呼叫有結果時會利用事件驅動模型通知worker程序,程序得到通知會暫停工作,來處理I/O呼叫的結果。

二、Nginx伺服器的優點

  首先,nginx的安裝簡單,配置檔案簡潔,測試比較方便,日誌系統完善且清晰,方便開發者進行除錯。

  作為web伺服器,nginx佔用的記憶體少,在實際環境下處理能力高且CPU負載並不高。Nginx比較低的記憶體消耗也為多併發連線提供了基礎。理論上,nginx支援的併發連線上限取決於機器的記憶體,實際測試可以支援高達30000以上的併發連線數。

  Nginx還支援熱部署。由於master程序與worker程序的分離設計,可以在7×24小時不間斷服務的前提下,進行nginx可執行檔案的升級;也可以不停止服務時進行配置檔案的修改等功能。

  Nginx還作為負載均衡伺服器和郵件代理伺服器,在效能和CPU的使用效率方面較其他伺服器都有優勢。且使用nginx成本較低,做反向代理時可以實現負載均衡,這樣節省硬體的負載均衡交換機的運營和維護成本。

三、nginx_rtmp模組

  RTMP(Real Time Messaging Protocol)是一個實時訊息傳送協議,利用這一協議的第三方模組nginx_rtmp_module可以用來實現音視訊的直播和點播。模組的輸入可以是檔案或者HTTP流,支援push和pull兩種流的分發模式。利用FFMPEG的相關功能可以線上轉碼,並且支援HLS和MPEG-DASH的傳輸。

四、伺服器的配置

  首先要進行伺服器的安裝,包括其所依賴的第三方庫,並新增所需的各類模組。安裝編譯完成後,使用者可以通過對配置檔案的修改來控制伺服器的工作。

  Nginx配置檔案主要有四個部分,全域性設定(main)、主機設定(server)、上游伺服器設定(upstream)和URL匹配位置的設定(location),而且每個部分都有若干指令。

  在配置檔案的全域性設定部分,worker_processes引數設定worker程序的工作程序個數,並對master程序分配給的請求進行處理。這個數值一般簡單地設定為CPU的核數,若開啟了SSL或者gzip,則應該設定為與邏輯CPU數量一致或者2倍。在目前本系統中,只有一個客戶端進行請求操作,可以簡單地設定為1。Events部分通過worker_connections引數設定每個worker程序可以併發處理的最大連線數。

  HTTP伺服器部分配置伺服器是否開啟高效檔案傳輸模式以及長連線的超時時間等。其中,include指令設定MIME(Multipurpose Internet Mail Extension)多使用者的網際郵件擴充協議的型別,通過mime.types檔案指定;client_max_body_size引數規定允許客戶端請求的最大單檔案位元組數;通過sendfile指令來指定是否要呼叫此函式來輸出檔案,減少使用者空間到核心空間的上下文傳輸;通過keepalive_timeout引數來指定超時時間,如果設定時間過長且使用者較多的情況下,長時間連線會佔用大量的資源。在這部分中,http_gzip模組用來開啟gzip壓縮輸出,用來減輕伺服器的頻寬問題,編譯時要為nginx新增這一模組。除了gzip模組,http_proxy模組實現nginx作為反向代理伺服器的功能,在此論文中不進行討論。

  Nginx的日誌包括access log和error log兩種。Error log記錄伺服器的錯誤日誌,而access log記錄了哪些使用者在何時對伺服器進行了訪問,請求何種內容等資訊。在延時分析中可能會用到這些日誌資訊,所以需要在http部分利用log_format指令設定日誌條目,如下:

這裡寫圖片描述

  HTTP服務中支援若干個虛擬主機,每個主機對應一個server配置內容。其中,listen引數設定server的監聽埠,預設是80;server_name指定伺服器名,可以是localhost或者IP地址的格式等;access_log指令指定伺服器產生的日誌儲存地址。

  Location部分採用通用規則進行配置,“/”表明任何請求都會匹配到。其中root定義伺服器的預設網站根目錄的位置,即本工程中產生的DASH切片的儲存位置;index設定首頁索引檔案的名稱。同時,error_page定義錯誤提示頁面,方便對伺服器是否正常配置進行檢測。