1. 程式人生 > >nginx快速入門之基本原理篇

nginx快速入門之基本原理篇

Nginx 主要特點

  • nginx模組結構:

  • Nginx主要是用於Http伺服器,反向代理伺服器,郵件伺服器
  • Nginx由多個模組組成,每個請求的完成都是由一個或多個模組共同完成的。
  • Nginx 預設採用守護模式啟動,守護模式讓master程序啟動後在後臺執行。在Nginx執行期間主要由一個master主程序和多個worker程序(數目一般與cpu數目相同)
    • master主程序主要是管理worker程序,對網路事件進行收集和分發:
  1. 接收來自外界的訊號
  2. 向各worker程序傳送訊號
  3. 監控worker程序的執行狀態,當worker程序退出後(異常情況下),會自動重新啟動新的worker程序
  • nginx用一個獨立的worker程序來處理一個請求,一個worker程序可以處理多個請求:
  • 當一個worker程序在accept這個連線之後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線。
  • 一個請求,完全由worker程序來處理,而且只在一個worker程序中處理。採用這種方式的好處:
    • 節省鎖帶來的開銷。對於每個worker程序來說,獨立的程序,不需要加鎖,所以省掉了鎖帶來的開銷,同時在程式設計以及問題查上時,也會方便很多
    • 獨立程序,減少風險。
    • 採用獨立的程序,可以讓互相之間不會影響,一個程序退出後,其它程序還在工作,服務不會中斷,master程序則很快重新啟動新的worker程序。
    • 在一次請求裡無需程序切換

  • Nginx主要通過加鎖來解決驚群現象
    • 驚群現象:驚群效應就是當一個fd的事件被觸發時,所有等待這個fd的執行緒或程序都被喚醒。一般都是socket的accept()會導致驚群,很多個程序都block在server socket的accept(),一但有客戶端進來,所有程序的accept()都會返回,但是隻有一個程序會讀到資料,就是驚群。
    • Nginx 採用accept-mutex來解決驚群問題:當一個請求到達的時候,只有競爭到鎖的worker程序才會驚醒處理請求,其他程序會繼續等待,結合 timer_solution 配置的最大的超時時間繼續嘗試獲取accept-mutex
  • Nginx的IO通常使用epoll,epoll函式使用了I/O複用模型。與I/O阻塞模型比較,I/O複用模型的優勢在於可以同時等待多個(而不只是一個)套接字描述符就緒。Nginx的epoll工作流程如下:
    • master程序先建好需要listen的socket後,然後再fork出多個woker程序,這樣每個work程序都可以去accept這個socket
    • 當一個client連線到來時,所有accept的work程序都會受到通知,但只有一個程序可以accept成功,其它的則會accept失敗,Nginx提供了一把共享鎖accept_mutex來保證同一時刻只有一個work程序在accept連線,從而解決驚群問題
    • 當一個worker程序accept這個連線後,就開始讀取請求,解析請求,處理請求,產生資料後,再返回給客戶端,最後才斷開連線,這樣一個完成的請求就結束了
  • Nginx最大連線數:
    • worker_processes:worker角色的程序個數
    • worker_connections:每一個worker程序能併發處理(發起)的最大連線數(包含所有連線數)
    • Nginx作為http伺服器的時候:max_clients = worker_processes * worker_connections
    • Nginx作為反向代理伺服器的時候:max_clients = worker_processes * worker_connections/4 (/4原因:因為瀏覽器預設會開啟2個連線到nginx server,而且nginx還會為每個連線使用fds(file descriptor)從連線池建立connection到upstream後端。)
  • Nginx主要通過nginx.conf檔案進行配置使用。在nginx.conf檔案中主要分為:
    • 全域性塊:一些全域性的屬性,在執行時與具體業務功能(比如http服務或者email服務代理)無關的一些引數,比如工作程序數,執行的身份等
    • event塊:參考事件模型,單個程序最大連線數等
    • http塊:設定http伺服器
    • server塊:配置虛擬主機
    • location塊:配置請求路由及頁面的處理情況等

Nginx 常用功能

  • Nginx支援FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。並且支援很多第三方的模組擴充套件。
  • Nginx作為Http代理、反向代理:
    • Nginx通過配置實現靈活的轉發功能:Nginx可以根據不同的正則匹配,採取不同的轉發策略。
    • Nginx可以對返回結果進行錯誤頁跳轉,異常判斷等。
    • 如果被分發的伺服器存在異常,它可以將請求重新轉發給另外一臺伺服器,然後自動去除異常伺服器。

  • Nginx作為負載均衡器:
    • Nginx提供的負載均衡策略有2種:內建策略和擴充套件策略。
    • 內建策略為輪詢,加權輪詢,Ip hash。
    • 擴充套件策略由第三方實現。
    • 輪詢與加權輪詢:

    • Ip hash演算法,對客戶端請求的ip進行hash操作,然後根據hash結果將同一個客戶端ip的請求分發給同一臺伺服器進行處理,可以解決session不共享的問題。

  • Nginx作為Web快取
    • 可以把靜態資源放在Nginx伺服器上(比如前端頁面資源)
    • Nginx可以對不同的檔案做不同的快取處理,配置靈活。
    • 配合著第三方的ngx_cache_purge,對指定的URL快取內容可以的進行增刪管理。

Nginx 基本使用

1、安裝Nginx:(安裝教程網上很多,這裡就不展開了)

2、配置Nginx:修改nginx.conf檔案

3、使用Nginx命令啟動Nginx:

  • sudo nginx 啟動Nginx
  • nginx -s stop 快速關閉Nginx,可能不儲存相關資訊,並迅速終止web服務。
  • nginx -s quit 平穩關閉Nginx,儲存相關資訊,有安排的結束web服務。
  • nginx -s reload 因改變了Nginx相關配置,需要重新載入配置而過載。
  • nginx -s reopen 重新開啟日誌檔案。
  • nginx -c filename 為 Nginx 指定一個配置檔案,來代替預設的。
  • nginx -t 不執行,而僅僅測試配置檔案。Nginx 將檢查配置檔案的語法的正確性,並嘗試開啟配置檔案中所引用到的檔案。
  • nginx -v 顯示 Nginx 的版本。
  • nginx -V 顯示 Nginx 的版本,編譯器版本和配置引數。

-s:把訊號發給Nginx的master程序

參考資源: