本文包含內(nèi)容
(1)配置文件
(2)配置文件的語(yǔ)法格式
(3)運(yùn)行服務(wù)需要具備的基礎(chǔ)配置
(4)使用http核心模塊配置靜態(tài)web服務(wù)器的方法
(5)反向代理服務(wù)器
part 1 運(yùn)行進(jìn)程的關(guān)系
part 2 配置的語(yǔ)法
塊配置項(xiàng):一個(gè)塊配置項(xiàng)名 和 一對(duì)大括號(hào)組成
配置項(xiàng)的語(yǔ)法格式
A 如果配置項(xiàng)值中包括語(yǔ)法符號(hào),例如空格符,需要使用單引號(hào)或者雙引號(hào)包括配置項(xiàng)目值,每行配置的結(jié)尾需要加上分號(hào)
配置項(xiàng)名 配置項(xiàng)值1 配置項(xiàng)值2 ...;
B 配置項(xiàng)的注釋 #
C 配置項(xiàng)的單位
千字節(jié) K 兆字節(jié) M
時(shí)間單位 ms毫秒 s m分鐘 h d天 w周 M月 y年
D 使用變量
只有少數(shù)模塊支持變量的使用 , 使用時(shí)候在變量的前面加上 $
注:大部分的模塊都必須在nginx.conf中讀取某個(gè)配置項(xiàng)后,才會(huì)在運(yùn)行時(shí)候啟用
part 3 基本配置
至少必須加載幾個(gè)核心模塊和一個(gè)事件類(lèi)模塊,這些模塊運(yùn)行時(shí)候所支持的配置項(xiàng)目稱(chēng)為基本配置-所有其他的模塊執(zhí)行時(shí)都依賴(lài)的配置項(xiàng)
A 用于調(diào)試進(jìn)程和定位問(wèn)題的配置項(xiàng)
a 是否以守護(hù)進(jìn)程方式運(yùn)行nginx
默認(rèn)是daemon on;
守護(hù)進(jìn)程表示脫離終端并且在后臺(tái)運(yùn)行的進(jìn)程
b 是否以master/worker方式工作
默認(rèn)是master_process on;
是以一個(gè)master進(jìn)程管理多個(gè)worker進(jìn)程的方式運(yùn)行
c error日志的設(shè)置
error日志是定位nginx問(wèn)題的最佳工具,可以根據(jù)需求設(shè)置error日志的路徑和級(jí)別
默認(rèn)的路徑是 error_log logs/error.log error;
默認(rèn)情況下是/logs/error.log文件,需要講文件放在一個(gè)磁盤(pán)空間足夠大的位置
關(guān)閉日志文件的唯一方式:將log路徑設(shè)置為/dev/null
level 是日志的輸出級(jí)別,取值范圍是
debug info notice warn error crit alert emerg 從左到右依次增大
當(dāng)設(shè)定為一個(gè)級(jí)別時(shí)候,大于或者等于該級(jí)別的日志都會(huì)被輸出到日志文件中
注意:如果日志級(jí)別設(shè)定到debug,必須在configure 時(shí)候加入--with-debug配置項(xiàng)
d 是否處理幾個(gè)特殊的調(diào)試點(diǎn)
用于幫助用戶(hù)跟蹤調(diào)試,
如果設(shè)置為debug_points stop ,nginx的代碼執(zhí)行到調(diào)試點(diǎn)后,會(huì)發(fā)出SIGSTOP信號(hào),用于調(diào)試;如果設(shè)置為debug_points abort,會(huì)產(chǎn)生一個(gè)coredump 文件,通常不使用此選項(xiàng)
e 僅對(duì)指定的客戶(hù)端輸出debug級(jí)別的日志
這個(gè)配置項(xiàng)屬于事件類(lèi)配置,需要放在events{...}
舉例:
events {
debug_connection 192.168.1.1;
}
僅僅來(lái)自192.168.1.1的請(qǐng)求才會(huì)輸出debug級(jí)別的日志,其他請(qǐng)求仍然使用error_log中配置的日志級(jí)別,上面配置對(duì)于修復(fù)bug很有用,特別是高并發(fā)請(qǐng)求下,會(huì)發(fā)生的問(wèn)題
f 限制coredump 核心轉(zhuǎn)儲(chǔ)文件的大小
當(dāng)進(jìn)程發(fā)生錯(cuò)誤或者收到信號(hào)而終止時(shí)候,系統(tǒng)會(huì)將進(jìn)程執(zhí)行時(shí)候的內(nèi)存內(nèi)容寫(xiě)入一個(gè)文件,core文件,作為調(diào)試用-核心轉(zhuǎn)儲(chǔ)core dumps
當(dāng)nginx進(jìn)程出現(xiàn)一些非法操作時(shí)候,導(dǎo)致進(jìn)程直接被操作系統(tǒng)強(qiáng)制結(jié)束時(shí)候,會(huì)生成核心轉(zhuǎn)儲(chǔ)core文件,可以從core文件中獲取當(dāng)時(shí)的堆棧和寄存器信息,幫助定位
worker_rlimit_core size;
可以限制core文件的大小,有效幫助用戶(hù)定位問(wèn)題
g 指定coredump 文件生成目錄
working_directory path;
worker進(jìn)程的工作目錄,設(shè)置coredump文件所放置的目錄,協(xié)助定位問(wèn)題
B 正常運(yùn)行的配置項(xiàng)
a 定義環(huán)境變量 env VAR|VAR=VALUE
舉例: env TESTPATH = /tmp/;
用戶(hù)直接設(shè)置操作系統(tǒng)上的環(huán)境變量
b 配置其他的配置文件
include /path/file
舉例:
include mime.types;
include vhost/*.conf;
可以將其他的配置文件通過(guò)include配置項(xiàng)嵌入到當(dāng)前的nginx.conf文件中
參數(shù)既可以是絕對(duì)路徑,也可以是相對(duì)nginx.conf所在目錄的相對(duì)路徑,參數(shù)的值可以是一個(gè)明確的文件名,也可以是含有通配符的文件名,可以一次嵌入多個(gè)配置文件
c pid文件的路徑
默認(rèn)路徑是 pid logs/nginx.pid;
保存master進(jìn)程ID的pid文件存放的路徑,默認(rèn)和configure執(zhí)行的參數(shù)所指定的路徑是相同的,也可以隨時(shí)修改,文件直接影響nginx是否可以運(yùn)行
可以從nginx.pid中直接查看pid,使用sudo kill pid 停止nginx服務(wù)
d nginx worker進(jìn)程運(yùn)行的用戶(hù)和用戶(hù)組
默認(rèn)是 user nobody nobody;
user 用于設(shè)置master進(jìn)程啟動(dòng)后,fork(生成子進(jìn)程)出的worker進(jìn)程運(yùn)行在哪個(gè)用戶(hù)和用戶(hù)組下面,如果沒(méi)有指定groupname ,默認(rèn)和用戶(hù)名相同
若是在configure 命令執(zhí)行時(shí)候,使用了參數(shù)
--user=username --group=groupname
此時(shí)在nginx運(yùn)行的時(shí)候,將使用參數(shù)中指定的用戶(hù)和用戶(hù)組
e 指定nginx worker進(jìn)程可以打開(kāi)的最大文件句柄數(shù)
設(shè)置一個(gè)進(jìn)程可以打開(kāi)的最大的文件的句柄數(shù)
worker_rlimit_nofile limit;
f 限制信號(hào)隊(duì)列
設(shè)置每個(gè)用戶(hù)發(fā)往nginx的信號(hào)隊(duì)列的大小,當(dāng)某個(gè)用戶(hù)的信號(hào)隊(duì)列滿(mǎn)了,再發(fā)送信號(hào)將被丟掉
worker_rlimit_sigpending limit;
C 優(yōu)化性能的配置項(xiàng)
a 進(jìn)程個(gè)數(shù)
默認(rèn)是 work_processes 1;
worker進(jìn)程的數(shù)量直接影響性能,每個(gè)worker進(jìn)程都是單線(xiàn)程的進(jìn)程,會(huì)調(diào)用各個(gè)模塊實(shí)現(xiàn)多種多樣的功能,如果這些模塊確定不會(huì)出現(xiàn)阻塞式調(diào)用,進(jìn)程個(gè)數(shù)等于內(nèi)核個(gè)數(shù),但是如果會(huì)出現(xiàn)阻塞式調(diào)用,需要配置稍多一些的worker進(jìn)程
進(jìn)程少:業(yè)務(wù)方面致使用戶(hù)請(qǐng)求大量讀取本地磁盤(pán)上的靜態(tài)資源文件,服務(wù)器的內(nèi)存較小,大部分的請(qǐng)求訪問(wèn)靜態(tài)資源文件必須讀取磁盤(pán),不是內(nèi)存中的磁盤(pán)緩存,磁盤(pán)I/O調(diào)用會(huì)阻塞worker進(jìn)程少量時(shí)間,導(dǎo)致性能下降
進(jìn)程多:多worker進(jìn)程可以充分利用多核系統(tǒng)架構(gòu),若是worker進(jìn)程數(shù)量大于內(nèi)核數(shù)量,會(huì)增大進(jìn)程之間切換帶來(lái)的消耗
b 綁定nginx worker進(jìn)程到指定的cpu內(nèi)核
舉例:如果有四顆cpu內(nèi)核
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
每一個(gè)worker進(jìn)程都是非常繁忙的,如果多個(gè)worker進(jìn)程搶同一個(gè)cpu,就會(huì)出現(xiàn)同步問(wèn)題,如果每個(gè)worker進(jìn)程獨(dú)享一個(gè)cpu,在內(nèi)核的調(diào)度策略中實(shí)現(xiàn)了完全的并發(fā)
c SSL硬件加速
d 系統(tǒng)調(diào)用gettimeofday的執(zhí)行效率
e 進(jìn)程優(yōu)先級(jí)設(shè)置
D 事件類(lèi)配置項(xiàng)
a 是否打開(kāi)accept 鎖
默認(rèn)是 accept_mutext on;
accept_mutex 是nginx的負(fù)載均衡鎖,這把鎖可以讓多個(gè)worker 進(jìn)程輪流的 序列化 和新的用戶(hù)建立 tcp連接
當(dāng)worker建立的連接數(shù)量達(dá)到最大連接數(shù)的7/8時(shí)候,將大大減小worker進(jìn)程試圖建立新的tcp連接的機(jī)會(huì),實(shí)現(xiàn)所有的worker進(jìn)程上的處理的用戶(hù)請(qǐng)求的數(shù)量盡量接近
accept鎖默認(rèn)是打開(kāi)的,如果關(guān)閉,建立tcp連接的耗時(shí)將會(huì)更短,但worker進(jìn)程之間的負(fù)載將會(huì)非常不均衡,因此不建議關(guān)閉它
b lock文件的路徑
默認(rèn)路徑是 lock_file logs/nginx.lock;
accept鎖可能需要lock文件,如果accept鎖關(guān)閉,lock_file配置完全不生效,如果打開(kāi)了accept鎖,由于元素導(dǎo)致nginx不支持原子鎖,這時(shí)候才會(huì)用文件鎖實(shí)現(xiàn)accept鎖,lock文件才會(huì)生效
c 使用accept鎖后到真正建立連接之間的延遲時(shí)間
在使用accept鎖后,同一時(shí)間只有一個(gè)worker進(jìn)程可以取到accept鎖,如果取不到會(huì)立刻返回,至少再等定義時(shí)間間隔后才能再次試圖取鎖
舉例:
accept_mutex_delay 500ms;
d 批量建立新的連接
默認(rèn)是 multi_accept off;
當(dāng)事件模型通知有新的連接時(shí)候,盡可能對(duì)本次調(diào)度中的客戶(hù)端發(fā)起的所有tcp請(qǐng)求都建立連接
e 選擇事件模型
默認(rèn)是 nginx會(huì)自動(dòng)使用最適合的事件模型
可供選擇的事件驅(qū)動(dòng)模型有 poll select epoll 三種,epoll 是性能最高的一種
f 每個(gè)worker的最大連接數(shù)
worker_connections number;
定義每個(gè)進(jìn)程可以同事處理的最大連接數(shù)