Nginx基本屬性配置詳解

1. Nginx服務(wù)的基本配置

1.1 用于調(diào)試進程和定位問題的配置項
  • 是否以守護進程的方式運行nginx
# 默認on
daemon on|off;
  • 是否以master/worker方式工作
# 默認on统锤,指定了是否以master-worker進程的方式運行皮胡,如果設(shè)置為off,那么所有的請求將只會由master進程處理
master_process on|off;
  • error日志的設(shè)置
# 指定了error日志的目錄和日志級別悲靴,第二個參數(shù)用于指定目錄历等,第三個參數(shù)用于指定日志級別偿凭,總共有:debug婶熬、info、notice量窘、warn雇寇、error、crit蚌铜、alert锨侯、emerg,這些日志級別中冬殃,從左往右優(yōu)先級依次增大囚痴,默認為info
error_log logs/error.log error;
  • 是否處理幾個特殊的調(diào)試點
# 指定了調(diào)試點
debug_points stop|abort
  • 僅對指定的客戶端輸出debug級別的日志
debug_connection IP|CIDR

該參數(shù)主要用于events模塊中,針對指定的ip或者網(wǎng)段記錄debug日志:

events {
  debug_connection 10.224.66.14;
  debug_connection 10.224.57.0/24;
}

需要注意的是审葬,在使用該參數(shù)時深滚,必須要確保在進行configure時已經(jīng)加入了--with-debug參數(shù),否則不會生效涣觉;

  • 限制coredump核心轉(zhuǎn)儲文件的大小
worker_rlimit_core size;

在Linux操作系統(tǒng)中痴荐,如果一個進程由于錯誤或者收到信號而終止時,會將進程執(zhí)行時的內(nèi)存內(nèi)容寫入一個文件(core文件)官册,以作為調(diào)試之用生兆,這就是所謂的核心轉(zhuǎn)儲。在nginx進程宕機時膝宁,其就會產(chǎn)生核心轉(zhuǎn)儲文件鸦难,而且該文件一般都有幾個G根吁,因而如果不限制該文件的大小,那么很有可能會把服務(wù)器磁盤占滿合蔽。該參數(shù)的作用就是限制核心轉(zhuǎn)儲文件的大小的击敌。

  • 指定coredump文件生成目錄
working_directory path;

該參數(shù)指定了在生成核心轉(zhuǎn)儲文件時,將該文件存放的目錄辈末。

1.2 正常運行的配置項
  • 定義環(huán)境變量
env TESTPATH=/tmp/

這個配置項可以讓用戶直接設(shè)置操作系統(tǒng)上的環(huán)境變量愚争。

  • 嵌入其他配置文件
include /path/file

用于將其他的配置文件引入進來映皆,該路徑可以是絕對路徑挤聘,也可以是相對路徑,如果是相對路徑捅彻,則是基于nginx的配置目錄而指定的组去。

  • pid文件的路徑
pid path/file

用于指定存儲nginx的master進程運行所使用的進程id的文件的路徑。

  • Nginx的worker進程運行的用戶及用戶組
user username [groupName]

用于指定worker進程運行時所基于的用戶和用戶組步淹,默認都為nobody从隆,這里如果不指定groupName,那么組名就與用戶名一致缭裆。

  • 指定nginx的worker進程可以打開的最大句柄描述符個數(shù)
worker_rlimit_nofile limit;

設(shè)置一個worker進程能夠打開的最大句柄描述符個數(shù)键闺。

  • 限制信號隊列
worker_rlimit_sigpending limit;

設(shè)置了每個用戶能夠發(fā)往nginx的信號隊列的大小,如果信號隊列已滿澈驼,那么新發(fā)送的信號將會被丟棄辛燥。

1.3 優(yōu)化性能的配置項
  • nginx的worker進程的個數(shù)
worker_processes 1;

用于指定nginx運行時worker進程的個數(shù),在nginx運行時缝其,每個worker進程都是單線程運行的挎塌,這里需要判斷worker進程是否進行了阻塞性操作,如果有這樣的操作内边,那么稍微多配置一些worker進程比較好榴都,如果沒有,那么將worker進程數(shù)量設(shè)置得與CPU數(shù)量一樣能夠得到更好的性能漠其。

  • 綁定nginx的worker進程到指定的CPU內(nèi)核
worker_cpu_affinity cpumask [cpumask...]

將worker進程與指定的CPU進行綁定嘴高,這樣能夠防止多個worker進程搶占同一個CPU,從而避免出現(xiàn)同步問題和屎。如下是一個4核CPU的配置方式:

worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;

需要注意的是阳惹,worker_cpu_affinity僅對于Linux系統(tǒng)有效。

  • SSL硬件加速
ssl_engine device;

如果服務(wù)器上有SSL硬件加速設(shè)備眶俩,那么就可以進行配置以加快SSL協(xié)議的處理速度莹汤。用戶可以使用OpenSSL提供的命令來查看是否有SSL硬件加速設(shè)備:

openssl engine -t
  • 系統(tǒng)調(diào)用gettimeofday的執(zhí)行頻率
timer_resolution -t

默認情況下,每次內(nèi)核的事件調(diào)用返回時颠印,都會執(zhí)行一次gettimeofday纲岭,在早期的Linux版本中抹竹,獲取系統(tǒng)時間都會有一次從內(nèi)核態(tài)到用戶態(tài)的數(shù)據(jù)復(fù)制,其代價比較高止潮,但是在最新的x86-64體系架構(gòu)中窃判,gettimeofday僅僅只是一次vsyscall,其僅僅只是對共享內(nèi)存頁中的數(shù)據(jù)的訪問喇闸,代價不大袄琳。

  • nginx的worker進程優(yōu)先級
worker_priority nice;

用于設(shè)置nginx的worker進程的優(yōu)先級,其中燃乍,nice的默認值為0唆樊。在Linux操作系統(tǒng)中,當有多個進程在競爭CPU執(zhí)行資源時刻蟹,其就會根據(jù)每個進程設(shè)置的優(yōu)先級來優(yōu)先分配執(zhí)行權(quán)限逗旁,并且所分配的時間片也要高一些。優(yōu)先級的值在-20~+19之間舆瘪,數(shù)值越低優(yōu)先級越高片效,一般建議將nginx的優(yōu)先級設(shè)置得更低一些,這樣才能保證其執(zhí)行的權(quán)限英古,但是建議不要設(shè)置得比內(nèi)核的進程優(yōu)先級(其值為-5)還要低淀衣。

1.4 事件類配置項
  • 是否打開accept鎖
accept_mutex [on|off]

accept_mutex參數(shù)用于控制是否啟用負載均衡鎖,其默認值為on召调,該鎖會保證各個worker輪流的膨桥、序列化的與新客戶端建立連接,并且當某個worker的連接數(shù)達到了worker_connections配置的最大連接數(shù)的7/8時某残,該鎖會降低該worker將要新建立的連接數(shù)国撵,從而保證各個worker的負載均衡。

  • lock文件的路徑
lock_file path/file;

該參數(shù)指定了lock文件的路徑玻墅。nginx會使用操作系統(tǒng)提供的鎖功能介牙,但如果操作系統(tǒng)不支持原子鎖,此時才會使用文件鎖來實現(xiàn)lock澳厢。如果accept_mutex參數(shù)設(shè)置為off环础,那么該參數(shù)將不會生效。

  • 使用accept鎖后到真正建立連接之間的延遲時間
accept_mutex_delay Nms;

如果一個worker進程嘗試獲取鎖失敗了剩拢,那么其就會等待該參數(shù)指定的時間段之后再次嘗試獲取鎖线得,該值默認為500ms。

  • 批量建立新連接
multi_accept [on|off];

當事件模型通知此次有新的連接建立請求時徐伐,盡可能的對本次調(diào)度中客戶端發(fā)起的的所有TCP請求都建立連接贯钩,該值默認為off暮屡。

  • 選擇事件模型
use [kqueue|rtsig|epoll|/dev/poll|select|poll|eventport];

nginx所選用的事件模型后控,其會自動使用最適合的模型。在Linux操作系統(tǒng)下支持poll、select和epoll三種楔绞,其中epoll的性能是最高的撑刺。

  • 每個worker的最大連接數(shù)
worker_connections number;

指定了每個worker進程能夠建立的最大連接數(shù)隧膘。

2. http核心模塊配置

2.1 監(jiān)聽端口
listen address:port[default(deprecated)|default_server|[backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|b
  • 這里的IP地址和端口號的配置非常靈活钙态,如果不配置端口號,則默認為80端口吗坚,而ip地址則可以使用通配符進行匹配祈远,如:
listen 127.0.0.1:8080;
listen *:8080;
  • listen的各個參數(shù)含義如下:

1、default和default_server:將當前server塊作為整個web服務(wù)器的默認server塊商源,如果沒有server設(shè)置了該參數(shù)车份,則將nginx.conf中的第一個server塊作為默認server塊。設(shè)置該參數(shù)的原因在于炊汹,如果當前請求沒有匹配到任意一個server躬充,那么就使用第一個server處理請求逃顶;

2讨便、backlog=num:指定了TCP中的backlog隊列的大小,默認值為-1以政。在TCP的三次握手過程中霸褒,進程此時還沒有開始處理監(jiān)聽句柄,而這些請求都會放在backlog隊列中盈蛮,當backlog隊列滿時废菱,客戶端新的握手請求就會被拒絕;

3抖誉、rcvbuf=size:設(shè)置監(jiān)聽句柄的SO_RCVBUF參數(shù)殊轴;

4、sndbuf=size:設(shè)置監(jiān)聽句柄的SO_SNDBUF參數(shù)袒炉;

5旁理、accept_filter:設(shè)置accept過濾器,只對FreeBSD操作系統(tǒng)有用我磁;

6孽文、deferred:如果設(shè)置了該參數(shù),如果用戶發(fā)起了TCP連接請求夺艰,那么在三次握手成功之后內(nèi)核也不會調(diào)度相應(yīng)的進程處理請求芋哭,而是在用戶真正的發(fā)送了數(shù)據(jù)包之后才會將請求發(fā)送給具體的進程進行處理;

7郁副、bind:綁定當前端口/地址對减牺,如127.0.0.1:8000,只有同時對一個端口監(jiān)聽多個地址時才會生效;

8拔疚、ssl:在當前監(jiān)聽的端口上建立的連接必須基于SSL協(xié)議斑鸦;

2.2 主機名稱
語法:server_name name [...];
默認:server_name "";
配置塊:server
  • server_name后可以跟多個主機名稱,在處理HTTP請求時草雕,其會將請求中的Host頭部的主機名與server塊中的主機名進行匹配巷屿,如果遇到多個server塊中的主機名匹配,那么將會按照如下規(guī)則與其進行匹配:
  1. 首先匹配主機名完全匹配的server塊墩虹;
  2. 然后匹配前綴使用通配符的server塊嘱巾;
  3. 接著匹配后綴使用通配符的server塊;
  4. 最后匹配使用正則表達式的server塊诫钓;旬昭、
    如果沒有找到能夠匹配的主機名,那么就會按照如下規(guī)則尋找server塊:
  5. 優(yōu)先選擇在listen項中加入了[default|default_server]的server塊菌湃;
  6. 找到匹配的listen端口的第一個server塊问拘;
2.3 server_names_hash_bucket_size
語法:server_names_hash_bucket_size size;
默認:server_names_hash_bucket_size 32|64|128;
配置塊:http、server惧所、location
  • server_names_hash_bucket_size的作用主要是進行server name的hash匹配的骤坐,在進行hash匹配時,該參數(shù)指定了hash表的每個bucket占用的內(nèi)存大小下愈。
2.4 server_names_hash_max_size
語法:server_names_hash_max_size size;
默認:server_names_hash_max_size 512;
配置塊:http纽绍、server、location
  • server_names_hash_max_size指定了進行server name查找時使用的hash表的大小势似,該值越大拌夏,那么占用的內(nèi)存越多,但是查詢的效率也越高履因。
2.5 重定向主機名稱的處理
語法:server_name_in_redirect on|off;
默認:server_name_in_redirect on;
配置塊:http障簿、server或者location
  • 該配置需要配合server_name使用,在使用on打開時栅迄,表示在重定向請求時站故,會使用server_name里配置的第一個主機名代替原來請求中的Host頭部,而使用off關(guān)閉時霞篡,表示在重定向請求時使用請求本身的Host頭部世蔗。
2.6 location
語法:location [=|~|~*|^~|@] /uri/{...}
配置塊:server
  • location的主要作用是與請求中的URI進行匹配,如果匹配了朗兵,就使用location塊中的配置來處理用戶請求污淋。如下是location的匹配規(guī)則:

=表示把URI作為字符串,以便于參數(shù)中的uri做完全匹配余掖。例如:

location = / {
  # 只有當用戶請求是/時寸爆,才會使用該location下的配置
}

~表示匹配URI時是字母大小寫敏感的;
~表示匹配URI時是字母大小寫不敏感的;*
^~表示匹配URI時只需要其前半部分與uri參數(shù)匹配即可赁豆。例如:

  # 以/images/開始的請求都會匹配上
}

@表示僅用于nginx服務(wù)內(nèi)部請求之間的重定向仅醇,帶有@的location不直接處理用戶請求;
可以在uir參數(shù)里使用正則表達式魔种。如:

  # 匹配以.gif析二、.jpg、.jpeg結(jié)尾的請求
}
  • 關(guān)于location的匹配需要說明的一點是节预,location的匹配是有順序的叶摄,當一個請求匹配了多個location時,實際上這個請求會被第一個location處理安拟。

3. 文件路徑的定義

3.1 以root方式設(shè)置資源路徑
語法:root path;
默認:root html;
配置塊:http蛤吓、server、locationo糠赦、if
  • 示例如下:
location /download/ {
  root /opt/web/html/;
}

這種配置方式會將/download/開始的請求映射到/opt/web/html/目錄下会傲,比如某個請求為/download/test/index.html,那么nginx就會到服務(wù)器上查找/opt/web/html/download/test/index.html文件拙泽。

3.2 以alias方式設(shè)置資源文件
語法:alias path;
配置塊:location;
  • 與root一樣淌山,alias也是配置資源文件路徑的,但是alias是location后的路徑以別名的方式替換目標路徑的指定部分奔滑,比如如下配置:
location /conf {
  alias /usr/local/nginx/conf;
}

此時如果一個請求為/conf/index.html艾岂,那么其前綴/conf將會與當前l(fā)ocation匹配顺少,并且會將alias參數(shù)替換請求uri中匹配的部分朋其,也就是轉(zhuǎn)換后的uri為/usr/local/nginx/conf/index.html。

3.3 訪問首頁
語法:index file...;
默認:index index.html;
配置塊:http脆炎、server梅猿、location
  • 該配置塊的主要作用是將用戶訪問的某個地址映射到首頁,在進行首頁查找時秒裕,會按照順序查詢index參數(shù)后的文件袱蚓,如果存在,則將其返回几蜻,如果不存在喇潘,則繼續(xù)查找下一個。比如如下示例:
location / {
  root path;
  index /index.html /html/index.php /index.php
}

當接收到用戶的/請求后梭稚,其首先會查詢/path/index.html文件是否存在颖低,如果不存在,則查詢下一個/path/html/index.php是否存在弧烤,如果存在忱屑,則直接返回,依此類推。

3.4 根據(jù)http返回碼重定向頁面
語法:error_page code[code...][=|=answer-code]uri|@named_location
配置塊:http莺戒、server伴嗡、location、if
  • 該配置的主要作用是从铲,如果當前請求返回了指定的狀態(tài)碼瘪校,那么就將其重定向到后面的錯誤頁面。如:
error_page 404 /404.html
error_page 502 503 504 /50x.html
error_page 403 http://example.com/forbidden.html
error_page 404 = @fetch;

需要注意的是名段,即使重定向了URI渣淤,返回的HTTP狀態(tài)碼還是原來的狀態(tài)碼,如果需要修改狀態(tài)碼吉嫩,可以使用=來修改原來的狀態(tài)碼价认,如:

error_page 404 =200 /empty.gif;
error_page 404 =403 /forbidden.gif;

也可以不指定修改后的狀態(tài)碼,而是由重定向后的請求決定其返回的狀態(tài)碼:

error_page 404 = /empty.gif;

在重定向后自娩,也可以不修改URI用踩,而是將這個請求重定向到另一個location中進行處理,比如:

location / {
  error_page 404 @fallback;
}

location @fallback {
  proxy_pass http://backend;
}
3.5 是否支持遞歸的使用error_page
語法:recursive_error_pages [on|off];
默認:recursive_error_pages off;
配置塊:http忙迁、server脐彩、location;
  • 該配置主要用于控制是否支持遞歸的定義error_page。
3.6 try_files
語法:try_files path1[path2]uri;
配置塊:server姊扔、location
  • 該參數(shù)的主要作用是在用戶請求到達之后惠奸,會依次嘗試其后指定的各個path路徑,如果匹配上了恰梢,那么就將該路徑的值直接返回佛南。如果都沒有匹配上,那么就會使用最后的uri作為默認處理路徑嵌言。示例如:
try_files /system/maintenance.html $uri $uri/index.html $uri.html @other
location @other {
  proxy_pass http://backend;
}

4. 內(nèi)存及磁盤資源的分配

4.1 http包體只存儲到磁盤文件中
語法:client_body_in_file_only on|clean|off;
默認:client_body_in_file_only off;
配置塊:http嗅回、server、location
  • 當值配置為非off時摧茴,用戶請求的http包體一律存儲到磁盤文件中绵载,即使只有0字節(jié)也會存儲為文件。當請求結(jié)束時苛白,如果配置為on娃豹,則這個文件不會被刪除,如果配置為clean购裙,則會刪除該文件懂版。
4.2 http包體盡量寫入到一個內(nèi)存buffer中
語法:client_body_in_single_buffer on|off;
默認:client_body_in_single_buffer off;
配置塊:http、server缓窜、location
  • 用戶請求的http包體一律存儲到內(nèi)存buffer中定续,如果存儲的包體大小超過了client_body_buffer_size指定的大小谍咆,那么該請求還是會存儲到磁盤文件中。
4.3 存儲http頭部的內(nèi)存buffer大小
語法:client_header_buffer_size size;
默認:client_header_buffer_size 1k;
配置塊:http私股、server
  • 該參數(shù)指定了用戶請求的http頭部的size大小摹察,如果請求頭部大小超過了該數(shù)值,那么就會將請求就會交由large_client_header_buffers參數(shù)定義的buffer處理倡鲸。
4.4 存儲超大http頭部的內(nèi)存buffer大小
語法:large_client_header_buffers number size;
默認:large_client_header_buffers 48k;
配置塊:http供嚎、server
  • 該參數(shù)主要是在用戶的請求頭部信息超過了client_header_buffer_size所能存儲的大小時使用,該參數(shù)定義了每個header所能傳輸?shù)臄?shù)據(jù)的大小峭状,以及最多能夠傳輸多少個header克滴。如果單個header大小超限,則會返回414(Request URI too large)狀態(tài)碼优床,如果是header個數(shù)超限劝赔,則會返回400(Bad Request)狀態(tài)碼。
4.5 存儲http包體的內(nèi)存buffer的大小
語法:client_body_buffer_size size;
默認:client_body_buffer_size 8k/16k;
配置塊:http胆敞、server着帽、location
  • 該參數(shù)指定了nginx接收用戶http請求的包體buffer的大小,如果超過了該大小移层,那個請求包體將會存儲到磁盤文件中仍翰。
  • 需要注意的是,如果用戶請求的header中包含Content-Length观话,并且其標識的長度小于上述參數(shù)指定的長度予借,那么就會自動降低此次請求所使用的buffer大小。
4.6 http包體的臨時存放目錄
語法:client_body_temp_path dir-path[level1[level2[level3]]]
默認:client_body_temp_path client_body_temp;
配置塊:http频蛔、server灵迫、location
  • 該參數(shù)的主要作用是指定了存儲http包體的磁盤目錄,后面的level表示可以有幾級子目錄帽驯,這是因為如果請求比較多龟再,那么生成的文件就會比較多,頻繁的訪問同一個目錄可能會降低性能尼变,因而可以設(shè)置多級子目錄用于文件的存放;

  • 需要注意的是浆劲,上述level參數(shù)表示的是所生成的目錄名占有目標文件名字符的個數(shù)嫌术,比如生成的目標文件名為00000123456,而上述參數(shù)按如下配置:

client_body_temp_path /opt/nginx/client_temp 1 2;

那么nginx就會截取目標文件名的最后1個字符作為一級目錄牌借,倒數(shù)第二個和第三個總共兩個字符作為二級目錄度气,最終文件將會存儲在如下目錄:

/opt/nginx/client_temp/6/45/00000123456
  • nginx在生成目標文件時,其文件名是以順序遞增的整數(shù)進行命名的膨报。
4.7 connection_pool_size
語法:connection_pool_size size;
默認:connection_pool_size 256;
配置塊:http磷籍、server
  • 該參數(shù)指定了nginx為每個建立成功的TCP連接預(yù)先分配的內(nèi)存池大小适荣,size指定的是預(yù)先分配的內(nèi)存池大小。
  • 該參數(shù)需要謹慎配置院领,因為更大的配置將會消耗服務(wù)器更多的內(nèi)存弛矛,而更小的配置將會導(dǎo)致服務(wù)器為了擴容而進行更多次的內(nèi)存分配。
4.8 request_pool_size
語法:request_pool_size size;
默認:request_pool_size 4k;
配置塊:http比然、server
  • nginx在接收到每個http請求時丈氓,都會為其申請一個內(nèi)存池,該參數(shù)指定了該內(nèi)存池的大小强法,需要注意的是万俗,該內(nèi)存池本質(zhì)上就是從上面介紹的connection_pool_size內(nèi)存池中進行申請;

  • 在每次http請求結(jié)束時饮怯,其就會銷毀該請求申請的內(nèi)存池闰歪,而將其返還給connection_pool_size內(nèi)存池,而只有在此次TCP連接關(guān)閉時才會銷毀整個連接的內(nèi)存池蓖墅。

5. 網(wǎng)絡(luò)連接的設(shè)置

5.1 讀取http頭部的超時時間
語法:client_header_timeout time(默認單位:秒);
默認:client_header_timeout 60;
配置塊:http课竣、server、location
  • 在客戶端與服務(wù)器建立連接之后置媳,nginx會讀取客戶端發(fā)來的http頭部于樟,如果超過該參數(shù)指定的時間還未讀取到客戶端發(fā)來的字節(jié),就會認為其超時了拇囊,此時就會向客戶端返回408(Request timed out)狀態(tài)碼迂曲。
5.2 讀取http包體的超時時間
語法:client_body_timeout time(默認單位:秒);
默認:client_body_timeout 60;
配置塊:http、server寥袭、location
  • 該參數(shù)主要作用是指定nginx讀取請求包體的超時時間
5.3 發(fā)送響應(yīng)的超時時間
語法:send_timeout time;
默認:send_timeout 60;
配置塊:http路捧、server、location
  • 這個參數(shù)主要指定了nginx向客戶端發(fā)送響應(yīng)的超時時間传黄,如果客戶端一直沒有嘗試接收數(shù)據(jù)杰扫,那么nginx就會關(guān)閉這個連接。
5.4 reset_timeout_connection
語法:reset_timeout_connection on|off;
默認:reset_timeout_connection off;
配置塊:http膘掰、server章姓、location
  • 如果開啟了該參數(shù),在連接超時后识埋,nginx會向客戶端發(fā)送RST包來直接重置連接凡伊,并且會釋放服務(wù)器上關(guān)于該連接的所有緩存數(shù)據(jù)(如TCP滑動窗口等)。相比于正常關(guān)閉的方式窒舟,它使得服務(wù)器能夠避免產(chǎn)生許多處于FIN_WAIT_1系忙、FIN_WAIT_2TIME_WAIT狀態(tài)的TCP連接惠豺。

  • 需要注意的是银还,使用RST重置包關(guān)閉連接會帶來一些問題风宁,默認情況下不會開啟。

5.5 lingering_close
語法:lingering_close off|on|always;
默認:lingering_close on;
配置塊:http蛹疯、server戒财、location
  • 該配置塊控制nginx關(guān)閉用戶連接的方式。always表示關(guān)閉用戶連接前必須無條件的處理連接上所有用戶發(fā)送的數(shù)據(jù)苍苞。off表示關(guān)閉連接時完全不管連接上是否有用戶準備就緒的數(shù)據(jù)固翰。on是中間值,一般情況下在關(guān)閉連接前都會處理連接上的用戶發(fā)送的數(shù)據(jù)羹呵,除非某些時候業(yè)務(wù)上認定這些數(shù)據(jù)是不需要的骂际,此時就會拋棄這些數(shù)據(jù)。
5.6 lingering_time
語法:lingering_time time;
默認:lingering_time 30s;
配置塊:http冈欢、server歉铝、location
  • lingering_close啟用后,這個配置項主要是針對大文件的傳輸用的凑耻,比如當某個請求傳輸?shù)臄?shù)據(jù)超過了max_client_body_size時太示,nginx就會向該客戶端發(fā)送413(Request entity too large)狀態(tài)碼,但是某些客戶端可能不會理會該狀態(tài)碼而還是繼續(xù)向服務(wù)器發(fā)送數(shù)據(jù)香浩,此時nginx就會在該參數(shù)的超時時間之后直接關(guān)閉該連接类缤。
5.7 lingering_timeout
語法:lingering_timeout time;
默認:lingering_timeout 5s;
配置塊:http、server邻吭、location
  • lingering_close啟用后餐弱,nginx在關(guān)閉連接前,會檢測用戶連接上是否還有未處理的數(shù)據(jù)囱晴,如果在該參數(shù)指定的時間之后還沒有相應(yīng)的數(shù)據(jù)到達膏蚓,那么就會關(guān)閉該鏈接。
5.8 對某些瀏覽器禁用keepalive功能
語法:keepalive_disable [msie6|safari|none]...
默認:keepalive_disablemsie6 safari
配置塊:http畸写、server驮瞧、location
  • 該參數(shù)主要是指定對哪些瀏覽器禁用keepalive功能,keepalive會在客戶端與服務(wù)器之間建立一個長連接枯芬,這對于發(fā)送多個http請求是非常有用的论笔,但是對于IE6和以前版本,還有Safari瀏覽器在處理POST請求時會有功能性問題破停,因而對于這些瀏覽器默認是禁用的翅楼。
5.9 keepalive超時時間
語法:keepalive_timeout time(默認單位:秒);
默認:keepalive_timeout 75;
配置塊:http、server真慢、location
  • 該參數(shù)主要是在一個keepalive連接在指定時長內(nèi)沒有接收到新的請求時,將會關(guān)閉該連接理茎。
5.10 keepalive長連接上能夠承載的最大請求數(shù)
語法:keepalive_requests n;
默認:keepalive_requests 100;
配置塊:http黑界、server管嬉、location
  • 該參數(shù)指定了一個keepalive長連接上能夠承載的最大連接數(shù),默認為100朗鸠。
5.11 tcp_nodelay
語法:tcp_nodelay on|off;
默認:tcp_nodelay on;
配置塊:http蚯撩、server、location
  • 確定對keepalive連接是否使用TCP_NODELAY選項
5.12 tcp_nopush
語法:tcp_nopush on|off;
默認:tcp_nopush off;
配置塊:http烛占、server胎挎、location
  • 在打開sendfile選項時,確定是否開啟FreeBSD系統(tǒng)上的TCP_NOPUSH或者Linux系統(tǒng)上的TCP_CORK功能忆家。打開tcp_nopush后犹菇,將會在發(fā)送響應(yīng)時把整個響應(yīng)包頭放到一個TCP包中發(fā)送。

6. MIME類型的設(shè)置

6.1 MIME type與文件擴展的映射
語法:type {...};
配置塊:http芽卿、server揭芍、location
  • 該配置項定義了MIME type到文件擴展名的映射。多個擴展名可以映射到同一個MIME type卸例。例如:
types {
  text/html html;
  text/html conf;
  image/gif gif;
  image/jpeg jpg;
}
6.2 默認MIME type
語法:default_type MIME-type;
默認:default_type text/plain;
配置塊:http称杨、server、location
  • 當找不到相應(yīng)的MIME type與文件擴展名之間的映射時筷转,使用默認的MIME type作為http header的Content-Type姑原。
6.3 types_hash_bucket_size
語法:types_hash_max_size size;
默認:types_hash_max_size 1024;
配置塊:http、server呜舒、location
  • nginx使用了一個散列表來保存MIME type與文件擴展名之間的映射锭汛,該參數(shù)就是指定該散列表桶的大小的。
6.4 types_hash_max_size
語法:types_hash_max_size size;
默認:types_hash_max_size 1024;
配置塊:http阴绢、server店乐、location
  • 該參數(shù)指定了存儲MIME type與文件擴展名的散列的最大大小,該值越大呻袭,散列的key就越稀疏眨八,檢索速度越快,但是會占用更多的內(nèi)存左电;該值越小廉侧,占用的內(nèi)存越小,但是沖突率就會上升篓足,檢索越慢段誊。

7. 對客戶端請求的限制

7.1 按http方法名限制用戶請求
語法:limit_except method...{...}
配置塊:location
  • 該配置項的主要作用是限制某些方法的請求的訪問,后面的參數(shù)可取GET栈拖、HEAD连舍、POST、DELETE涩哟、MKCOL索赏、COPY盼玄、MOVE、OPTIONS潜腻、PROPFIND埃儿、PROPPATCH、LOCK融涣、UNLOCK或者PATCH童番。示例如:
limit_except GET {
  allow 192.168.1.0/32;
  deny all;
}

上述配置將會限制所有的GET請求的訪問,而允許其他方法的請求威鹿。

7.2 http請求包體的最大值
語法:client_max_body_size size;
默認:client_max_body_size 1m;
配置塊:http剃斧、server、location
  • 該參數(shù)指定了http請求的最大包體的大小专普,nginx會根據(jù)請求header中的Content-Length所表示的長度來判斷其與當前參數(shù)是否符合悯衬,如果不符合,則直接返回給客戶端413(Request too large)狀態(tài)碼檀夹。
7.3 對請求的限速
語法:limit_rate speed;
默認:limit_rate 0;
配置塊:http筋粗、server、location炸渡、if
  • 該配置主要是對客戶端的請求進行每秒傳輸?shù)淖止?jié)大小進行限速娜亿,默認為0,表示不限速蚌堵;

  • 針對不同的客戶端买决,可以使用$limit_rate參數(shù)執(zhí)行不同的限速策略。如:

server {
  if ($slow) {
    set $limit_rate 4k;
  }
}
7.4 limit_rate_after
語法:limit_rate_after time;
默認:limit_rate_after 1m;
配置塊:http吼畏、server督赤、location、if
  • 該參數(shù)表示nginx向客戶端發(fā)送的響應(yīng)大小超過limit_rate_after指定的值之后才開始限速泻蚊。

8. 文件操作的優(yōu)化

8.1 sendfile系統(tǒng)調(diào)用
語法:sendfile on|off;
默認:sendfile off;
配置塊:http躲舌、server、location
  • 該參數(shù)用于打開Linux上的sendfile系統(tǒng)調(diào)用性雄,在發(fā)送數(shù)據(jù)到網(wǎng)卡上時没卸,它減少了兩次在用戶態(tài)與內(nèi)核態(tài)之間的數(shù)據(jù)拷貝過程,而直接在磁盤讀取數(shù)據(jù)之后發(fā)送到網(wǎng)卡上秒旋,從而提升數(shù)據(jù)發(fā)送效率约计。
8.2 AIO系統(tǒng)調(diào)用
語法:aio on|off;
默認:aio off;
配置塊:http、server迁筛、location
  • 該參數(shù)指定了是否在FreeBSD或Linux系統(tǒng)上啟動內(nèi)核級別的異步文件I/O功能煤蚌,需要注意的是,其與sendfile功能是互斥的。
8.3 directio
語法:directio size|off;
默認:directio off;
配置塊:http铺然、server俗孝、location
  • 該配置項在FreeBSD和Linux系統(tǒng)上使用O_DIRECT選項去讀取文件酒甸,緩沖區(qū)大小為size魄健,通常對大文件的讀取速度有優(yōu)化作用。注意插勤,它與sendfile指令是互斥的沽瘦。
8.4 directio_alignment
語法:directio_alignment size;
默認:directio_alignment 512;
配置塊:http、server农尖、location
  • 它與directio配合使用析恋,指定以directio方式讀取文件時的對其方式。一般情況下盛卡,512B已經(jīng)足夠了助隧,但對于一些高性能文件系統(tǒng),如Linux下的XFS文件系統(tǒng)滑沧,可能需要設(shè)置4KB作為對齊方式并村。
8.5 打開文件緩存
語法:open_file_cache max=N[inactive=time]|off;
默認:open_file_cache off;
配置塊:http、server滓技、location
  • 文件緩存會在內(nèi)存中存儲以下三種信息:
    文件句柄哩牍、文件大小和上次修改時間;
    已經(jīng)打開過的目錄結(jié)構(gòu)令漂;
    沒有找到的或者沒有權(quán)限操作的文件信息膝昆;

  • 上面的配置項的三個參數(shù)的含義如下:
    max:表示內(nèi)存中存儲元素的最大個數(shù)。當達到最大限制數(shù)量后叠必,將采用LRU算法從緩存中淘汰最近最少使用的元素荚孵;
    inactive:表示在inactive指定的時間段內(nèi)沒有被訪問過的元素將會被淘汰。默認時間為60秒纬朝;
    off:關(guān)閉緩存功能收叶。

  • 示例如下:

open_file_cache max=1000 inactive=20s;
8.6 是否緩存打開文件錯誤的信息
語法:open_file_cache_errors on|off;
默認:open_file_cache_errors off;
配置塊:http、server玄组、location
  • 該配置項表示是否對打開文件時找不到文件或者權(quán)限錯誤等信息進行緩存滔驾。
8.7 不被淘汰的最小訪問次數(shù)
語法:open_file_cache_min_uses number;
默認:open_file_cache_min_uses 1;
配置塊:http、server俄讹、location
  • 該參數(shù)與open_file_cache配合使用哆致,如果在指定時間內(nèi)訪問該文件的次數(shù)小于該參數(shù)指定的次數(shù),那么該文件還是會被淘汰患膛。
8.8 檢驗緩存中元素有效性的頻率
語法:open_file_cache_valid time;
默認:open_file_cahce_valid 60s;
配置塊:http摊阀、server、location
  • 該參數(shù)指定了每間隔多長時間檢查一下緩存中數(shù)據(jù)的有效性,默認為60秒胞此。

9. 對客戶端請求的特殊處理

9.1 忽略不合法的http頭部
語法:ignore_invalid_headers on|off;
默認:ignore_invalid_headers on;
配置塊:http臣咖、server
  • 如果將其設(shè)置為off,那么當客戶端請求中有不合法的header時漱牵,就會直接響應(yīng)400(Bad Request)夺蛇;如果將其設(shè)置為on,那么就會忽略此header酣胀。
9.2 http頭部是否允許下劃線
語法:underscores_in_headers on|off;
默認:underscores_in_headers off;
配置塊:http刁赦、server
  • 該參數(shù)指定了http頭部中是否能夠帶有下劃線,默認是不允許闻镶。
9.3 對If-Modified-Since頭部的處理策略
語法:if_modified_since [off|exact|before];
默認:if_modified_since exact;
配置塊:http甚脉、server、location
  • If-Modified-Since頭部主要是瀏覽器處于性能考慮而作的一個緩存策略铆农,瀏覽器在請求過一份文件之后牺氨,會將該文件在本地緩存,并記錄緩存時間墩剖,在下次請求時會在If-Modified-Since頭部中帶上上次緩存的時間猴凹,服務(wù)器在接收到該請求時,會將服務(wù)器文件的修改時間與請求中的時間進行比較涛碑,如果文件在這之后有過修改精堕,那么服務(wù)器就會正常的返回文件內(nèi)容以及200狀態(tài)碼,如果文件沒有修改過蒲障,那么說明瀏覽器中緩存的文件是最新的歹篓,此時就會返回304(Not Modified)狀態(tài)碼。

  • 該配置參數(shù)有三個選項揉阎,其含義分別如下:

off:表示忽略用戶請求中的If-Modified-Since頭部庄撮,在每次請求時都將文件內(nèi)容返回,此時響應(yīng)狀態(tài)碼為200毙籽;

exact:將If-Modified-Since頭部包含的時間與將要返回的文件的上次修改時間做精確比較洞斯,如果沒有匹配上,則返回200和文件的實際內(nèi)容坑赡,如果匹配上了烙如,則表示文件內(nèi)容已經(jīng)是最新的,此時就會返回304(Not Modified)狀態(tài)碼毅否,瀏覽器收到后會直接讀取本地緩存亚铁;

before:這個是比exact更寬松的策略,只要文件的上次修改時間在用戶請求的If-Modified-Since頭部指定的時間之前螟加,那么就會向客戶端返回304(Not Modified)狀態(tài)碼徘溢。

9.4 文件未找到時是否返回error日志
語法:log_not_found on|off;
默認:log_not_found on;
配置塊:http吞琐、server、location
  • 該配置的主要作用在于然爆,當用戶請求某個文件時站粟,如果該文件不存在,是否將這條信息記錄在error日志中曾雕,主要用于定位問題猾蒂。
9.5 merge_slashes
語法:merge_slashes on|off;
默認:merge_slashes on;
配置塊:http问畅、server烛芬、location
  • 該配置項表示是否合并相鄰的/抒痒,例如//test///a.txt,在配置為on時修械,會將其匹配為location/test/a.txt;如果配置為off检盼,則不會匹配肯污,URI將仍然是//test///a.txt。
9.6 DNS解析地址
語法:resolver address...;
配置塊:http吨枉、server蹦渣、location
  • 設(shè)置DNS名字解析服務(wù)器的地址,如:
resolver 127.0.0.1 192.0.2.1;
9.7 DNS解析的超時時間
語法:resolver_timeout time;
默認:resolver_timeout 30s;
配置塊:http貌亭、server柬唯、location
  • 次配置項表示DNS解析的超時時間

9.8 返回錯誤頁面時是否在server中注明nginx版本

語法:server_tokens on|off;
默認:server_tokens on;
配置塊:http、server圃庭、location
  • 表示在返回錯誤頁面時是否在Server頭部中返回具體的nginx版本锄奢,這主要是為了定位問題方便。

對 JAVA 開發(fā)有興趣的朋友歡迎加入QQ群:833145934 里面資深架構(gòu)師會分享一些整理好的錄制視頻錄像和BATJ面試題:有Spring剧腻,MyBatis拘央,Netty源碼分析,高并發(fā)书在、高性能灰伟、分布式、微服務(wù)架構(gòu)的原理儒旬,JVM性能優(yōu)化栏账、分布式架構(gòu)等這些成為架構(gòu)師必備的知識體系。還能領(lǐng)取免費的學(xué)習(xí)資源栈源,目前受益良多挡爵。

共同探討!

原文:https://my.oschina.net/zhangxufeng/blog/3120456

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凉翻,一起剝皮案震驚了整個濱河市了讨,隨后出現(xiàn)的幾起案子捻激,更是在濱河造成了極大的恐慌,老刑警劉巖前计,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胞谭,死亡現(xiàn)場離奇詭異,居然都是意外死亡男杈,警方通過查閱死者的電腦和手機丈屹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伶棒,“玉大人旺垒,你說我怎么就攤上這事》粑蓿” “怎么了先蒋?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長宛渐。 經(jīng)常有香客問我竞漾,道長,這世上最難降的妖魔是什么窥翩? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任业岁,我火速辦了婚禮,結(jié)果婚禮上寇蚊,老公的妹妹穿的比我還像新娘笔时。我一直安慰自己,他們只是感情好仗岸,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布允耿。 她就那樣靜靜地躺著,像睡著了一般爹梁。 火紅的嫁衣襯著肌膚如雪右犹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天姚垃,我揣著相機與錄音念链,去河邊找鬼。 笑死积糯,一個胖子當著我的面吹牛掂墓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播看成,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼君编,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了川慌?” 一聲冷哼從身側(cè)響起吃嘿,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤祠乃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后兑燥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體亮瓷,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年降瞳,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘱支。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡挣饥,死狀恐怖除师,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扔枫,我是刑警寧澤汛聚,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站茧吊,受9級特大地震影響贞岭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搓侄,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望话速。 院中可真熱鬧讶踪,春花似錦、人聲如沸泊交。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽廓俭。三九已至云石,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間研乒,已是汗流浹背汹忠。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留雹熬,地道東北人宽菜。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像竿报,于是被迫代替她去往敵國和親铅乡。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內(nèi)容