nginx快速入門之基本原理篇
01-29
Nginx 主要特點
- nginx模塊結構:
- Nginx主要是用於Http伺服器,反向代理伺服器,郵件伺服器
- Nginx由多個模塊組成,每個請求的完成都是由一個或多個模塊共同完成的。
- Nginx 默認採用守護模式啟動,守護模式讓master進程啟動後在後台運行。在Nginx運行期間主要由一個master主進程和多個worker進程(數目一般與cpu數目相同)
- master主進程主要是管理worker進程,對網路事件進行收集和分發:
- 接收來自外界的信號
- 向各worker進程發送信號
- 監控worker進程的運行狀態,當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 之實現原理:http://www.jianshu.com/p/b77482d4b670
- 什麼是驚群,如何有效避免驚群?:https://www.zhihu.com/question/22756773
- nginx最大並發連接數的思考:worker_processes、worker_connections、worker_rlimit_nofile:http://blog.csdn.net/sole_cc/article/details/52433353
- Nginx配置詳解:http://www.cnblogs.com/knowledgesea/p/5175711.html
(本文首發於公眾號:EnjoyMoving)
推薦閱讀:
※如何 windows下nginx+django+flup python3?
※把nginx改為一個普通的tcp伺服器,應用層協議自己定義,有可行性嗎?
※準確地配置 NginX (1)
※Node.js 中遇到含空格 URL 的神奇「Bug」——小範圍深入 HTTP 協議
※如何配置nginx+uwsgi+django?