天天看點

nginx基礎,main子產品,event子產品---第一篇

1.nginx應用

nginx (engine x)是一個可以作為HTTP WEB伺服器、反向代理伺服器、郵件代理伺服器和一個通用的TCP / UDP代理伺服器(1.9.0版本後)的多功能架構元件,同時也可以提供一定的緩存服務功能。
1、WEB伺服器:這是應用比較多的場景,配置虛拟主機提供HTTP WEB服務。可以先通過動态/靜态内容分離,而後為靜态内容(html/css/js/圖檔等)提供HTTP通路功能;而動态内容可以整合代理子產品,代理給上遊伺服器,來支援對外部程式的直接調用或者解析,如FastCGI支援PHP。
2、反向代理伺服器:這是應用非常多的場景,為後端伺服器代理。接收用戶端請求,根據負載均衡政策轉發給後端多個上遊伺服器處理;然後再等待後端伺服器傳回請求響應,接收到後再傳回給請求的用戶端。

2.nginx.conf詳解

子產品說明:

配置區域 說明
main塊 配置影響nginx全局的指令。一般有運作nginx伺服器的使用者組,nginx程序pid存放路徑,日志存放路徑,配置檔案引入,允許生成worker process數等。
events塊 配置影響nginx伺服器或與使用者的網絡連接配接。有每個程序的最大連接配接數,選取哪種事件驅動模型處理連接配接請求,是否允許同時接受多個網路連接配接,開啟多個網絡連接配接序列化等。
http塊 可以嵌套多個server,配置代理,緩存,日志定義等絕大多數功能和第三方子產品的配置。如檔案引入,mime-type定義,日志自定義,是否使用sendfile傳輸檔案,連接配接逾時時間,單連接配接請求數等。
upstream塊 配置HTTP負載均衡器配置設定流量到幾個應用程式伺服器。
server塊 配置虛拟主機的相關參數,一個http中可以有多個server。
location塊 配置請求的路由,以及允許根據使用者請求的URI來比對指定的各location以進行通路配置;比對到時,将被location塊中的配置所處理。

main塊

#nginx的使用者組 和使用者
user www-data;
#nginx 程序數 ,建議預設為cpu的總核心數
 worker_processes auto;   #auto預設為伺服器的核心數
#pid 表示nginx的程序号
pid /run/nginx.pid;
#全局錯誤日志定義類型,[ debug | info | notice | warn | error | crit ]
error_log /usr/local/nginx/logs/error.log info
           

1.配置完成這些資訊後,通過cat /run/nginx.pid 檢視nginx的pid

2.在伺服器上輸入: ps -ef | grep nginx 進行檢視nginx程序

nginx基礎,main子產品,event子產品---第一篇

注釋:

www-data 使用者 是通過user 屬性設定的

因為我的cpu核心數為4核的, worker_processes設定為auto ,是以顯示的worker程序數為4個

processes 詳解

一個master程序生成多個worker子程序(每個程序隻有一個線程),一個worker響應多個使用者請求。如果單程序啟動:僅有一個程序,既充當master程序的角色,也充當worker程序的角色

1.master process

1.充當整個程序組與使用者的互動接口(接收來自外界的信号,向各worker程序發送信号),同時監控worker程序的運作狀态。
它不需要處理網絡事件,不負責業務的執行,隻會通過管理worker程序來實作重新開機服務、平滑更新、
  更換日志檔案、配置檔案實時生效等功能。
           
2.在master程序裡面,先建立socket,并bind、listen在80端口(是以master程序需要root權限);

2.worker process

主要任務是處理基本的網絡事件,完成具體的任務邏輯。多個worker程序之間是對等的,互相獨立的
worker程序主要關注點是與用戶端或後端伺服器(此時nginx作為中間代理)之間的資料可讀/可寫等I/O交
 互事件,是以工作程序的阻塞點是在像select()、epoll_wait()等這樣的I/O多路複用函數調用處,以等待發生
 資料可讀/寫事件。當然也可能被新收到的程序信号中斷。
           
  1. worker process 程序數設定
如果負載以CPU密集型應用為主,一般會設定與機器cpu核數一緻或少一個(用來處理使用者等其他任務);
如果負載以IO密集型為主,如響應大量内容給用戶端,則worker數應該為CPU個數的1.5或2倍。
因為更多的worker數,隻會導緻程序來競争cpu資源了,進而帶來不必要的上下文切換。而且,nginx為了更好的利用多核特性,具有cpu綁定選項,我們可以将某一個程序綁定在某一個核上,這樣就不會因為程序的切換帶來cache的失效。
更具體的可以根據公式:Nthread = NcpuUcpu(1+W/C),Ncpu是cpu的個數,Ucpu是cpu的使用率,W為等待時間,C為計算時間。這時需要通過監控工具來擷取相應資料來計算。
最後,再以監控工具資料為準進行微調。(監控工具可以用 Nginx-rrd )

4.并發處理

A、在master程序裡面,先建立socket,并bind、listen在80端口(是以master程序需要root權限);
B、然後再fork出多個worker程序,這樣每個worker程序都可以去accept這個socket(會産生驚群問題), 或者使用鎖機制,讓搶到鎖的一個worker程序去accept這個socket,注意這裡一般使用select/poll/epoll機制來解決accept阻塞問題;
C、當一個新連接配接進來後,而隻有搶到鎖的一個程序可以accept這個連接配接進行處理(也是放入epoll中);
D、搶到鎖的worker程序accept到新連接配接後,會立即釋放鎖;然後所有worker程序再次參與搶鎖,這樣就回到了第二步,進行循環處理并發連接配接;

event 子產品

events
{
    #參考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型
    #是Linux 2.6以上版本核心中的高性能網絡I/O模型,linux建議epoll,如果跑在FreeBSD上面,就用kqueue模型。
    #補充說明:
    #與apache相類,nginx針對不同的作業系統,有不同的事件模型
    #A)标準事件模型
    #Select、poll屬于标準事件模型,如果目前系統不存在更有效的方法,nginx會選擇select或poll
    #B)高效事件模型
    #Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用雙處理器的MacOS X系統使用kqueue可能會造
    成核心崩潰。
    #Epoll:使用于Linux核心2.6版本及以後的系統。
    #/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。
    #Eventport:使用于Solaris 10。 為了防止出現核心崩潰的問題, 有必要安裝安全更新檔。
    use epoll;

    #單個程序最大連接配接數(最大連接配接數=連接配接數*程序數)
    #根據硬體調整,和前面工作程序配合起來用,盡量大,但是别把cpu跑到100%就行。每個程序允許的最多連接配接數,理論上每台
    nginx伺服器的最大連接配接數為。
    worker_connections 65535;

    #keepalive逾時時間。
    keepalive_timeout 60;

    #用戶端請求頭部的緩沖區大小。這個可以根據你的系統分頁大小來設定,一般一個請求頭的大小不會超過1k,不過由于一般系統分
    頁都要大于1k,是以這裡設定為分頁大小。
    #分頁大小可以用指令getconf PAGESIZE 取得。
    #[[email protected] ~]# getconf PAGESIZE
    #4096
    #但也有client_header_buffer_size超過4k的情況,但是client_header_buffer_size該值必須設定為“系統分頁大小”的整倍數。
    client_header_buffer_size 4k;

    #這個将為打開檔案指定緩存,預設是沒有啟用的,max指定緩存數量,建議和打開檔案數一緻,inactive是指經過多長時間檔案沒
    被請求後删除緩存。
    open_file_cache max=65535 inactive=60s;

    #這個是指多長時間檢查一次緩存的有效資訊。
    #文法:open_file_cache_valid time 預設值:open_file_cache_valid 60 使用字段:http, server, location 這個指令
    指定了何時需要檢查
    open_file_cache中緩存項目的有效資訊.
    open_file_cache_valid 80s;

    #open_file_cache指令中的inactive參數時間内檔案的最少使用次數,如果超過這個數字,檔案描述符一直是在緩存中打開的,如上
    例,如果有一個檔案在inactive時間内一次沒被使用,它将被移除。
    #文法:open_file_cache_min_uses number 預設值:open_file_cache_min_uses 1 使用字段:http, server, location  這個指令指定了在
    open_file_cache指令無效的參數中一定的時間範圍内可以使用的最小檔案數,如果使用更大的值,檔案描述符在cache中總是打開狀
    态.
    open_file_cache_min_uses 1;
    
    #文法:open_file_cache_errors on | off 預設值:open_file_cache_errors off 使用字段:http, server, location 
    這個指令指定是否在搜尋一個檔案是記錄cache錯誤.
    open_file_cache_errors on;
}
 
           

核心子產品的介紹和用法可以參考

http://nginx.org/en/docs/ngx_core_module.html

繼續閱讀