HTTP核心模塊(HTTP Core)

 

摘要

Nginx處理HTTP的核心功能模塊php

指令

 

aio

語法:aio [on|off|sendfile]
默認值:off
使用字段:http, server, location
這個指令在Linux內核2.6.1922以上版本可使用,對於Linux內核,這個指令須要配合directio指令,使用這個指令將自動關閉sendfile支持。
 html

location /video {
    aio on; 
    directio 512; 
    output_buffers 1 128k;
}

在FreeBSD5.2.1以前版本和Nginx0.8.12,你必須手工關閉sendfile:
 node

location /video {
    aio on; 
    sendfile off;
    output_buffers 1 128k;
}

一樣也能夠和sendfile一塊兒使用(FreeBSD5.2.1和Nginx0.8.12):linux

location /video {
    aio sendfile; 
    sendfile on;
    tcp_nopush on;
}

alias

語法:alias file-path|directory-path;
默認值:no
使用字段:location
這個指令爲一個location指定一個路徑,注意它可能相似於root,可是document root沒有改變,請求只是使用了別名目錄的文件。這個location自身爲「丟棄的」,具體請看下面的例子:
 nginx

location  /i/ {
  alias  /spool/w3/p_w_picpaths/;
}

上個例子總,請求」/i/top.gif」將返回這個文件: 」/spool/w3/p_w_picpaths/top.gif」。正如你所看到的,uri中location後面的部分會追加到這個目錄後面,而location自身是「丟棄的」,若是使用root指令的話會進行完整的追加,如上例中,若是使用root指令則返回:」/spool/w3/p_w_picpaths/i/top.gif」
Alias一樣能夠用於帶正則表達式的location,如:
 web

location ~ ^/download/(.*)$ {
  alias /home/website/files/$1;
}

請求」/download/book.pdf」將返回」/home/website/files/book.pdf」。一樣注意,uri中location後面的部分會追加到這個目錄後面。
一樣,也能夠在別名目錄字段中使用變量。
 正則表達式

chunked_transfer_encoding

語法:chunked_transfer_encoding on|off;
默認值:on
使用字段:http, server, location
指定是否在響應時啓用chunked編碼(只能使用於HTTP1.1版本以上的鏈接)。
 chrome

client_body_in_file_only

語法:client_body_in_file_only on|off
默認值:off
使用字段:http, server, location
這個指令始終存儲一個鏈接請求實體到一個文件即便它只有0字節。
注意:若是這個指令打開,那麼一個鏈接請求完成後,所存儲的文件並不會刪除。
這個指令能夠用於debug調試和嵌入式Perl模塊中的$r→request_body_file方法。
 apache

client_body_in_single_buffer

語法:client_body_in_single_buffer
默認值:off
使用字段:http, server, location
這個指令(0.7.58版本)指定是否將客戶端鏈接請求完整的放入一個緩衝區,當使用變量$request_body時推薦使用這個指令以減小複製操做。
若是沒法將一個請求放入單個緩衝區,將會被放入磁盤。vim

client_body_buffer_size

語法:client_body_buffer_size the_size
默認值:8k/16k
使用字段:http, server, location
這個指令能夠指定鏈接請求實體的緩衝區大小。
若是鏈接請求超過緩存區指定的值,那麼這些請求實體的總體或部分將嘗試寫入一個臨時文件。
默認值爲兩個內存分頁大小值,根據平臺的不一樣,多是8k或16k。
當請求頭中的Content-Length字段小於指定的buffer size,那麼Nginx將使用較小的一個,因此nginx並不老是爲每個請求分配這個buffer size大小的buffer。

client_body_temp_path

語法:client_body_temp_path dir-path [ level1 [ level2 [ level3 ]
默認值:client_body_temp
使用字段:http, server, location
指令指定鏈接請求實體試圖寫入的臨時文件路徑。
能夠指定三級目錄結構,如:
 

client_body_temp_path  /spool/nginx/client_temp 1 2;

那麼它的目錄結構多是這樣:
 

/spool/nginx/client_temp/7/45/00000123457

client_body_timeout

語法:client_body_timeout time
默認值:60
使用字段:http, server, location
指令指定讀取請求實體的超時時間。
這裏的超時是指一個請求實體沒有進入讀取步驟,若是鏈接超過這個時間而客戶端沒有任何響應,Nginx將返回一個」Request time out」 (408)錯誤
 

client_header_buffer_size

語法:client_header_buffer_size size
默認值:1k
使用字段:http, server
指令指定客戶端請求頭部的緩衝區大小
絕大多數狀況下一個請求頭不會大於1k
不過若是有來自於wap客戶端的較大的cookie它可能會大於1k,Nginx將分配給它一個更大的緩衝區,這個值能夠在large_client_header_buffers裏面設置。
 

client_header_timeout

語法:client_header_timeout time
默認值:60
使用字段:http, server
指令指定讀取客戶端請求頭標題的超時時間。
這裏的超時是指一個請求頭沒有進入讀取步驟,若是鏈接超過這個時間而客戶端沒有任何響應,Nginx將返回一個」Request time out」 (408)錯誤。
 

client_max_body_size

語法:client_max_body_size size
默認值:client_max_body_size 1m
使用字段:http, server, location
指令指定容許客戶端鏈接的最大請求實體大小,它出如今請求頭部的Content-Length字段。
若是請求大於指定的值,客戶端將收到一個」Request Entity Too Large」 (413)錯誤。
記住,瀏覽器並不知道怎樣顯示這個錯誤。
 

connection_pool_size

語法:connection_pool_size the_size
默認值:connection_pool_size the_size 256
使用字段:http (或許能夠用到其餘地方?)
爲每一個請求分配的內存池,內存池用於小配額內存塊,若是一個塊大於內存池或者大於分頁大小,那麼它將被分配到內存池以外,若是位於內存池中較小的分配量沒有足夠的內存,那麼將分配一個相同內存池大小的新塊,這個指令僅有至關有限的效果(來源http://markmail.org/message/b2kmrluscevimpba

default_type

語法: default_type MIME-type
默認值:default_type text/plain
使用字段:http, server, location
某個文件在標準MIME視圖沒有指定的狀況下的默認MIME類型。
參考types
 

directio

語法:directio [size|off]
默認值:directio off
使用字段:http, server, location
這個參數指定在讀取文件大小大於指定值的文件時使用O_DIRECT(FreeBSD, Linux),F_NOCACHE(Mac OS X)或者調用directio()函數(Solaris),當一個請求用到這個參數時會禁用sendfile,一般這個參數用於大文件。
 

directio  4m;

error_page

語法:error_page code [ code… ] [ = | =answer-code ] uri | @named_location
默認值:no
使用字段:http, server, location, location 中的if字段
這個參數能夠爲錯誤代碼指定相應的錯誤頁面
 

error_page   404          /404.html;
error_page   502 503 504  /50x.html;
error_page   403          http://example.com/forbidden.html;
error_page   404          = @fetch;

一樣,你也能夠將原有的響應代碼修改成另外一個響應代碼,例如:
 

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

另外你可使用等號(=)指定你本身編寫的錯誤處理程序返回相應的響應代碼:
 

error_page   404  =  /404.php;

若是在重定向時不須要改變URI,能夠將錯誤頁面重定向到一個命名的location字段中:
 

location / (
    error_page 404 @fallback;
)

location @fallback (
    proxy_pass http://backend;
)

if_modified_since

語法:if_modified_since [off|exact|before]
默認值:if_modified_since exact
使用字段:http, server, location
指令(0.7.24)定義如何將文件最後修改時間與請求頭中的」If-Modified-Since」時間相比較。
 

  • off :不檢查請求頭中的」If-Modified-Since」(0.7.34)。
     
  • exact:精確匹配
     
  • before:文件修改時間應小於請求頭中的」If-Modified-Since」時間
     

internal

語法:internal
默認值:no
使用字段: location
internal指令指定某個location只能被「內部的」請求調用,外部的調用請求會返回」Not found」 (404)
「內部的」是指下列類型:
 

  • 指令error_page重定向的請求。
     
  • ngx_http_ssi_module模塊中使用include virtual指令建立的某些子請求。
     
  • ngx_http_rewrite_module模塊中使用rewrite指令修改的請求。
     

一個防止錯誤頁面被用戶直接訪問的例子:
 

error_page 404 /404.html;
location  /404.html {
  internal;
}


 

keepalive_disable

語法:keepalive_disable [ msie6 | safari | none ]…
默認值:msie6 safari
使用字段:http, server, location
爲某些瀏覽器禁用keepalive(0.9.0後版本可用),在POST請求後的MS Internet Explorer (6.0sp2之前版本)與Safari在默認狀況下會禁用keepalive。

keepalive_timeout

語法:keepalive_timeout [ time ] [ time ]
默認值:keepalive_timeout 75
使用字段:http, server, location
參數的第一個值指定了客戶端與服務器長鏈接的超時時間,超過這個時間,服務器將關閉鏈接。
參數的第二個值(可選)指定了應答頭中Keep-Alive: timeout=time的time值,這個值可使一些瀏覽器知道何時關閉鏈接,以便服務器不用重複關閉,若是不指定這個參數,nginx不會在應答頭中發送Keep-Alive信息。(但這並非指怎樣將一個鏈接「Keep-Alive」)
參數的這兩個值能夠不相同。
下面列出了一些服務器如何處理包含Keep-Alive的應答頭:
 

  • MSIE和Opera將Keep-Alive: timeout=N頭忽略。
     
  • MSIE保持一個鏈接大約60-65秒,而後發送一個TCP RST。
     
  • Opera將一直保持一個鏈接處於活動狀態。
     
  • Mozilla將一個鏈接在N的基礎上增長大約1-10秒。
     
  • Konqueror保持一個鏈接大約N秒。
     

keepalive_requests

語法:keepalive_requests n
默認值:keepalive_requests 100
使用字段:http, server, location
服務器保持長鏈接的請求數。
 

large_client_header_buffers

語法:large_client_header_buffers number size
默認值:large_client_header_buffers 4 4k/8k
使用字段:http, server
指定客戶端一些比較大的請求頭使用的緩衝區數量和大小。
請求字段不能大於一個緩衝區大小,若是客戶端發送一個比較大的頭,nginx將返回」Request URI too large」 (414)
一樣,請求的頭部最長字段不能大於一個緩衝區,不然服務器將返回」Bad request」 (400)。
緩衝區只在需求時分開。
默認一個緩衝區大小爲操做系統中分頁文件大小,一般是4k或8k,若是一個鏈接請求最終將狀態轉換爲keep-alive,它所佔用的緩衝區將被釋放。
 

limit_except

語法:limit_except methods {…}
默認值:no
使用字段:location
指令能夠在location字段中作一些http動做的限制。
ngx_http_access_module和ngx_http_auth_basic_module模塊有很強的訪問控制功能。
 

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

limit_rate

語法:limit_rate speed
默認值:no
使用字段:http, server, location, location中的if字段
限制將應答傳送到客戶端的速度,單位爲字節/秒,限制僅對一個鏈接有效,即若是一個客戶端打開2個鏈接,則它的速度是這個值乘以二。
因爲一些不一樣的情況,可能要在server字段來限制部分鏈接的速度,那麼這個參數並不適用,不過你能夠選擇設置$limit_rate變量的值來達到目的:
 

server {
  if ($slow) {
    set $limit_rate  4k;
  }
}

一樣能夠經過設置X-Accel-Limit-Rate頭(NginxXSendfile)來控制proxy_pass返回的應答(http代理模塊)。而且不借助X-Accel-Redirect頭來完成。
 

limit_rate_after

語法:limit_rate_after time
默認值:limit_rate_after 1m
使用字段:http, server, location, location中的if字段
在應答一部分被傳遞後限制速度:
 

limit_rate_after 1m;
limit_rate 100k;

lingering_close

語法:lingering_close on|off|always
默認值:lingering_close on
使用字段:http, server, location
在socket上啓用SO_LINGER 。

lingering_time

語法:lingering_time time
默認值:lingering_close 30s
使用字段:http, server, location
在socket上啓用SO_LINGER 。

lingering_timeout

語法:lingering_timeout time
默認值:lingering_timeout 5s
使用字段:http, server, location
在socket上啓用SO_LINGER 。

listen

語法: listen address:port [ default(0.8.21後已過期) | default_server | [ backlog=num | rcvbuf=size | sndbuf=size | accept_filter=filter | deferred | bind | ipv6only=[on|off] | ssl ] ]
默認值:listen 80
使用字段:server
listen指令指定了server{…}字段中能夠被訪問到的ip地址及端口號,能夠只指定一個ip,一個端口,或者一個可解析的服務器名。
 

listen 127.0.0.1:8000;
listen 127.0.0.1;
listen 8000;
listen *:8000;
listen localhost:8000;

ipv6地址格式(0.7.36)在一個方括號中指定:
 

listen [::]:8000;
listen [fe80::1];

在linux中默認使用IPv4 to IPv6視圖地址格式使IPv6的socket一樣對應IPv4的鏈路,例如, ::ffff:<IPv4地址格式>,示例, ::ffff:192.168.0.27對應192.168.0.27到一個IPv6地址。
若是你在listen指令中啓用[::]:80IPv6地址格式監聽80端口,在linux中默認它也會監聽IPv4端口,也就意味着IPv4和IPv6的地址都會被監聽,若是你在另一個指令中指定IPv4的地址,你將會在重啓nginx時獲得一個「already bind address」錯誤。
在linux中,若是你想講IPv4和IPv6地址分開監聽,能夠經過內核參數:net.ipv6.bindv6only,默認這個值是0。經過sysctl將這個值設置爲1。
注意:nginx實例(進程)在你修改上述參數以後可能會繼續IPv4鏈路的傳輸,你可能須要一個新的設置爲IPv6和IPv4包處理方法,請修改nginx配置文件而且重啓nginx。
若是在其餘server塊(vhost)中你想經過下面這個指令來監聽IPv4的地址:
 

listen [::]:80;

監聽IPv4的地址將會失敗,解決這個問題的方法是在listen中,當使用IPv6地址時增長ipv6only=on選項,而且在同一個server塊中寫一條監聽IPv4地址的指令:
修改配置文件應該是在你修改內核運行參數之後進行。
 

listen [::]:80 ipv6only=on; # 只監聽IPv6鏈路
listen 80; # 這條指令將監聽IPv4鏈路

在FreeBSD中默認是將IPv4和IPv6分離監聽的,這樣listen [::]:80僅監聽IPv6的鏈路,若是你想同時進行IPv4地址的監聽你可能須要另外寫一條指令。
經過使用default ipv6only=on選項能夠在listen指令中指定僅監聽IPv6地址,這樣在這個server塊中就能夠指定IPv6監聽地址,其餘server塊中一樣能夠指定IPv4地址:
 

listen [2a02:750:5::123]:80;
listen [::]:80 default_server ipv6only=on;

若是隻有ip地址指定,則默認端口爲80。
若是指令有default_server參數,那麼這個server塊將是經過「地址:端口」來進行訪問的默認服務器,這對於你想爲那些不匹配server_name指令中的主機名指定默認server塊的虛擬主機(基於域名)很是有用,若是沒有指令帶有default_server參數,那麼默認服務器將使用第一個server塊。在0.8.21版本之前這個參數名稱爲default。
listen容許一些不一樣的參數,即系統調用listen(2)和bind(2)中指定的參數,這些參數必須用在default參數以後:
 

  1. backlog=num – 指定調用listen(2)時backlog的值,默認爲-1。
     
  2. rcvbuf=size – 爲正在監聽的端口指定SO_RCVBUF。
     
  3. sndbuf=size – 爲正在監聽的端口指定SO_SNDBUF。
     
  4. accept_filter=filter – 指定accept-filter。
     
    • 僅用於FreeBSD,能夠有兩個過濾器,dataready與httcodeady,僅在最終版本的FreeBSD(FreeBSD: 6.0, 5.4-STABLE與4.11-STABLE)上,爲他們發送-HUP信號可能會改變accept-filter。
  5. deferred – 在linux系統上延遲accept(2)調用並使用一個輔助的參數: TCP_DEFER_ACCEPT。
     
  6. bind – 將bind(2)分開調用。
    • 主要指這裏的「地址:端口」,實際上若是定義了不一樣的指令監聽同一個端口,可是每一個不一樣的地址和某條指令均監聽爲這個端口的全部地址(*:port),那麼nginx只將bind(2)調用於*:port。這種狀況下經過系統調用getsockname()肯定哪一個地址上有鏈接到達,可是若是使用了parameters backlog, rcvbuf, sndbuf, accept_filter或deferred這些參數,那麼將老是將這個「地址:端口」分開調用。
  7. ssl – 參數(0.7.14)不將listen(2)和bind(2)系統調用關聯。
    • 被指定這個參數的listen將被容許工做在SSL模式,這將容許服務器同時工做在HTTP和HTTPS兩種協議下,例如:
listen  80;
listen  443 default_server ssl;

一個使用這些參數的完整例子:

listen  127.0.0.1 default_server accept_filter=dataready backlog=1024;

0.8.21版本之後nginx能夠監聽unix套接口:

listen unix:/tmp/nginx1.sock;

location

語法:location [=|~|~*|^~|@] /uri/ { … }
默認值:no
使用字段:server
這個參數根據URI的不一樣需求來進行配置,可使用字符串與正則表達式匹配,若是要使用正則表達式,你必須指定下列前綴:
 

  1. ~* 不區分大小寫。
     
  2. ~ 區分大小寫。
     

要肯定該指令匹配特定的查詢,程序將首先對字符串進行匹配,字符串匹配將做爲查詢的開始,最確切的匹配將被使用。而後,正則表達式的匹配查詢開始,匹配查詢的第一個正則表達式找到後會中止搜索,若是沒有找到正則表達式,將使用字符串的搜索結果。
在一些操做系統,如Mac OS X和Cygwin,字符串將經過不區分大小寫的方式完成匹配(0.7.7),可是,比較僅限於單字節的語言環境。
正則表達式能夠包含捕獲(0.7.40),並用於其它指令中。
可使用「^~」標記禁止在字符串匹配後檢查正則表達式,若是最確切的匹配location有這個標記,那麼正則表達式不會被檢查。
使用「=」標記能夠在URI和location之間定義精確的匹配,在精確匹配完成後並不進行額外的搜索,例若有請求「/」發生,則可使用「location = /」來加速這個處理。
即便沒有「=」和「^~」標記,精確的匹配location在找到後一樣會中止查詢。
下面是各類查詢方式的總結:
 

  1. 前綴「=」表示精確匹配查詢,若是找到,當即中止查詢。
     
  2. 指令仍然使用標準字符串,若是匹配使用「^~」前綴,中止查詢。
     
  3. 正則表達式按照他們在配置文件中定義的順序。
     
  4. 若是第三條產生一個匹配,這個匹配將被使用,不然將使用第二條的匹配。
     

例:
 

location  = / {
  # 只匹配 / 的查詢.
  [ configuration A ]
}
location  / {
  # 匹配任何以 / 開始的查詢,可是正則表達式與一些較長的字符串將被首先匹配。
  [ configuration B ]
}
location ^~ /p_w_picpaths/ {
  # 匹配任何以 /p_w_picpaths/ 開始的查詢而且中止搜索,不檢查正則表達式。
  [ configuration C ]
}
location ~* \.(gif|jpg|jpeg)$ {
  # 匹配任何以gif, jpg, or jpeg結尾的文件,可是全部 /p_w_picpaths/ 目錄的請求將在Configuration C中處理。
  [ configuration D ]
}

各請求的處理以下例:
 

  • / → configuration A
     
  • /documents/document.html → configuration B
     
  • /p_w_picpaths/1.gif → configuration C
     
  • /documents/1.jpg → configuration D
     

注意你能夠以任何順序定義這4個配置而且匹配結果是相同的,但當使用嵌套的location結構時可能會將配置文件變的複雜而且產生一些比較意外的結果。
標記「@」指定一個命名的location,這種location並不會在正常請求中執行,它們僅使用在內部重定向請求中。(查看error_pagetry_files

log_not_found

語法:log_not_found [on|off]
默認值:log_not_found on
使用字段:http, server, location
指令指定是否將一些文件沒有找到的錯誤信息寫入error_log指定的文件中。
 

log_subrequest

語法:log_subrequest [on|off]
默認值:log_subrequest off
使用字段:http, server, location
指令指定是否將一些通過rewrite rules和/或SSI requests的子請求日誌寫入access_log指定的文件中。
 

msie_padding

語法:msie_padding [on|off]
默認值:msie_padding on
使用字段:http, server, location
指令指定開啓或關閉MSIE瀏覽器和chrome瀏覽器(0.8.25+)的msie_padding特徵,當這個功能開啓,nginx將爲響應實體分配最小512字節,以便響應大於或等於400的狀態代碼。
指令預防在MSIE和chrome瀏覽器中激活「友好的」HTTP錯誤頁面,以便不在服務器端隱藏更多的錯誤信息。
 

msie_refresh

語法: msie_refresh [on|off]
默認值:msie_refresh off
使用字段:http, server, location
指令容許或拒絕爲MSIE發佈一個refresh而不是作一次redirect
 

open_file_cache

語法:open_file_cache max = N [inactive = time] | off
默認值:open_file_cache off
使用字段:http, server, location
這個指令指定緩存是否啓用,若是啓用,將記錄文件如下信息:
 

  • 打開的文件描述符,大小信息和修改時間。
     
  • 存在的目錄信息。
     
  • 在搜索文件過程當中的錯誤信息 – 沒有這個文件、沒法正確讀取,參考open_file_cache_errors
     

指令選項:
 

  • max - 指定緩存的最大數目,若是緩存溢出,最近最少使用的文件(LRU)將被移除。
     
  • inactive - 指定緩存文件被移除的時間,若是在這段時間內文件沒被下載,默認爲60秒。
     
  • off - 禁止緩存。
     

例:

 open_file_cache max=1000 inactive=20s;
 open_file_cache_valid    30s;
 open_file_cache_min_uses 2;
 open_file_cache_errors   on;

open_file_cache_errors

語法:open_file_cache_errors on | off
默認值:open_file_cache_errors off
使用字段:http, server, location
這個指令指定是否在搜索一個文件是記錄cache錯誤。

open_file_cache_min_uses

語法:open_file_cache_min_uses number
默認值:open_file_cache_min_uses 1
使用字段:http, server, location
這個指令指定了在open_file_cache指令無效的參數中必定的時間範圍內可使用的最小文件數,若是使用更大的值,文件描述符在cache中老是打開狀態。

open_file_cache_valid

語法:open_file_cache_valid time
默認值:open_file_cache_valid 60
使用字段:http, server, location
這個指令指定了什麼時候須要檢查open_file_cache中緩存項目的有效信息。

optimize_server_names

語法:optimize_server_names [ on|off ]
默認值:optimize_server_names on
使用字段:http, server
這個指令指定是否在基於域名的虛擬主機中開啓最優化的主機名檢查。
尤爲是檢查影響到使用主機名的重定向,若是開啓最優化,那麼全部基於域名的虛擬主機監聽的一個「地址:端口對」具備相同的配置,這樣在請求執行的時候並不進行再次檢查,重定向會使用第一個server name。
若是重定向必須使用主機名而且在客戶端檢查經過,那麼這個參數必須設置爲off。
注意:這個參數不建議在nginx 0.7.x版本中使用,請使用server_name_in_redirect。

port_in_redirect

語法:port_in_redirect [ on|off ]
默認值:port_in_redirect on
使用字段:http, server, location
這個指令指定是否在讓nginx在重定向操做中對端口進行操做。
若是這個指令設置爲off,在重定向的請求中nginx不會在url中添加端口。

post_action

語法:post_action [ uri|off ]
默認值:post_action off
使用字段:http, server, location, location中的if字段
爲當前完成請求的子請求定義一個URI。
 

location /protected_files { 
	internal;
 
	proxy_pass http://127.0.0.2;
	post_action /protected_done;
}
# 發送post_action 請求到FastCGI後端進行登陸驗證。
location /protected_done {
	internal;
	fastcgi_pass 127.0.0.1:9000;
}

recursive_error_pages

語法:recursive_error_pages [on|off]
默認值:recursive_error_pages off
使用字段:http, server, location
recursive_error_pages指定啓用除第一條error_page指令之外其餘的error_page。

request_pool_size

語法:request_pool_size the_size
默認值:request_pool_size the_size 256
使用字段:http (或許能夠用到其餘地方?)
爲每一個請求分配的內存池,內存池用於小配額內存塊,若是一個塊大於內存池或者大於分頁大小,那麼它將被分配到內存池以外,若是位於內存池中較小的分配量沒有足夠的內存,那麼將分配一個相同內存池大小的新塊,這個指令僅有至關有限的效果(來源http://markmail.org/message/b2kmrluscevimpba

reset_timedout_connection

語法:reset_timedout_connection [on|off]
默認值:reset_timedout_connection off
使用字段:http, server, location
是否啓用重置timeout的鏈接,在socket關閉而且重置鏈接時,socket的SO_LINGER選項設置爲0timeout,這將強迫RST包發送到客戶端後關閉鏈接,從而釋放與之關聯的內存,這是socket處於FIN_WAIT1狀態。
注意若是socket使用keepalive鏈接,在通過定義的timeout時間後,將使用正常的方式關閉鏈接。

resolver

語法:resolver address
默認值:no
使用字段:http, server, location
指定DNS服務器地址,如:

resolver 127.0.0.1;

resolver_timeout

語法:resolver_timeout time
默認值:30s
使用字段:http, server, location
解析超時時間。如:

resolver_timeout 5s;

root

語法:root path
默認值:root html
使用字段:http, server, location ,location中的if字段
請求到達後的文件根目錄。
下例中:
 

location  /i/ {
  root  /spool/w3;
}

若是請求」/i/top.gif」文件,nginx將轉到」/spool/w3/i/top.gif」文件。你能夠在參數中使用變量。
注意:在請求中root會添加這個location到它的值後面,即」/i/top.gif」並不會請求」/spool/w3/top.gif」文件,若是要實現上述相似於apache alias的功能,可使用alias指令。

satisfy

語法: satisfy [ all | any ]
默認值: satisfy all
使用字段:http, server, location
可用版本: ≥ 0.6.25
若是在一個字段中同時使用了Access模塊Auth Basic模塊的指令,可使用這個指令肯定一種驗證方式:
 

  • all - 必須同時匹配Access Auth Basic中指令指定的權限。
     
  • any - 具備Access Auth Basic指令任一權限便可經過匹配
location / {
  satisfy any;
  allow 192.168.1.0/32;
  deny all;
  auth_basic "closed site";
  auth_basic_user_file conf/htpasswd;
}

satisfy_any

語法:satisfy_any [ on|off ]
默認值:satisfy_any off
使用字段:location
0.6.25版本之後請使用satisfy

send_timeout

語法:send_timeout the time
默認值:send_timeout 60
使用字段:http, server, location
指令指定了發送給客戶端應答後的超時時間,Timeout是指沒有進入完整established狀態,只完成了兩次握手,若是超過這個時間客戶端沒有任何響應,nginx將關閉鏈接。
 

sendfile

語法:sendfile [ on|off ]
默認值:sendfile off
使用字段:http, server, location
是否啓用sendfile()函數。
sendfile()函數在一個文件描述符與另外一個之間拷貝數據,因爲這個拷貝過程是在內核狀態下完成,sendfile()函數比read(2)和write(2)函數更加高效,後者須要從用戶空間中傳送文件。
更多sendfile信息:https://www.kernel.org/doc/man-pages/online/pages/man2/sendfile.2.html
使用sendfile優化性能:http://www.techrepublic.com/article/use-sendfile-to-optimize-data-transfer/1044112

server

語法:server {…}
默認值:no
使用字段:http
server字段包含虛擬主機的配置。
沒有明確的機制來分開基於域名(請求中的主機頭)和基於IP的虛擬主機。
能夠經過listen指令來指定必須鏈接到這個server塊的全部地址和端口,而且在server_name指令中能夠指定全部的域名。
 

server_name

語法:server_name name [… ]
默認值:server_name hostname
使用字段:server
這個指令有兩個做用:
1、將HTTP請求的主機頭與在nginx配置文件中的server{…}字段中指定的參數進行匹配,而且找出第一個匹配結果。這就是如何定義虛擬主機的方法,域名遵循下述優先級規則:
 

  1. 完整匹配的名稱。
     
  2. 名稱開始於一個文件通配符:*.example.com。
     
  3. 名稱結束於一個文件通配符:www.example.*。
     
  4. 使用正則表達式的名稱。
     

若是沒有匹配的結果,nginx配置文件將安裝如下優先級使用[#server server { … }]字段:
 

  1. listen指令被標記爲default的server字段。
     
  2. 第一個出現listen(或者默認的listen 80)的server字段。
     

2、若是server_name_in_redirect被設置,這個指令將用於設置HTTP重定向的服務器名。
例:
 

server {
  server_name   example.com  www.example.com;
}

第一個名稱爲服務器的基本名稱,默認名稱爲機器的hostname。
固然,可使用文件通配符:
 

server {
  server_name   example.com  *.example.com  www.example.*;
}

上述例子中的前兩個名稱能夠合併爲一個:
 

server {
  server_name  .example.com;
}

一樣可使用正則表達式。名稱前面加「~」:
 

server {
  server_name   www.example.com   ~^www\d+\.example\.com$;
}

0.7.12版本之後已經能夠支持空服務器名,以處理那些沒有主機頭的請求,可是請注意,大多數的瀏覽器會爲請求增長一個「Host」頭,若是其鏈接包含IP,請經過listen指令給他指定一個默認監聽的server塊。
 

server {
  server_name "";
}

0.8.25版本之後能夠在server_name中使用命名的捕獲:

server {
  server_name   ~^(www\.)?(?<domain>.+)$;
  root  /sites/$domain;
}

一些老的PCRE版本在使用此語法的時候可能會引發部分問題,能夠嘗試如下語法修復:

server {
  server_name   ~^(www\.)?(?P<domain>.+)$;
  root  /sites/$domain;
}

0.9.4版本(含)之後,$hostname變量能夠做爲server_name的參數:

server {
  server_name $hostname;
}

server_name_in_redirect

語法:server_name_in_redirect on|off
默認值:server_name_in_redirect on
使用字段:http, server, location
若是這個指令打開,nginx將使用server_name指定的基本服務器名做爲重定向地址,若是關閉,nginx將使用請求中的主機頭。
注意:若是一個header中的Location字段來自一個上游代理服務器(例如經過proxy_pass),可能不併不只僅須要這個指令,事實上,它會被忽略,若是你看到返回的上游服務器的服務器名沒有通過重寫,你須要使用proxy_redirect來重寫上游服務器提供的服務器名稱,例如:proxy_redirect http://some.upstream.url/ /,它將http://some.upstream.url/重寫爲」/「,這是一個相對路徑

server_names_hash_max_size

語法:server_names_hash_max_size number
默認值:server_names_hash_max_size 512
使用字段:http
服務器名稱哈希表的最大值,更多信息請參考nginx部分優化

server_names_hash_bucket_size

語法:server_names_hash_bucket_size number
默認值:server_names_hash_bucket_size 32/64/128
使用字段:http
服務器名稱哈希表每一個頁框的大小,這個指令的默認值依賴於cpu緩存。更多信息請參考nginx部分優化

server_tokens

語法:server_tokens on|off
默認值:server_tokens on
使用字段:http, server, location
是否在錯誤頁面和服務器頭中輸出nginx版本信息。

tcp_nodelay

語法:tcp_nodelay [on|off]
默認值:tcp_nodelay on
使用字段:http, server, location
這個指令指定是否使用socket的TCP_NODELAY選項,這個選項只對keep-alive鏈接有效。
點擊這裏瞭解更多關於TCP_NODELAY選項的信息。

tcp_nopush

語法:tcp_nopush [on|off]
默認值:tcp_nopush off
使用字段:http, server, location
這個指令指定是否使用socket的TCP_NOPUSH(FreeBSD)或TCP_CORK(linux)選項,這個選項只在使用sendfile時有效。
設置這個選項的將致使nginx試圖將它的HTTP應答頭封裝到一個包中。
點擊這裏查看關於TCP_NOPUSH和TCP_CORK選項的更多信息。

try_files

語法:try_files path1 [path2] uri
默認值:none
使用字段:server, location
可用版本:0.7.27
按照指定的順序檢查存在的文件,而且返回第一個找到的結果,尾部跟隨一個目錄名,若是全部的文件都沒有找到,那麼將啓用最後一個參數命名的內部重定向,最後一個參數所指定的命名location必須被設置,不然將產生一個內部錯誤。不像rewrite,若是$args變量並不會自動保留,若是你須要保留請求參數,請參照以下配置:
 

try_files $uri $uri/ /index.php?q=$uri&$args;

例(在代理Mongrel時使用):
 

try_files /system/maintenance.html $uri $uri/index.html $uri.html @mongrel;
 
location @mongrel {
  proxy_pass http://mongrel;
}

注意,0.7.51版本後你能夠指定一個HTTP狀態代碼在try_file的最後一個參數中,例如:
 

location / {
  try_files $uri $uri/ /error.php?c=404 =404;
}

當參數中的請求(除最後一個外)都沒有正常響應,那麼將返回404。
在Drupal / FastCGI中使用
 

# for drupal 6:
try_files $uri $uri/ @drupal;
 
# for drupal 7:
try_files $uri $uri/ /index.php?q=$request_uri;
 
# only needed for Drupal 6 (或者你須要一個命名的location)
location @drupal {
  rewrite ^ /index.php?q=$uri last; # for drupal 6
}
 
location ~ \.php$ {
  fastcgi_pass 127.0.0.1:8888;
  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; # if not already defined in the fastcgi_params file
  # any other specific fastcgi_params
}

下面這個例子中,指令try_files:
 

location / {
  try_files $uri $uri/ @drupal;
}

至關於這個指令:
 

location / {
  error_page     404 = @drupal;
  log_not_found  off;
}

或者這個:

if (-e $request_filename) {
   rewrite ^ /index.php?q=$uri last;
}

try_files基本上是一個對檢查是否存在mod_rewrite樣式的文件(相似於/directory)的替換,它比if的效率更高,參考IfIsEvil
在Wordcodess和Joomla中使用:

# wordcodess (不使用WP Super Cache) - 示例 1
try_files $uri $uri/ /index.php?q=$uri&$args;
 
# wordcodess (不使用WP Super Cache) - 示例 2 (實際上並不須要"q"參數)
try_files $uri $uri/ /index.php;
 
# joomla
try_files $uri $uri/ /index.php?q=$uri&$args;
 
location ~ \.php$ {
  fastcgi_pass 127.0.0.1:8888;
  fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name; # 若是在fastcgi_params文件中沒有定義
  # 其餘一些指定的fastcgi_params.
}

WP Super Cache須要成堆的靜態文件檢查,這裏不對其進行討論。

types

語法:types {…}
使用字段:http, server, location
這個字段指定一些擴展的文件對應方式與應答的MIME類型,一個MIME類型能夠有一些與其相似的擴展。默認使用如下文件對應方式:
 

types {
  text/html    html;
  p_w_picpath/gif    gif;
  p_w_picpath/jpeg   jpg;
}

完整的對應視圖文件爲conf/mime.types,而且將被包含。
若是你想讓某些特定的location的處理方式使用MIME類型:application/octet-stream,可使用如下配置:
 

location /download/ {
  types         { }
  default_type  application/octet-stream;
}

underscores_in_headers

語法:underscores_in_headers on|off
默認值:off
使用字段:http, server
是否容許在header的字段中帶下劃線。

variables_hash_bucket_size

語法:variables_hash_bucket_size size
默認值:variables_hash_bucket_size 64
使用字段:http
變量:無
爲變量哈希表指定關鍵字欄大小。

variables_hash_max_size

語法:variables_hash_max_size size
默認值:variables_hash_max_size 512
使用字段:http
變量:無
哈希表的最大值,查看更多信息請參考nginx部分優化選項中的哈希表。

變量

core module 支持一些內置的變量,與apache使用的變量相一致。
首先,一些變量表明瞭客戶端請求頭部的一些字段,如:$http_user_agent, $http_cookie等等。注意,因爲這些變量會在請求中定義,因此可能沒法保證他們是存在的或者說能夠定義到一些別的地方(例如遵循必定的規範)。
除此以外,下列是一些其餘變量:

$arg_PARAMETER

這個變量包含在查詢字符串時GET請求PARAMETER的值。

$args

這個變量等於請求行中的參數。

$binary_remote_addr

二進制碼形式的客戶端地址。

$body_bytes_sent

應答實體大小,即便鏈接失敗或中斷,它也很是精確。

$content_length

請求頭中的Content-length字段。

$content_type

請求頭中的Content-Type字段。

$cookie_COOKIE

cookie COOKIE的值。

$document_root

當前請求在root指令中指定的值。

$document_uri

與$uri相同。

$host

請求中的Host字段,若是請求中的Host字段不可用,則爲服務器處理請求的服務器名稱。
在下列狀況下,$host變量的值可能和$http_host的值不相同:

  1. 當請求頭中的Host字段未指定或者爲空值,$host等於server_name指令指定的值。
     
  2. 當Host字段包含端口號時,$host並不包含端口號,$host的值在0.8.17後老是小寫。
     

$hostname

gethostname返回的機器名稱。

$is_args

若是$args設置,值爲」?」,不然爲」「。

$limit_rate

這個變量能夠限制鏈接速率。

$nginx_version

當前運行的nginx版本號。

$query_string

與$args相同。

$remote_addr

客戶端的IP地址。

$remote_port

客戶端的端口。

$remote_user

已經通過Auth Basic Module驗證的用戶名。

$request_filename

當前鏈接請求的文件路徑,由root或alias指令與URI請求生成。

$request_body

這個變量(0.7.58+)包含請求的主要信息。在使用proxy_passfastcgi_pass指令的location中比較有意義。

$request_body_file

客戶端請求主體信息的臨時文件名。

$request_completion

若是請求成功,值爲」OK」,若是請求未完成或者請求不是一個範圍請求的最後一部分,則爲空。

$request_method

這個變量是客戶端請求的動做,一般爲GET或POST。
包括0.8.20及以前的版本中,這個變量總爲main request中的動做,若是當前請求是一個子請求,並不使用這個當前請求的動做。

$request_uri

這個變量等於包含一些客戶端請求參數的原始URI,它沒法修改,請查看$uri更改或重寫URI,不包含主機名,例如:」/foo/bar.php?arg=baz」。

$scheme

HTTP方法(如http,https)。按需使用,例:
 

rewrite  ^  $scheme://example.com$uri  redirect;

$server_addr

服務器地址,在完成一次系統調用後能夠肯定這個值,若是要繞開系統調用,則必須在listen中指定地址而且使用bind參數。

$server_name

服務器名稱。

$server_port

請求到達服務器的端口號。

$server_protocol

請求使用的協議,一般是HTTP/1.0或HTTP/1.1。

$uri

請求中的當前URI(不帶請求參數,參數位於$args),能夠不一樣於瀏覽器傳遞的$request_uri的值,它能夠經過內部重定向,或者使用index指令進行修改,$uri不包含主機名,如」/foo/bar.html」。

參考文檔

相關文章
相關標籤/搜索