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進程


    參考資源:

    • Nginx 之實現原理:jianshu.com/p/b77482d4b
    • 什麼是驚群,如何有效避免驚群?:zhihu.com/question/2275
    • nginx最大並發連接數的思考:worker_processes、worker_connections、worker_rlimit_nofile:blog.csdn.net/sole_cc/a
    • Nginx配置詳解:cnblogs.com/knowledgese

    (本文首發於公眾號:EnjoyMoving)

    推薦閱讀:

    如何 windows下nginx+django+flup python3?
    把nginx改為一個普通的tcp伺服器,應用層協議自己定義,有可行性嗎?
    準確地配置 NginX (1)
    Node.js 中遇到含空格 URL 的神奇「Bug」——小範圍深入 HTTP 協議
    如何配置nginx+uwsgi+django?

    TAG:Nginx | 反向代理 | 负载均衡 |