Nginx基本簡介

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)

相關文章
相關標籤/搜索