生活随笔
收集整理的這篇文章主要介紹了
深入理解Nginx-模块开发与架构解析(第2版)第二章
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Nginx的配置
運行中Nginx進程間的關系
# 為什么產品環境下安裝master-worker方式配置同時啟動多個進程?
- master進程不會對用戶提供服務,只用于管理真正提供服務的worker進程,所以master進程可以是唯一的,為管理員 提供命令行服務,如啟停、重載配置文件、平滑升級程序等。
master擁有的權限相對worker要大,當任意一個worker進程出現錯誤,master進程會立刻啟動新的worker進程繼續服務。
- 多個worker進程處理請求不但可以提供服務的健壯性,還可以充分利用常見的SMP多核架構,實現微觀上真正的多核并發處理。
用一個master處理請求肯定是不合適的,將worker進程數量設置與CPU核數一致,真是Nginx與Apache服務器不同之處。
在Apache上每個進程在一個時刻只處理一個請求,因此,如果希望web服務器擁有并發處理的請求數更多,就要把Apache進程或線程數設置得更多,這樣大量進程切換會無謂的消耗系統資源。
而Ngnix一個worker進程可以同時處理的請求數只受限于內存大小,而且在架構設計上,不同的worker進程之間處理并發請求時幾乎沒有同步鎖的限制。,worker進程通常不會進入睡眠狀態。因此,Nginx上的進程數與CPU核心數相等時,進程間切換的代價是最小的。
1.Nginx配置通用語法
# 塊配置項:由一個塊配置項名和一對大括號組成。
server {
...
}
# 配置項的語法格式
配置項名 配置項值1 配置項值2 ...;
access_log logs/access.log main buffer=32k;
說明:
1.行首是配置項名,配置項名必須是Nginx的某一個模塊想要處理的,否則視為非法配置項名。
2.配置項名輸入后,將以空格作為分隔符。
3.配置項值可以是數字,字符串或正則表達式。
4.一個配置項可以有一個或多個配置項值,一個配置項的配置項值有多少個取決于解析這個配置項的模塊。
5.配置項值之間也是使用空格作為分隔符。
6.每行配置的結尾需要加上分號。
7.如果配置項值中包括語法符號,比如空格需要使用單引號或雙引號包裹,否則Nginx會報語法錯誤。
2.配置項注釋
# 使用#注釋某一行配置
#pid logs/nginx.pid;
3.配置項的單位
# 大部分模塊遵循一些通用規定,如指定空間大小不用每次都精確到字節;指定時間不用精確到毫秒。
- 當指定空間大小時,可使用單位:
- K或k千字節(KB)
- M或m兆字節(MB)
- 當指定時間時,可使用單位:
- ms(毫秒)
- s(秒)
- m(分鐘)
- h(小時)
- d(天)
- w(周,包含7天)
- M(月,包含30天)
- y(年,包含365天)
4.在配置中使用變量
log_format main '$remote_addr - $remote_user [$time_local] "$request"'
# 如remote_addr是一個變量,使用時需要加上$符合。這種變量只有少數模塊支持,并非通用。
Nginx服務的基本配置
Nginx運行時,至少必須加載幾個核心模塊和一個事件類模塊。
這些模塊運行時所支持的配置項稱為基本配置——所有其他模塊執行時都依賴的配置項。
基本配置項分為:
- 調試、定位問題配置項
- 正常運行的必備配置項
- 優化性能的配置項
- 事件類配置項(有些事件類配置項歸到優化性能配置項)
1.用于調試進程和定位問題的配置項
序號
分類
語法
默認
說明
序號
分類
語法
默認
說明
1
是否以守護進程方式運行Nginx
daemon on/off;
daemon on;
守護進程(daemon)是脫離終端并在后臺運行的進程。脫離終端是為了避免執行過程中信息在終端上顯示,同時也避免進程被終端輸入中斷。
2
是否以master/worker方式工作
master_process on/off;
master_process on;
提供該方式方便跟蹤調試Nginx。如果不使用該方式,在worker異常時無法fork出worker子進程來處理請求。
3
error日志的設置
error_log /path/file level;
error_log logs/error.log error;
錯誤日志是定位Nginx問題的最佳工具。level是日志級別,取值:debug,info,notice,warn,error,crit,alert,emerg。從左至右依次增大
4
是否處理幾個特殊的調試點
debug_points [stop/abort]
/
用于幫助用戶跟蹤調試Nginx。設置stop時,Nginx執行到這些調試點時就會發出SIGSTOP信息用以調試;設置abort時,會產生一個coredump文件,可使用gdp來查看。通常不使用該配置項。
5
僅對指定客戶端輸出debug級別日志
debug_connection [IP/CIDR
/
該配置實際屬于事件類配置,因此需寫到events塊events
6
限制coredump核心轉儲文件的大小
worker_rlimit_core size;
/
在Linux系統中,當進程發生錯誤或收到信號終止,系統會將進程執行時的內存內容(核心鏡像)寫入一個文件(core文件),用作調試,這就是所謂的核心轉儲(core dumps)。當Nginx進程出現一些非法操作(如內存越界)導致進程直接被操作系統結束時,會生成核心轉儲core文件,可從core文件獲取當時的堆棧、寄存器等信息,幫助定位問題。若不對文件大小進行限制可能達到幾GB,這樣隨便幾次coredumps就會把磁盤占滿。
7
指定coredump文件生成目錄
working_directory_ path;
/
worker進程的工作目錄,這個配置唯一用途就是coredump文件所放置的目錄,協助定位問題。需確保worker進程有權限向working_directory指定的目錄中寫入文件。
如果日志設置debug級別或使用debug_connection,在configure時加入--with-debug
2.正常運行的配置項
序號
分類
語法
默認
說明
序號
分類
語法
默認
說明
1
定義環境變量
env VAR/VAR=VALUE;
/
該配置項可以讓用戶之間設置操作系統上的環境變量。eg:env TESTPATH=/tmp/
2
嵌入其他配置文件
include /path/file
/
該配置項可以將其他配置文件嵌入到當前nginx.conf文件中,它的參數可以是相對路徑(相對于Nginx的配置目錄,即nginx.conf所在目錄),也可以是絕對路徑。eg:includ mime.types; include vhost/星.conf;庫看到參數值可以是一個明確文件,也可以是含有通配符“*”的文件名,同時一次嵌入多個配置文件
3
pid文件路徑
pid path/file;
pid logs/nginx.pid;
保存master進程ID的pid文件存放路徑。默認與configure執行時的參數“--pid-path”所指定的路徑是相同的,可隨時修改,確保Nginx有權限在相應目標中創建pid文件,該文件直接影響Nginx是否可以運行。
4
Nginx worker進程運行的用戶及用戶組
user username[groupname];
user nobody nobody;
user用于設置master進程啟動后,fork出的worker進程運行在哪個用戶和用戶組下。當按照“user username;”設置,用戶組名與用戶名相同。若用戶在configure參數執行時使用--user=username和--group=groupname時,nginx.conf將使用參數中指定的用戶和用戶組。
5
指定Nginx worker進程可以打開的最大文件句柄描述符個數
worker_rlimit_nofile limit;
/
設置一個worker進程可以打開的最大文件句柄數。
6
限制信號隊列
worker_rlimit_sigpending limit;
/
設置每個用戶發往Nginx的信號隊列的大小。即,當某個用戶的信號隊列滿了,這個用戶再發送信號量會被丟掉。
3.優化性能的配置項
序號
分類
語法
默認
說明
序號
分類
語法
默認
說明
1
Nginx worker進程個數
worker_processes number;
worker_processes 1;
master/worker運行方式下,定義worker進程個數。worker進程數量會直接影響性能,配置多少個worker進程與業務需求有關。每個worker都是單線程的進程。它們會調用各個模塊以實現多種多樣的功能。如果這些模塊確認不會出現阻塞式調用,有多少CPU內核就應該配置多少個進程。反之,應配置稍多一些的worker進程。如:業務方面致使用戶讀取本地磁盤上的靜態資源文件,而且服務器上的內存較小,以至于大部分的請求訪問靜態資源時都必須讀取磁盤(磁頭尋址是緩慢的),而不是內存中的磁盤緩存,那么磁盤I/O調用可能會阻塞worker進程少量時間,進而導致服務整體性能下降。多worker進程可以重發利用多核系統架構,但若worker進程數多于CPU內核數,會增大進程間切換帶來的消耗(Linux是搶占式內核)一般情況下,用戶應配置CPU核數相同的worker進程數,并綁定CPU內核
2
綁定Nginx worker進程到指定的CPU內核
worker_cpu_affinity cpumask [cpumask...]
/
為什么要綁定?假設每一個worker進程都是非常繁忙,如果每一個worker都在搶同一個CPU,那么會出現同步問題。反之,每一個worker獨享一個CPU,就在內核的調度上實現完全的并發。eg:有4顆CPU內核,就可以進行如下配置:worker_processes 4; worker_cpu_addinity 1000 0100 0010 0001;該配置僅對Linux操作系統有效,它使用sched_sctaffinity()系統調用實現這個功能。
3
SSL硬件加速
ssl_engine device;
/
如果服務器上游SSL硬件加速設備,就可以進行配置加快SSL協議的處理??梢允褂肙penSSL提供的命令查看是否有SSL硬件加速設備:openssl engine -t
4
系統調用gettimeofday的執行頻率
timer_resolution t;
/
默認情況下,每次內核的事件調用(epoll、select、poll、kqueue等)返回時,都會執行一次gettimeofday,實現用內核的時鐘更新一次Nginx中緩存時鐘。中間有一次內核態到用戶態的復制,因此,實現代價不小??梢允褂迷撆渲媒档驼{用頻率。eg:timer_resolution 100ms;表示至少每100ms才調用一次gettimeofday。但目前大多數內核中,x86-64體系架構,gettimeofday只是一次vsyscall,僅僅對共享內存頁中的數據做訪問,并不是通常的系統調用。一般不需使用該配置,若希望日志時間更準確可以使用。
5
Nginx worker進程優先級設置
worker_priority nice;
worker priority 0;
用于設置Nginx worker進程的nice優先級,在Linux或其他Unix操作系統中,當許多進程都處于可執行狀態時,將按照所有的進程的優先級來決定本次內核選擇哪一個執行。進程所分配的CPU時間片大小與進程優先級相關。成正比,即優先級越高,分配的時間片也越大。(默認最小時間片5ms,最大時間片800ms),優先級高的會占用更多的系統資源。優先級由靜態優先級和內核根據進程執行情況所做的動態調整(目前只有+-5的調整)共同決定。nice值是進程的靜態優先級,它的取值范圍是-20~+19,從高至低。若希望Nginx占有更多資源,可以將nice值設置小一點但不建議小于內核進程nice值(通常為-5)
4.事件類配置項
序號
分類
語法
默認
說明
序號
分類
語法
默認
說明
1
是否打開accept鎖
accept_mutex[on/off];
accept_mutex on;
accept_mutex是Nginx負載均衡鎖。這把鎖可以讓多個worker進程輪流地、序列化地與新的客戶端建立TCP連接。當某一個worker建立的連接數達到worker_connections配置的最大數7/8時會大大減小該worker試圖建立TCP連接的機會。以此實現所有worker進程之上處理的客戶端請求數盡量接近。該鎖默認打開。若關閉,建立TCP耗時會更短,但worker進程之間的負載會非常不均衡,不建議關閉。
2
lock文件的路徑
lock_file path/file;
lock_file logs/nginx.lock
accept鎖可能需要這個lock文件,如果accept鎖關閉,lock_file配置完全不生效。若打開鎖,且由于編譯程序、操作系統結構等因素導致Nginx不支持原子鎖,這時才會用文件鎖實現accept鎖,lock_file指定的lock文件才會生效。
3
使用accept鎖到真正建立連接之間的延遲時間
accept_mutex_delay Nms;
accept_mutex_delay 500ms;
使用accept鎖,同一時間只有一個worker進程能夠取到accept鎖。該鎖不是阻塞鎖,若娶不到立刻返回,若一個worker視圖取accept鎖,取不到需要等accpet_mutex_delay定義的時間間隔后才能再次取鎖。
4
批量建立新連接mult_accept [on/off];
multi_accept off;
當事件模型通知有新連接時,盡可能對本地調度中客戶端發起的所有TCP請求都建立連接。
5
選擇事件模型
use [kqueue/rtsig/epoll/ /dev/poll /select/poll/eventport];
Nginx會自動使用最合適的事件模型
對于Linux操作系統,可供選擇的事件驅動模型有poll、select和epoll三種。epoll當然是性能最高的。
6
每個worker的最大連接數
worker_connections number;
/
每個worker進程可以同時處理的最大連接數。
用HTTP核心模塊配置一個靜態Web服務器
靜態Web服務器的主要功能由ngx_http_core_module模塊(HTTP框架的主要成員)實現。
http {
gzip on;
upstream {
...
}
...
server {
listen localhost:80;
...
location /webstatic {
if ... {
}
root /opt/webresource;
...
}
location ~*.(jpg|jpeg|png|jpe|gif)$ {
...
}
}
server {
...
}
}
所有HTTP配置項都必須直屬于http塊、server塊、location塊、upstream塊或if塊等(HTTP配置項自然必須會在http{}塊之內)。
Nginx為配置一個完整的靜態Web服務器提供了非常多的功能,分為以下8類:虛擬主機與請求的分類、文件路徑的定義、內存及磁盤資源的分配、網絡連接的設置、MIME類型的設置、對客戶端請求的限制、文件操作的優化、對客戶端請求的特殊處理。
1.虛擬主機與請求的分發
經常有多個主機域名對應著同一個IP地址情況,這時在nginx.conf中就可以按照server_name(對應用戶請求的主機域名)并通過server塊來定義虛擬主機,每個server塊就是一個虛擬主機,它只處理與之對應的主機域名請求。
一臺服務器上的Nginx以不同的方式處理訪問不同主機域名的HTTP請求。
序號
分類
語法
默認
配置塊
說明
序號
分類
語法
默認
配置塊
說明
1
監聽端口
listen address:port[default(在0.8.21已廢棄)]/[default_server]/[bcaklog=num]/[rcvbuf=size]/[sndbuf=size]/[accept_filter=filter]/[deferred]/[bind]/ [ipv6only=[on/off]] /[ssl]
listen 80;
server
listen參數決定Nginx服務如何監聽端口。在listen后可以只加IP地址、端口號或主機名。不加端口號,默認監聽80端口。參數說明:default/default_server--將所在的server塊作為整個Web服務默認server塊。如果沒有設置該參數,將在nginx.conf配置文件中找到第一個server作為默認server塊。如果無法匹配配置文件中的所有主機域名時,則會使用默認虛擬主機; backlog=num--表示TCP中backlog隊列的大小。默認為-1,表不予設置。若設置隊列滿了,客戶端建立連接將會失??; revbuf=size--表設置監聽句柄的SO_RCVBUF參數; sndbuf=size--表設置監聽句柄的SO_SNDBUF參數; accept_filter--設置accept過濾器,只對FreeBSD操作系統有用;deffered--在設置參數后,若用戶發起連接請求,且完成了TCP的三次握手,內核也不會為這次的連接調度worker進程來處理,只有用戶真的發生數據(內核已經在網卡中收到請求數據包),內核才會喚醒worker進程處理這個連接?!具@個參數適用于大并發情況下,減輕worker進程的負擔。】;bind--綁定當前端口/地址對,如127.0.0.1:8000,只有同時對一個端口監聽多個地址時才會生效;ssl--在當前監聽的端口上建立連接必須基于SSL協議。
2
主機名稱
server_name name[...];
server_name "";
server
server_name后可跟多個主機名稱,如server_name wwww.testweb.com、download.testweb.com;在處理一個HTTP請求時,Nginx會取出header頭中的Host與每個server中的server_name進行匹配,以此決定到底由哪一個server來處理這個請求。有可能一個Host與多個Server塊中的server_name都匹配,這時會根據匹配優先級選擇實際處理的server塊。server_name與Host的匹配優先級:1)首先匹配選擇所有字符串完全匹配的server_name,如www.testweb.com 2)其次選擇通配符在前面的server_name,如.testweb.com 3)再次選擇通配符在后面的server_name,如www.testweb. 4)最后選擇使用正則表達式才匹配的server_name,如~^.testweb.com$;若都不匹配,會按下列順序選擇處理server塊:1)優先選擇listen配置項后加入[default
3
server_names_hash_bucket_size
server_names_hash_bucket_size size;
server_names_hash_bucket_size 32
64
128;
4
server_names_hash_max_size
server_names_hash_max_size size;
server_names_hash_max_size 512;
http、server、location
該配置項會影響散列表的沖突率,值越大消耗的內存越多,但散列key的沖突率越低,檢索速度更快;值越小,消耗內存越小,但散列key的沖突率可能增高
5
重定向主機名稱的處理
server_name_in_redirect on/off;
server_name_in_redirect on;
http、server或location
該配置需配合server_name使用,on打開時,表示重定向請求時會使用server_name里配置的第一個主機名代替原先請求的Host頭部;使用off時,則重定向請求時使用請求本身的Host頭部
6
location
location[=// */^~/@]/uri/
/
server
該配置會根據用戶請求中的url來匹配上面的/uri表達式,如果可以配置則選擇location{}塊中的配置來處理用戶請求。location匹配規則:1)=表示把uri作為字符串,完全匹配 2)~表示uri是大小寫敏感的 3)~*表示忽略字母大小寫問題 4)^~表示匹配uri只需前半部分與uri匹配即可,如location ~^ /image/{# 以/image/開始的請求都會匹配上} 5)@表示僅用于Nginx服務內部請求之間的重定向,帶有@的location不直接處理用戶請求。location是有順序的,當一個請求匹配多個時,實際這個請求是被第一個處理
Nginx正是使用server_name配置項針對特定Host域名的請求提供不同的服務,以此實現虛擬主機功能。
總結
以上是生活随笔 為你收集整理的深入理解Nginx-模块开发与架构解析(第2版)第二章 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。