天天看點

Nginx LOCATOIN塊配置

1 比對模式優先級

Nginx LOCATOIN塊配置
location = /uri    =開頭表示精确比對,隻有完全比對上才能生效。
location ^~ /uri   ^~ 開頭對URL路徑進行字首比對,并且在正則之前。無正則普通比對(^ 表示“非”,~ 表示“正則”,字元意思是:不要繼續比對正則)
location ~ pattern  ~開頭表示區分大小寫的正則比對。!~為區分大小寫不比對的正則
location ~* pattern  ~*開頭表示不區分大小寫的正則比對。!~*為不區分大小寫不比對的正則
location /uri     不帶任何修飾符,也表示字首比對,但是在正則比對之後。
location /      通用比對,任何未比對到其它location的請求都會比對到,相當于switch中的default。
           

注意:

字首比對,如果有包含關系時,按最大比對原則進行比對。比如在字首比對:location /dir1與location /dir1/dir2,如有請求http://localhost/dir1/dir2/file将最終比對到location /dir1/dir2

優先級:

(location =) > (location 完整路徑) > (location ^~ 路徑) > (location ,* 正則順序) > (location 部分起始路徑) > (/)

上述的優先級不完全正确

具體規則:

等号類型(=)的優先級最高。一旦比對成功,則不再查找其他location的比對項

剩下的幾種比對優先級略複雜,具體可以參考Nginx文檔(http://nginx.org/en/docs/http/ngx_http_core_module.html#location)

  • ^~和普通比對。

    使用字首比對,不支援正規表達式,如果有多個location比對成功的話,不會終止比對過程,會記憶表達式最長的那個。

  • 如果上一步得到的最長的location為^~類型,則表示阻斷正規表達式,不再比對正規表達式
  • 如果上一步得到的最長的location不是^~類型,繼續比對正規表達式,隻要有一個正則成功,則使用這個正則的location,立即傳回結果,并結束解析過程

“最長”命中

^~和普通命中,都是優先使用比對最長的結果,示例如下:

例子1

location /test_1 {
    return 400;
}
location ^~ /test {
    return 401;
}
           

如上如果path為/test_1,傳回的是400,說明^~優先級并不比普通比對高

例子2

location /test_1 {
    return 400;
}
location ^~ /test {
    return 401;
}
location ~ /test {
    return 402;
}
           

如上如果path為/test_1,傳回的是402,此時^~和普通比對隻記住了最長一個location /test_1,不會阻止正則

如果path為/test,傳回401,此時^~和普通比對隻記住了最長一個location ^~ /test,會阻止正則

2 路徑替換

規則

配置proxy_pass時,可以實作URL路徑的部分替換。

proxy_pass的目标位址,預設不帶/,表示隻代理域名,url和querystring部分不會變(把請求的path拼接到proxy_pass目标域名之後作為代理的URL)。

如果在目标位址後增加/,則表示把path中location比對成功的部分剪切掉之後再拼接到proxy_pass目标位址。

比如請求 /a/b.html

location /a {
    proxy_pass http://server;
}
           
location /a/ {
    proxy_pass http://server/;
}
           

如上兩個比對成功後,實際代理的目标url分别是

http://server/a/b.html (把/a/b.html拼接到http://server之後)

http://server/b.html (把/a/b.html的/a/去掉之後,拼接到http://server/之後)

通過 Nginx Server 通路

http://nginx/nginx_location/some/path

proxy_pass

直接映射到主機的

/test

建議location和proxy_pass後面都加上/,否則容易引起混亂。
location proxy_pass 實際通路目标

/nginx_location/

http://server/test/

http://server/test/some/path

要求

注意的是,對于location為正規表達式的比對,proxy_pass的目标位址不可以帶/

比如,如下配置會報錯:

location ~ /abc(.*) {
    proxy_pass   http://127.0.0.1/;
}
           

如果是正規表達式,想要實作proxy_pass的路徑替換,可以使用如下方式:

location ~ /abc(.*) {
    proxy_pass   http://127.0.0.1/$1;
}
           

3 root和alias的使用

nginx指定檔案路徑有兩種方式root和alias,

root與alias主要差別在于nginx如何解釋location後面的uri,

這會使兩者分别以不同的方式将請求映射到伺服器檔案上。

3.1 最基本的差別

alias 指定的目錄是準确的,給location指定一個目錄。

root 指定目錄的上級目錄,并且該上級目錄要含有locatoin指定名稱的同名目錄。

以root方式設定資源路徑:

文法: root path;
配置塊: http、server、location、if
           

以alias 方式設定資源路徑

文法: alias path;
配置塊: location
           

Example:

location /img/ {
	alias /var/www/image/;
}
#若按照上述配置的話,則通路/img/目錄裡面的檔案時,ningx會自動去/var/www/image/目錄找檔案
location /img/ {
	root /var/www/image;
}
#若按照這種配置的話,則通路/img/目錄下的檔案時,nginx會去/var/www/image/img/目錄下找檔案
           
1.使用alias時,目錄名後面一定要加”/“。
2.使用alias标簽的目錄塊中不能使用rewrite的break。
3.alias在使用正則比對時,必須捕捉要比對的内容并在指定的内容處使用。
4.alias隻能位于location塊中
           

是以使用nginx設定root時要注意一個問題,就是如果該root設定的前端目錄不是根目錄,那麼在寫root的絕對位址時,要把前端目錄的部分省略掉。

我們用設定虛拟目錄指向的alias來和root比較一下就非常明顯了

location /abc/ {   alias /home/html/abc/; }  
           

在這段配置下,http://test/abc/a.html就指定的是 /home/html/abc/a.html。這段配置亦可改成

location /abc/ {   root /home/html/;} 
           

可以看到,使用root設定目錄的絕對路徑時,少了/abc,也就是說,使用root來設定前端非根目錄時,nginx會組合root和location的路徑,即 /home/html/abc/。

4 try_files指令

Syntax:	try_files file ... uri;
try_files file ... =code;
Default:	—
Context:	server, location
           

示例

try_files $uri $uri/ /test/;
           

功能:依次試圖通路多個url對應的檔案(由root或者alias指令指定),當檔案存在是直接傳回檔案内容,如果所有檔案都不存在,則按最後一個URL結果或者code傳回

5 stub_status

配置示例

location /basic_status {
	stub_status;
}
           

ngx_http_stub_status_module子產品內建的狀态頁

用于輸出nginx的基本狀态資訊;

server{
....
	location /ngxstatus {
		stub_status;
	}
}
           

資訊頁傳回數值:

Active connections: 291
server accepts handled requests
16630948 16630948 31070465
Reading: 6 Writing: 179 Waiting: 106
           
  • Active connections: 活動狀态的連接配接數;
  • accepts:已經接受的用戶端請求的總數;
  • handled:已經處理完成的用戶端請求的總數;
  • requests:用戶端發來的總的請求數;
  • Reading:處于讀取用戶端請求封包首部的連接配接的連接配接數;
  • Writing:處于向用戶端發送響應封包過程中的連接配接數;
  • Waiting:處于等待用戶端送出請求的空閑連接配接數;

本文版權歸作者所有,歡迎轉載,請務必添加原文連結。

繼續閱讀