1. 程式人生 > >nginx教程第六篇:用HTTP核心模組配置一個靜態Web伺服器(二)

nginx教程第六篇:用HTTP核心模組配置一個靜態Web伺服器(二)

網路連線的設定

下面介紹網路連線的設定配置項:

1. 讀取HTTP頭部的超時時間
語法: client_header_timeout time( 預設單位: 秒) ;
預設: client_header_timeout 60;
配置塊: http、 server、 location

客戶端與伺服器建立連線後將開始接收HTTP頭部, 在這個過程中, 如果在一個時間間
隔( 超時時間) 內沒有讀取到客戶端發來的位元組, 則認為超時, 並向客戶端返回
408(“Request timed out”)響應。

2. 讀取HTTP包體的超時時間
語法: client_body_timeout time( 預設單位: 秒) ;
預設: client_body_timeout 60;
配置塊: http、 server、 location

此配置項與client_header_timeout相似, 只是這個超時時間只在讀取HTTP包體時才有
效。

3. 傳送響應的超時時間
語法: send_timeout time;
預設: send_timeout 60;
配置塊: http、 server、 location

這個超時時間是傳送響應的超時時間, 即Nginx伺服器向客戶端傳送了資料包, 但客戶
端一直沒有去接收這個資料包。 如果某個連線超過send_timeout定義的超時時間, 那麼Nginx
將會關閉這個連線。

4. reset_timeout_connection
語法: reset_timeout_connection on|off;
預設: reset_timeout_connection off;
配置塊: http、 server、 location

連線超時後將通過向客戶端傳送RST包來直接重置連線。 這個選項開啟後, Nginx會在某
個連線超時後, 不是使用正常情形下的四次握手關閉TCP連線, 而是直接向用戶傳送RST重
置包, 不再等待使用者的應答, 直接釋放Nginx伺服器上關於這個套接字使用的所有快取( 如
TCP滑動視窗) 。 相比正常的關閉方式, 它使得伺服器避免產生許多處於FIN_WAIT_1、
FIN_WAIT_2、 TIME_WAIT狀態的TCP連線。
注意, 使用RST重置包關閉連線會帶來一些問題, 預設情況下不會開啟。

5. lingering_close
語法: lingering_close off|on|always;
預設: lingering_close on;
配置塊: http、 server、 location

該配置控制Nginx關閉使用者連線的方式。 always表示關閉使用者連線前必須無條件地處理連
接上所有使用者傳送的資料。 off表示關閉連線時完全不管連線上是否已經有準備就緒的來自用
戶的資料。 on是中間值, 一般情況下在關閉連線前都會處理連線上的使用者傳送的資料, 除了
有些情況下在業務上認定這之後的資料是不必要的。

6. lingering_time
語法: lingering_time time;
預設: lingering_time 30s;
配置塊: http、 server、 location

lingering_close啟用後, 這個配置項對於上傳大檔案很有用。 上文講過, 當用戶請求的
Content-Length大於max_client_body_size配置時, Nginx服務會立刻向用戶傳送413( Request
entity too large) 響應。 但是, 很多客戶端可能不管413返回值, 仍然持續不斷地上傳HTTP
body, 這時, 經過了lingering_time設定的時間後, Nginx將不管使用者是否仍在上傳, 都會把連
接關閉掉。

7. lingering_timeout
語法: lingering_timeout time;
預設: lingering_timeout 5s;
配置塊: http、 server、 location

lingering_close生效後, 在關閉連線前, 會檢測是否有使用者傳送的資料到達伺服器, 如果
超過lingering_timeout時間後還沒有資料可讀, 就直接關閉連線; 否則, 必須在讀取完連線緩
衝區上的資料並丟棄掉後才會關閉連線。

8. 對某些瀏覽器禁用keepalive功能
語法: keepalive_disable [msie6|safari|none]...
預設: keepalive_disablemsie6 safari
配置塊: http、 server、 location

HTTP請求中的keepalive功能是為了讓多個請求複用一個HTTP長連線, 這個功能對服務
器的效能提高是很有幫助的。 但有些瀏覽器, 如IE 6和Safari, 它們對於使用keepalive功能的
POST請求處理有功能性問題。 因此, 針對IE 6及其早期版本、 Safari瀏覽器預設是禁用
keepalive功能的。

9. keepalive超時時間
語法: keepalive_timeout time( 預設單位: 秒) ;
預設: keepalive_timeout 75;
配置塊: http、 server、 location

一個keepalive連線在閒置超過一定時間後( 預設的是75秒) , 伺服器和瀏覽器都會去關
閉這個連線。 當然, keepalive_timeout配置項是用來約束Nginx伺服器的, Nginx也會按照規範
把這個時間傳給瀏覽器, 但每個瀏覽器對待keepalive的策略有可能是不同的。

10. 一個keepalive長連線上允許承載的請求最大數
語法: keepalive_requests n;
預設: keepalive_requests 100;
配置塊: http、 server、 location

一個keepalive連線上預設最多隻能傳送100個請求。

11. tcp_nodelay
語法: tcp_nodelay on|off;
預設: tcp_nodelay on;
配置塊: http、 server、 location

確定對keepalive連線是否使用TCP_NODELAY選項。

12. tcp_nopush
語法: tcp_nopush on|off;
預設: tcp_nopush off;
配置塊: http、 server、 location

在開啟sendfile選項時, 確定是否開啟FreeBSD系統上的TCP_NOPUSH或Linux系統上的
TCP_CORK功能。 開啟tcp_nopush後, 將會在傳送響應時把整個響應包頭放到一個TCP包中
傳送。

MIME型別的設定

下面是MIME型別的設定配置項:

1. MIME type與副檔名的對映
語法: type{...};
配置塊: http、 server、 location

定義MIME type到副檔名的對映。 多個副檔名可以對映到同一個MIME type。 例如:
types {
	text/html html;
	text/html conf;
	image/gif gif;
	image/jpeg jpg;
}
2. 預設MIME type
語法: default_type MIME-type;
預設: default_type text/plain;
配置塊: http、 server、 location

當找不到相應的MIME type與副檔名之間的對映時, 使用預設的MIME type作為
HTTP header中的Content-Type。

3. types_hash_bucket_size
語法: types_hash_bucket_size size;
預設: types_hash_bucket_size 32|64|128;
配置塊: http、 server、 location

為了快速尋找到相應MIME type, Nginx使用散列表來儲存MIME type與副檔名。
types_hash_bucket_size設定了每個雜湊桶佔用的記憶體大小。

4. types_hash_max_size
語法: types_hash_max_size size;
預設: types_hash_max_size 1024;
配置塊: http、 server、 location

types_hash_max_size影響散列表的衝突率。 types_hash_max_size越大, 就會消耗更多的內
存, 但雜湊key的衝突率會降低, 檢索速度就更快。 types_hash_max_size越小, 消耗的記憶體就
越小, 但雜湊key的衝突率可能上升。

對客戶端請求的限制

下面介紹對客戶端請求的限制的配置項:

1. 按HTTP方法名限制使用者請求
語法: limit_except method...{...}
配置塊: location

nginx通過limit_except後面指定的方法名來限制使用者請求。 方法名可取值包括: GET、
HEAD、 POST、 PUT、 DELETE、 MKCOL、 COPY、 MOVE、 OPTIONS、 PROPFIND、
PROPPATCH、 LOCK、 UNLOCK或者PATCH。 例如:

limit_except GET {
	allow 192.168.1.0/32;
	deny all;
}

注意, 允許GET方法就意味著也允許HEAD方法。 因此, 上面這段程式碼表示的是禁止
GET方法和HEAD方法, 但其他HTTP方法是允許的。

2. HTTP請求包體的最大值
語法: client_max_body_size size;
預設: client_max_body_size 1m;
配置塊: http、 server、 location

瀏覽器在傳送含有較大HTTP包體的請求時, 其頭部會有一個Content-Length欄位,
client_max_body_size是用來限制Content-Length所示值的大小的。 因此, 這個限制包體的配置
非常有用處, 因為不用等Nginx接收完所有的HTTP包體——這有可能消耗很長時間——就可
以告訴使用者請求過大不被接受。 例如, 使用者試圖上傳一個10GB的檔案, Nginx在收完包頭
後, 發現Content-Length超過client_max_body_size定義的值, 就直接傳送413(“Request Entity
Too Large”)響應給客戶端。

3. 對請求的限速
語法: limit_rate speed;
預設: limit_rate 0;
配置塊: http、 server、 location、 if

此配置是對客戶端請求限制每秒傳輸的位元組數。預設引數為0, 表示不限速。
針對不同的客戶端, 可以用$limit_rate引數執行不同的限速策略。 例如:

server {
	if ($slow) {
		set $limit_rate 4k;
	}
}
4. limit_rate_after
語法: limit_rate_after time;
預設: limit_rate_after 1m;
配置塊: http、 server、 location、 if

此配置表示Nginx向客戶端傳送的響應長度超過limit_rate_after後才開始限速。 例如:

limit_rate_after 1m;
limit_rate 100k;

檔案操作的優化

下面介紹檔案操作的優化配置項:

1. sendfile系統呼叫
語法: sendfile on|off;
預設: sendfile off;
配置塊: http、 server、 location

可以啟用Linux上的sendfile系統呼叫來發送檔案, 它減少了核心態與使用者態之間的兩次
記憶體複製, 這樣就會從磁碟中讀取檔案後直接在核心態傳送到網絡卡裝置, 提高了傳送檔案的
效率。

2. AIO系統呼叫
語法: aio on|off;
預設: aio off;
配置塊: http、 server、 location

此配置項表示是否在FreeBSD或Linux系統上啟用核心級別的非同步檔案I/O功能。
注意,它與sendfile功能是互斥的。

3. directio
語法: directio size|off;
預設: directio off;
配置塊: http、 server、 location

此配置項在FreeBSD和Linux系統上使用O_DIRECT選項去讀取檔案, 緩衝區大小為size,
通常對大檔案的讀取速度有優化作用。
注意, 它與sendfile功能是互斥的。

4. directio_alignment
語法: directio_alignment size;
預設: directio_alignment 512;
配置塊: http、 server、 location

它與directio配合使用, 指定以directio方式讀取檔案時的對齊方式。 一般情況下, 512B
已經足夠了, 但針對一些高效能檔案系統, 如Linux下的XFS檔案系統, 可能需要設定到4KB
作為對齊方式。

5. 開啟檔案快取
語法: open_file_cache max=N[inactive=time]|off;
預設: open_file_cache off;
配置塊: http、 server、 location

檔案快取會在記憶體中儲存以下3種資訊:

  • 檔案控制代碼、 檔案大小和上次修改時間。
  • 已經開啟過的目錄結構。
  • 沒有找到的或者沒有許可權操作的檔案資訊。
    這樣, 通過讀取快取就減少了對磁碟的操作。

該配置項後面跟3種引數:

·max: 表示在記憶體中儲存元素的最大個數。 當達到最大限制數量後, 將採用
LRU( Least Recently Used) 演算法從快取中淘汰最近最少使用的元素。
·inactive: 表示在inactive指定的時間段內沒有被訪問過的元素將會被淘汰。 預設時間為:60秒。
·off: 關閉快取功能。

例如:
open_file_cache max=1000 inactive=20s;
6. 是否快取開啟檔案錯誤的資訊
語法: open_file_cache_errors on|off;
預設: open_file_cache_errors off;
配置塊: http、 server、 location

此配置項表示是否在檔案快取中快取開啟檔案時出現的找不到路徑、 沒有許可權等錯誤信
息。

7. 不被淘汰的最小訪問次數
語法: open_file_cache_min_uses number;
預設: open_file_cache_min_uses 1;
配置塊: http、 server、 location

它與open_file_cache中的inactive引數配合使用。 如果在inactive指定的時間段內, 訪問次
數超過了open_file_cache_min_uses指定的最小次數, 那麼將不會被淘汰出快取。

8. 檢驗快取中元素有效性的頻率
語法: open_file_cache_valid time;
預設: open_file_cache_valid 60s;
配置塊: http、 server、 location

預設為每60秒檢查一次快取中的元素是否仍有效。

對客戶端請求的特殊處理

下面介紹對客戶端請求的特殊處理的配置項:

1. 忽略不合法的HTTP頭部
語法: ignore_invalid_headers on|off;
預設: ignore_invalid_headers on;
配置塊: http、 server

如果將其設定為off, 那麼當出現不合法的HTTP頭部時, Nginx會拒絕服務, 並直接向用
戶傳送400( Bad Request) 錯誤。 如果將其設定為on, 則會忽略此HTTP頭部。

2. HTTP頭部是否允許下劃線
語法: underscores_in_headers on|off;
預設: underscores_in_headers off;
配置塊: http、 server

預設為off, 表示HTTP頭部的名稱中不允許帶“_”( 下劃線) 。

3. 對If-Modified-Since頭部的處理策略
語法: if_modified_since [off|exact|before];
預設: if_modified_since exact;
配置塊: http、 server、 location

出於效能考慮, Web瀏覽器一般會在客戶端本地快取一些檔案, 並存儲當時獲取的時
間。 這樣, 下次向Web伺服器獲取快取過的資源時, 就可以用If-Modified-Since頭部把上次獲
取的時間捎帶上, 而if_modified_since將根據後面的引數決定如何處理If-Modified-Since頭
部。

相關引數說明如下:

·off: 表示忽略使用者請求中的If-Modified-Since頭部。 這時, 如果獲取一個檔案, 那麼會
正常地返回檔案內容。 HTTP響應碼通常是200。
·exact: 將If-Modified-Since頭部包含的時間與將要返回的檔案上次修改的時間做精確比
較, 如果沒有匹配上, 則返回200和檔案的實際內容, 如果匹配上, 則表示瀏覽器快取的文
件內容已經是最新的了, 沒有必要再返回檔案從而浪費時間與帶寬了, 這時會返回304 Not
Modified, 瀏覽器收到後會直接讀取自己的本地快取。
·before: 是比exact更寬鬆的比較。 只要檔案的上次修改時間等於或者早於使用者請求中
的If-Modified-Since頭部的時間, 就會向客戶端返回304 Not Modified。
4. 檔案未找到時是否記錄到error日誌
語法: log_not_found on|off;
預設: log_not_found on;
配置塊: http、 server、 location

此配置項表示當處理使用者請求且需要訪問檔案時, 如果沒有找到檔案, 是否將錯誤日誌
記錄到error.log檔案中。 這僅用於定位問題。

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。

6. DNS解析地址
語法: resolver address...;
配置塊: http、 server、 location

設定DNS名字解析伺服器的地址,
例如:

resolver 127.0.0.1 192.0.2.1;
7. DNS解析的超時時間
語法: resolver_timeout time;
預設: resolver_timeout 30s;
配置塊: http、 server、 location

此配置項表示DNS解析的超時時間。

8. 返回錯誤頁面時是否在Server中註明Nginx版本
語法: server_tokens on|off;
預設: server_tokens on;
配置塊: http、 server、 location

表示處理請求出錯時是否在響應的Server頭部中標明Nginx版本, 這是為了方便定位問
題。