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程序
注釋:
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多路複用函數調用處,以等待發生 資料可讀/寫事件。當然也可能被新收到的程序信号中斷。
- 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