Nginx核心配置文件常用參數詳解
作者:尹正傑
版權聲明:原創作品,謝絕轉載!否則將追究法律責任。
關於Nginx權威文檔的話童鞋們可以參考Nginx官方文檔介紹:http://nginx.org/en/docs/http/ngx_http_core_module.html。本篇博客只列出來了常用的參數介紹,用這些參數說明來定制化我們自己的nginx的web服務器等等。
一.正常運行的必備配置
1>.user username [groupname];
#以那個用戶身份運行,以在configure指定的用戶為准
2>.pid /path/to/pid_filename;
#指定nginx的pid文件
3>.worker_rlimit_nofile ;
#指定一個worker進程所能夠打開的句柄數
4>.worker_rlimit_sigpending ;
#設定每個用戶能夠發往worker進程的信號的數量
二.優化性能相關的配置
1>.worker_procrsses 1;
#work進程的個數 ,通常其數值應該為cpu的物理核心數減1
2>.worker_cpu_affinity cpumask ....;
0000 #假設有4個CPU,那么就用4個0來進行占位
0001 #表示第一個CPU
0010 #表示第二個CPU
0100 #表示第三個CPU
1000 #表示第四個CPU
對應位上使用cpu,要做單獨綁定
work_procrsses 6; #表示開啟6個進程,6個進程分別綁定在以下的6顆不同的CPU之上。(這種方式可以提升Nginx的性能,但是要注意的是,每個進程綁定了CPU之后,這些CPU仍然可以被系統調用去執行其他的指令,換句話說,這些CPU有可能還是會做上下文切換喲。)
worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000; #我們使用類似這種方式來綁定上面所指定的6顆CPU.
3>.ssl_engine device;
#在存在ssl硬件加速器的服務器上,指定所使用的ssl硬件加速設備,從而降低對web服務器的系統資源消耗。
4>.timer_resolution t;
#每次內核事件調用返回時,都會使用gettimeday()來更新nginx緩存時鍾;timer_resolution用於定義每隔多久才會由gettimeday()更新一次緩存時鍾;x86-64系統上,gettimeday()代價已經很小,可以忽略此配置.
5>.worker_priority nice;
# -20到19之間的值,值越小越優先調用
三.跟事件相關的配置
1>.accept_mutex [on|off];
# 是否打開nginx的負載均衡鎖;此鎖能夠讓多個worker進行輪流地、序列化地與新的客戶端建立連接;而通常當一個worker進程的負載達到其上限的7/8,master就盡可能不將請求調度至worker.
2>.lock_file /path/to/lock_file;
#定義鎖文件,如果上面的參數為accept_mutex off,那么這個鎖文件就無效啦。
3>.accept_mutex_delay [#ms]
#使用accept鎖以后,只有一個worker能取得鎖,另一個worker進程為取得accept鎖的等待時長,即用戶建立等待的時間,如果某worker進程在某次試圖取得鎖時失敗了,至少要等待#ms才能在一次請求鎖。默認是500毫秒。
4>.multi_accept [on|off]
#是否允許一次性地響應多個用戶請求,默認為off。
5>.use [epoll|rtsig|select|poll]
#指定使用那種事件模型,建議讓nginx自動選擇。
6>.worker_commections
#每個worker能夠並發響應的最大請求數,如果為代理服務器(因為它需要與客戶端連接,並且將這個連接轉發給后端真正提供服務的服務器喲)的話:worker_rlimit_nofile=worker_commections*2.
四.用於調試、定位問題:只調試nginx時使用
1>.daemon [on|off];
#關閉提供守護進程的模式,是否讓nignx運行於后台;調試時應該為off,使得所有信息直接輸出在控制台,默認為on。
2>.master_process on|off;
#是否以master/worker(一個master管理多個worker)模式運行nginx,默認為on,調試時可以設置為off(關閉master,至啟動一個master)以方便追蹤。
3>.error_log /path/to/error_log level;
#錯誤日志文件及其級別,調試時可以使用debug級別,但要求在編譯時必須使用--with-debug啟用debug功能,默認通常為error級別。
五.Nginx的http的web功能
1.Nginx的web基本配置格式:
1 http{ #Nginx的http web功能,並不包含郵件的配置,如果需要nginx支持mail的支持,需要在編譯的時候配置mail模塊喲。 2 directive value; #非虛擬主機的配置和公共選項,需要定義在server之外,http之內 3 .... 4
5 server{ #必須使用虛擬機來配置站點:每個虛擬主機使用一個server{}段來配置 6
7 } 8 server{ 9
10 } 11 ...... 12 }
2.server{}
定義一個虛擬主機:nginx支持使用基於主機名或IP的虛擬主機
3.listen [...]
a>.listen address[:port] #只監聽指定IP的端口;
b>.listen prot #監聽主機上的所有IP的端口;
c>.listen unix:socket #監聽在socket文件上,對於我們而言,這種監聽方式我們不常用;
d>.default_server #定義此server為http中默認的server;如果所有的server中任何一個listen使用此參數,那么第一個server即為默認server;
e>.rcvbuf=SIZE #接收緩存大小;
f>.sndbuf=SIZE #發送緩存大小;
g>.ssl:https server #必須以ssl建立連接;
4.server_name [...];
server_name可以跟多個主機名,名稱可以使用通配符和正則表達式(通常以~開頭):當nginx收到一個請求時,會取出其首部的server的值,而后跟眾server_name進行比較,比較方式如下:
a>. 先做精確匹配,如:www.yinzhengjie.org.cn
b>. 左側通配符匹配,如:*.yinzhengjie.org.cn
c>. 右側通配符匹配,如:www.*
d>.正則表達式匹配,如:~^.*\.yinzhengjie\.org.cn$
5.server_name_hash_bucket_size 32|64|128
為了實現快速主機查找,nginx使用hash表來保存主機名,后面的數字表示可以保存的主機名個數。
6.location [ =|~|~*|^~] uri { ... }或location @name { ... }
location是定義請求的上下文的,location可以放在server虛擬主機中也可以放在location之中(也就是location嵌套location)。它允許根據用戶請求的URI來匹配指定的各location以進行訪問配置;匹配到時,將被location塊中的配置所處理。匹配規則如下:
a>. =:精確匹配,
b>.~:正則表達式模式匹配,匹配時區分字符大小寫
c>.~*:正則表達式模式匹配,匹配時忽略字符大小寫
d>.^~:只需要前半部分與uri匹配即可,不檢查正則表達式
匹配的優先級:字符字面量最精確匹配、正則表達式檢索(由多個時,由第一個匹配到的所處理),按字符字面量。
7.location的文件路徑定義
a>.root path
設置web資源路徑,用於指定請求的根文檔目錄,從跟開始匹配,當然root這個參數也可以不再location標簽中,但是為了實現對目錄的訪問控制,我們一般把該參數放在location里面喲。如:
1 location / { 2 root /web/htdocs; #注意,它指的是location的根目錄,用戶訪問的應該是 /web/htdocs下的文件。 3 } 4 location ^~ /images{ 5 root /web; #它指定的也是跟目錄,用戶訪問的文件應該是/web/images下的文件 6 }
b>.alias path
指定路徑別名,只能用於location中,從最后一個/開始匹配
1 location / { 2 root /web/htdocs; #注意,它指的是location的根目錄,用戶訪問的應該是 /web/htdocs下的文件。 3 } 4 location ^~ /images{ 5 alias /web; #注意,alias后面的參數“/web”表示是images的一個別名。也就是說用戶訪問 /web其實就是訪問 /images這個目錄下的文件喲。它是指多一個路徑別名而已。 6 }
c>.index file....
定義默認頁面,可以跟多個值。自左向右匹配。
1 location / { 2 root /web/htdocs; #注意,它指的是location的根目錄,用戶訪問的應該是 /web/htdocs下的文件。 3 index index.html index.htm; #設置首頁文件的名稱,我們可以設置多個,用空格隔開即可。 4 }
d>..error_page code ... [=[response]] uri
它是用來錯誤頁面重定向的。簡單的說,當對於某個請求發回錯誤時,如果匹配上了error_page指令中設定的code,則從定向至新的新URI中。它通常放在server虛擬主機配置里面喲。
1 server{ 2 error_page 404 /404.html; #error_page 后面的第一個參數表示返回錯誤狀態,第二個參數是根據第一個參數的返回狀態返回給用戶的文件的路徑。 3 location / { 4 ...... 5 } 6 ...... 7 }
e>.try_files path1 [path2...] uri;
他也是一種重定向,它和error_page 相比,其會先進行判斷頁面是否存在,如果不存在,可以給用戶返回默認的頁面。簡單的說,它是自左向右嘗試讀取有path所指定路徑,在第一找到即停止並返回,如果所有path均不存在,則返回最后一個uri
1 location ~* ^/documents/(.*)${ 2 root /www/htdocs 3 try_files $uri /docu/$1 /temp.html #它表示當用戶訪問一個路徑是,它會優先去/www/htdocs/documents目前去找這個文件,如果這個目錄中沒有的話,它就會去找 /www/htdocs/docu目錄下去找用戶請求的文件,如果還是找不到的話就會給用戶返回/www/htdocs/temp.html這個文件喲。 4 }
8.網絡連接相關的設置
a>.keepalive_timeout time;
#保持連接的超時時長,默認為65s(nginx-1.12.x版本);
b>.keepalive_requests n;
#在一次長連接上允許承載的最大請求數;
c>.keepalive_disable [msie6|safari |none];
#對指定的瀏覽器禁止使用長連接,比如微軟的IE6(msie6),蘋果的瀏覽器(safari ),當然你也可以不做任何禁用(none);
d>.tcp_nodelay on|off ;
#對keepalive連接是否使用TCP_NODELAY選項,默認是on,TCP為了提高其性能,通常會把多個報文合並在一起傳給對方,我們簡稱為延遲確認;
e>.client_header_timeout time;
#讀取http請求首部的超時時長;
f>.client_body_timeout time;
#讀取http請求包體的超時時間;
g>.send_timeout time;
#發送響應的超時時長;
9.對客戶端請求的限制:
a>.limit_except method ...{ ... }
# 指定范圍之外的其他方法的訪問控制,只能用於location中,用法如下:
1 limit_except GET { 2 allow 172.16.0.0/16; #表示除了GET方法,想要訪問其他方法,如PUT,DELETE等只允許172.16.0.0/16這個網段。 3 deny all; #表示用戶處理訪問GET方法外,其他的方法默認都是被拒絕的喲。 4 }
b>.client_max_body_size size
#http請求包體的最大值,常用於限定客戶端所能夠請求的最大包體,根據請求首部中的Content-Length來檢查,以避免無用的傳輸。換句話說,這個參數用來限定用戶能上傳文件的大小很有用。
c>.limit_rate speed
#限制客戶端每秒傳輸的字節數,默認為0,表示沒有限制。
d>.limit_rate_after time
#nginx向客戶端發送響應報文時,如果時長超過了此處指定的時長,則后續的發送過程開始限速。用limit_rate來實行限速功能。
10.文件操作的優化
a>.sendfile on|off;
#是否啟用sendfile功能
b>.aio on|off;
#是否啟用aio功能,如果系統支持的話建議啟用。
c>.open_file_cache max=N [incative=time]|off ;
#是否打開文件緩存功能,
max:用於緩存條目的最大值,允許打開的緩存條目最大數,當滿兩類以后將根據LRU(最小最少連接數)算法進行置換,
inactive:某緩存條目在指定時長內沒有被訪問過時,將自動被刪除;通常默認為60s
緩存的信息包括:
文件句柄、文件大小和上次修改時間;
已經打開的目錄結構;
沒有找到或沒有訪問權限的信息;
d>.open_file_cache_errors on|off
#是否緩存文件找不到或沒有權限訪問等相關信息
e>.open_file_cache_valid time
#多長時間檢查一次緩存中的條目是否超出非活動時長,默認為60s
f>.open_file_cache_min_use
#在inactive指定的時長內被訪問超過此處指定的次數時,才不會被刪除.
11.對客戶端請求的特殊處理
a>.ignore_invalid_headers on|off;
#是否忽略不合法的http首部,默認為on,off意味着請求首部中出現不合規的首部將拒絕響應,只能用於server和http。
b>.log_not_found on|off;
#用戶訪問的文件不存在時,是否將其記錄到錯誤日志中。
c>.resolver address;
#指定nginx使用的dns服務器地址。
d>.resolve timeout;
#指定DNS解析超時時長,默認為30s。
e>.server_tokens on|off;
#是否在錯誤頁面中顯示nginx的版本號。
六.http核心模塊的內置變量:
$uri:當前請求的uri,不帶參數
$request_uri:請求的uri,帶完整參數
$host:http請求報文中host首部;如果請求中沒有host首部,則以處理此請求的主機的主機名代替
$hostname:nginx服務運行所在主機的主機名
$remote_addr:客戶端IP
$remote_port: 客戶端port
$remote_user:使用用戶認證時客戶端用戶輸入的用戶名
$request_filename:用戶請求中的URI經過本地root或alias轉換后映射的本地的文件路徑
$request_method:請求方法
$server_addr:服務器地址
$server_name: 服務器名稱
$server_port:服務器端口
$server_protocol:服務器向客戶端發送響應時的協議,如http/1.1,http/1.0
$scheme:在請求中使用的scheme 映射協議本身的協議
$http_HEADER:匹配請求報文中指定的HEADER,$http_host匹配請求報文中的host首部
$sent_http_HEADER:匹配響應報文中指定的HERDER,例如$http_content_type匹配相應報文中的content-type首部
$document_root:當前請求映射到的root配置