nginx快速入門之基本原理篇
阿新 • • 發佈:2019-01-03
Nginx 主要特點
- nginx模組結構:
- Nginx主要是用於Http伺服器,反向代理伺服器,郵件伺服器
- Nginx由多個模組組成,每個請求的完成都是由一個或多個模組共同完成的。
- Nginx 預設採用守護模式啟動,守護模式讓master程序啟動後在後臺執行。在Nginx執行期間主要由一個master主程序和多個worker程序(數目一般與cpu數目相同)
- master主程序主要是管理worker程序,對網路事件進行收集和分發:
- 接收來自外界的訊號
- 向各worker程序傳送訊號
- 監控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程序
參考資源: