徹底搞懂 Nginx 的五大應(yīng)用場(chǎng)景


user?mengday?staff;
http?{
????server?{
????????listen???????80;
????????server_name??localhost;
????????client_max_body_size?1024M;
????????#?默認(rèn)location
????????location?/?{
????????????root???/usr/local/var/www/html;
????????????index??index.html?index.htm;
????????}
????}
}
http://localhost/指向/usr/local/var/www/index.html, index.html是安裝Nginx自帶的html http://localhost/test.html指向/usr/local/var/www/html/test.html
server:用于定義服務(wù),http中可以有多個(gè)server塊 listen:指定服務(wù)器偵聽(tīng)請(qǐng)求的IP地址和端口,如果省略地址,服務(wù)器將偵聽(tīng)所有地址,如果省略端口,則使用標(biāo)準(zhǔn)端口 server_name:服務(wù)名稱(chēng),用于配置域名 location:用于配置映射路徑uri對(duì)應(yīng)的配置,一個(gè)server中可以有多個(gè)location,location后面跟一個(gè)uri,可以是一個(gè)正則表達(dá)式, / 表示匹配任意路徑, 當(dāng)客戶(hù)端訪問(wèn)的路徑滿(mǎn)足這個(gè)uri時(shí)就會(huì)執(zhí)行l(wèi)ocation塊里面的代碼 root:根路徑,當(dāng)訪問(wèn)http://localhost/test.html,“/test.html”會(huì)匹配到”/”uri,找到root為/usr/local/var/www/html,用戶(hù)訪問(wèn)的資源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html index:設(shè)置首頁(yè),當(dāng)只訪問(wèn)server_name時(shí)后面不跟任何路徑是不走root直接走index指令的;如果訪問(wèn)路徑中沒(méi)有指定具體的文件,則返回index設(shè)置的資源,如果訪問(wèn)http://localhost/html/?則默認(rèn)返回index.html
.:匹配除換行符以外的任意字符 ?:重復(fù)0次或1次 +* 重復(fù)1次或更多次 *:重復(fù)0次或更多次 \d:匹配數(shù)字 ^:匹配字符串的開(kāi)始 $:匹配字符串的結(jié)束 {n}:重復(fù)n次 {n,}:重復(fù)n次或更多次 [c]:匹配單個(gè)字符c [a-z]:匹配a-z小寫(xiě)字母的任意一個(gè) (a|b|c):屬線表示匹配任意一種情況,每種情況使用豎線分隔,一般使用小括號(hào)括括住,匹配符合a字符或是b字符或是c字符的字符串 \反斜杠:用于轉(zhuǎn)義特殊字符

http?{
????server?{
????????listen???????80;
????????server_name??localhost;
????????set?$doc_root?/usr/local/var/www;
????????#?默認(rèn)location
????????location?/?{
????????????root???/usr/local/var/www/html;
????????????index??index.html?index.htm;
????????}
????????location?^~?/images/?{
????????????root?$doc_root;
???????}
???????location?~*?\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$?{
???????????root?$doc_root/img;
???????}
????}
}
使用路徑,如/images/一般圖片都會(huì)放在某個(gè)圖片目錄下 使用后綴,如.jpg、.png等后綴匹配模式
=:進(jìn)行普通字符精確匹配。也就是完全匹配 ^~:前綴匹配。如果匹配成功,則不再匹配其他location ~:表示執(zhí)行一個(gè)正則匹配,區(qū)分大小寫(xiě) ~*:表示執(zhí)行一個(gè)正則匹配,不區(qū)分大小寫(xiě) /xxx/:常規(guī)字符串路徑匹配 /:通用匹配,任何請(qǐng)求都會(huì)匹配到
等號(hào)類(lèi)型(=)的優(yōu)先級(jí)最高。一旦匹配成功,則不再查找其他匹配項(xiàng),停止搜索。 ^~類(lèi)型表達(dá)式,不屬于正則表達(dá)式。一旦匹配成功,則不再查找其他匹配項(xiàng),停止搜索。 正則表達(dá)式類(lèi)型(~ ~*)的優(yōu)先級(jí)次之。如果有多個(gè)location的正則能匹配的話(huà),則使用正則表達(dá)式最長(zhǎng)的那個(gè)。 常規(guī)字符串匹配類(lèi)型。按前綴匹配。 / 通用匹配,如果沒(méi)有匹配到,就匹配通用的
location?=?/?{
????#?精確匹配/,主機(jī)名后面不能帶任何字符串?/
????[?configuration?A?]
}
location?/?{
????#?匹配所有以?/?開(kāi)頭的請(qǐng)求。
????#?但是如果有更長(zhǎng)的同類(lèi)型的表達(dá)式,則選擇更長(zhǎng)的表達(dá)式。
????#?如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。
????[?configuration?B?]
}
location?/documents/?{
????#?匹配所有以?/documents/?開(kāi)頭的請(qǐng)求,匹配符合以后,還要繼續(xù)往下搜索。
????#?但是如果有更長(zhǎng)的同類(lèi)型的表達(dá)式,則選擇更長(zhǎng)的表達(dá)式。
????#?如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。
????[?configuration?C?]
}
location?^~?/images/?{
????#?匹配所有以?/images/?開(kāi)頭的表達(dá)式,如果匹配成功,則停止匹配查找,停止搜索。
????#?所以,即便有符合的正則表達(dá)式location,也不會(huì)被使用
????[?configuration?D?]
}
location?~*?\.(gif|jpg|jpeg)$?{
????#?匹配所有以gif jpg jpeg結(jié)尾的請(qǐng)求。
????#?但是?以/images/開(kāi)頭的請(qǐng)求,將使用Configuration?D,D具有更高的優(yōu)先級(jí)
????[?configuration?E?]
}
location?/images/?{
????#?字符匹配到/images/,還會(huì)繼續(xù)往下搜索
????[?configuration?F?]
}
location?=?/test.htm?{
????root???/usr/local/var/www/htm;
????index??index.htm;
}
server?{
????listen???????80;
????server_name??localhost;
????location?/?{
????????proxy_pass?http://localhost:8081;
????????proxy_set_header?Host?$host:$server_port;
????????#?設(shè)置用戶(hù)ip地址
?????????proxy_set_header?X-Forwarded-For?$remote_addr;
?????????#?當(dāng)請(qǐng)求服務(wù)器出錯(cuò)去尋找其他服務(wù)器
?????????proxy_next_upstream?error?timeout?invalid_header?http_500?http_502?http_503;?
????}
}
upstream?web_servers?{??
???server?localhost:8081;??
???server?localhost:8082;??
}
server?{
????listen???????80;
????server_name??localhost;
????#access_log??logs/host.access.log??main;
????location?/?{
????????proxy_pass?http://web_servers;
????????#?必須指定Header?Host
????????proxy_set_header?Host?$host:$server_port;
????}
?}
upstream?test?{
????server?localhost:8081?weight=1;
????server?localhost:8082?weight=3;
????server?localhost:8083?weight=4?backup;
}
upstream?test?{
????ip_hash;
????server?localhost:8080;
????server?localhost:8081;
upstream?backend?{
????fair;
????server?localhost:8080;
????server?localhost:8081;
}
upstream?backend?{
????hash?$request_uri;
????hash_method?crc32;
????server?localhost:8080;
????server?localhost:8081;
}
upstream?web_servers?{??
???????server?localhost:8081;??
???????server?localhost:8082;??
}
server?{
????listen???????80;
????server_name??localhost;
????set?$doc_root?/usr/local/var/www;
????location?~*?\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$?{
???????root?$doc_root/img;
????}
????location?/?{
????????proxy_pass?http://web_servers;
????????#?必須指定Header?Host
????????proxy_set_header?Host?$host:$server_port;
????}
????error_page?500?502?503?504??/50x.html;??
????location?=?/50x.html?{??
????????root?$doc_root;
????}
?}
location?/permanently/moved/url?{
????return?301?http://www.example.com/moved/here;
}
location?/users/?{
????rewrite?^/users/(.*)$?/show?user=$1?break;
}
error_page?404?/404.html;
log_format??main??'$remote_addr?-?$remote_user?[$time_local]?"$request"?'
??????????????????????'$status?$body_bytes_sent?"$http_referer"?'
??????????????????????'"$http_user_agent"?"$http_x_forwarded_for"';
access_log??/usr/local/etc/nginx/logs/host.access.log??main;
gzip??on;
#?禁止訪問(wèn)某個(gè)目錄
location?~*?\.(txt|doc)${
????root?$doc_root;
????deny?all;
}
$args:#這個(gè)變量等于請(qǐng)求行中的參數(shù),同$query_string $content_length:請(qǐng)求頭中的Content-length字段。 $content_type:請(qǐng)求頭中的Content-Type字段。 $document_root:當(dāng)前請(qǐng)求在root指令中指定的值。 $host:請(qǐng)求主機(jī)頭字段,否則為服務(wù)器名稱(chēng)。 $http_user_agent:客戶(hù)端agent信息 $http_cookie:客戶(hù)端cookie信息 $limit_rate:這個(gè)變量可以限制連接速率。 $request_method:客戶(hù)端請(qǐng)求的動(dòng)作,通常為GET或POST。 $remote_addr:客戶(hù)端的IP地址。 $remote_port:客戶(hù)端的端口。 $remote_user:已經(jīng)經(jīng)過(guò)Auth Basic Module驗(yàn)證的用戶(hù)名。 $request_filename:當(dāng)前請(qǐng)求的文件路徑,由root或alias指令與URI請(qǐng)求生成。 $scheme:HTTP方法(如http,https)。 $server_protocol:請(qǐng)求使用的協(xié)議,通常是HTTP/1.0或HTTP/1.1。 $server_addr:服務(wù)器地址,在完成一次系統(tǒng)調(diào)用后可以確定這個(gè)值。 $server_name:服務(wù)器名稱(chēng)。 $server_port:請(qǐng)求到達(dá)服務(wù)器的端口號(hào)。 $request_uri:包含請(qǐng)求參數(shù)的原始URI,不包含主機(jī)名,如:”/foo/bar.php?arg=baz”。 $uri:不帶請(qǐng)求參數(shù)的當(dāng)前URI,$uri不包含主機(jī)名,如”/foo/bar.html”。 $document_uri:與$uri相同
作者:vbirdbest
來(lái)源:blog.csdn.net/vbirdbest/article/details/80913319

評(píng)論
圖片
表情
