Nginx模塊結構
Nginx主要是用於Http服務器,反向代理服務器,郵件服務器前端
Nginx由多個模塊組成,每一個請求的完成都是由一個或多個模塊共同完成的。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代理、反向代理:session
- Nginx經過配置實現靈活的轉發功能:Nginx能夠根據不一樣的正則匹配,採起不一樣的轉發策略。
- Nginx能夠對返回結果進行錯誤頁跳轉,異常判斷等。
- 若是被分發的服務器存在異常,它能夠將請求從新轉發給另一臺服務器,而後自動去除異常服務器。
Nginx做爲負載均衡器:
- Nginx提供的負載均衡策略有2種:內置策略和擴展策略。
- 內置策略爲輪詢,加權輪詢,Ip hash。
- 擴展策略由第三方實現。
- 輪詢與加權輪詢:
- Ip hash算法,對客戶端請求的ip進行hash操做,而後根據hash結果將同一個客戶端ip的請求分發給同一臺服務器進行處理,能夠解決session不共享的問題。
Nginx做爲Web緩存
- 能夠把靜態資源放在Nginx服務器上(好比前端頁面資源)
- Nginx能夠對不一樣的文件作不一樣的緩存處理,配置靈活。
- 配合着第三方的ngx_cache_purge,對指定的URL緩存內容能夠的進行增刪管理。
Nginx社區分支
Openresty:做者agentzh(章宜春),最大特色是引入ngx_lua模塊,支持使用lua開發插件,而且集合了不少豐富的模塊以及lua庫.
Tengine:主要是淘寶團隊開發,特色是融入了淘寶自身業務帶來的新功能,支持使用lua擴展功能
Nginx:官方版本,更新速度比較快,而且提供免費版(nginx)和商業版本(nginx plus)