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

作者:vbirdbest

blog.csdn.net/vbirdbest/article/details/80913319

一、HTTP服務(wù)器

Nginx本身也是一個靜態(tài)資源的服務(wù)器,當(dāng)只有靜態(tài)資源的時候,就可以使用Nginx來做服務(wù)器,如果一個網(wǎng)站只是靜態(tài)頁面的話住练,那么就可以通過這種方式來實現(xiàn)部署交洗。

1梧躺、 首先在文檔根目錄Docroot(/usr/local/var/www)下創(chuàng)建html目錄, 然后在html中放一個test.html;

2劣挫、 配置nginx.conf中的server

usermengday?staff;http{server{listen80;server_namelocalhost;client_max_body_size1024M;#?默認locationlocation/?{root/usr/local/var/www/html;indexindex.html?index.htm;????????}????}}

3册养、訪問測試

http://localhost/?指向/usr/local/var/www/index.html, index.html是安裝nginx自帶的html

http://localhost/test.html?指向/usr/local/var/www/html/test.html

注意:如果訪問圖片出現(xiàn)403 Forbidden錯誤,可能是因為nginx.conf 的第一行user配置不對压固,默認是#user nobody;是注釋的球拦,linux下改成user root; macos下改成user 用戶名 所在組; 然后重新加載配置文件或者重啟,再試一下就可以了邓夕, 用戶名可以通過who am i 命令來查看刘莹。

4、指令簡介

server : 用于定義服務(wù)焚刚,http中可以有多個server塊

listen : 指定服務(wù)器偵聽請求的IP地址和端口点弯,如果省略地址,服務(wù)器將偵聽所有地址矿咕,如果省略端口抢肛,則使用標準端口

server_name : 服務(wù)名稱,用于配置域名

location : 用于配置映射路徑uri對應(yīng)的配置碳柱,一個server中可以有多個location, location后面跟一個uri,可以是一個正則表達式, / 表示匹配任意路徑, 當(dāng)客戶端訪問的路徑滿足這個uri時就會執(zhí)行l(wèi)ocation塊里面的代碼

root : 根路徑捡絮,當(dāng)訪問http://localhost/test.html,“/test.html”會匹配到”/”uri, 找到root為/usr/local/var/www/html莲镣,用戶訪問的資源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html

index : 設(shè)置首頁福稳,當(dāng)只訪問server_name時后面不跟任何路徑是不走root直接走index指令的;如果訪問路徑中沒有指定具體的文件瑞侮,則返回index設(shè)置的資源的圆,如果訪問http://localhost/html/?則默認返回index.html

5、location uri正則表達式

.?:匹配除換行符以外的任意字符

??:重復(fù)0次或1次

+?:重復(fù)1次或更多次

*?:重復(fù)0次或更多次

\d?:匹配數(shù)字

^?:匹配字符串的開始

$?:匹配字符串的結(jié)束

{n}?:重復(fù)n次

{n,}?:重復(fù)n次或更多次

[c]?:匹配單個字符c

[a-z]?:匹配a-z小寫字母的任意一個

(a|b|c)?: 屬線表示匹配任意一種情況半火,每種情況使用豎線分隔越妈,一般使用小括號括括住,匹配符合a字符 或是b字符 或是c字符的字符串

\?反斜杠:用于轉(zhuǎn)義特殊字符

小括號()之間匹配的內(nèi)容钮糖,可以在后面通過$1來引用梅掠,$2表示的是前面第二個()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符店归。

二阎抒、靜態(tài)服務(wù)器

在公司中經(jīng)常會遇到靜態(tài)服務(wù)器,通常會提供一個上傳的功能娱节,其他應(yīng)用如果需要靜態(tài)資源就從該靜態(tài)服務(wù)器中獲取挠蛉。

1、在/usr/local/var/www?下分別創(chuàng)建images和img目錄肄满,分別在每個目錄下放一張test.jpg

http{server{listen80;server_namelocalhost;set$doc_root/usr/local/var/www;#?默認locationlocation/?{root/usr/local/var/www/html;indexindex.html?index.htm;????????}location?^~/images/?{root$doc_root;???????}location~*?\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${root$doc_root/img;???????}????}}

自定義變量使用set指令谴古,語法 set 變量名值;引用使用變量名值;引用使用變量名; 這里自定義了doc_root變量质涛。

靜態(tài)服務(wù)器location的映射一般有兩種方式:

使用路徑,如 /images/ 一般圖片都會放在某個圖片目錄下掰担,

使用后綴汇陆,如 .jpg、.png 等后綴匹配模式

訪問http://localhost/test.jpg?會映射到?$doc_root/img

訪問http://localhost/images/test.jpg?當(dāng)同一個路徑滿足多個location時带饱,優(yōu)先匹配優(yōu)先級高的location毡代,由于^~?的優(yōu)先級大于?~, 所以會走/images/對應(yīng)的location

常見的location路徑映射路徑有以下幾種:

=?進行普通字符精確匹配。也就是完全匹配勺疼。

^~?前綴匹配教寂。如果匹配成功,則不再匹配其他location执庐。

~?表示執(zhí)行一個正則匹配酪耕,區(qū)分大小寫

~*?表示執(zhí)行一個正則匹配,不區(qū)分大小寫

/xxx/?常規(guī)字符串路徑匹配

/?通用匹配轨淌,任何請求都會匹配到

location優(yōu)先級

當(dāng)一個路徑匹配多個location時究竟哪個location能匹配到時有優(yōu)先級順序的迂烁,而優(yōu)先級的順序于location值的表達式類型有關(guān),和在配置文件中的先后順序無關(guān)递鹉。相同類型的表達式盟步,字符串長的會優(yōu)先匹配。推薦:Java面試題大全

以下是按優(yōu)先級排列說明:

等號類型(=)的優(yōu)先級最高躏结。一旦匹配成功却盘,則不再查找其他匹配項,停止搜索媳拴。

^~類型表達式谷炸,不屬于正則表達式。一旦匹配成功禀挫,則不再查找其他匹配項,停止搜索拓颓。

正則表達式類型(~ ~*)的優(yōu)先級次之语婴。如果有多個location的正則能匹配的話,則使用正則表達式最長的那個驶睦。

常規(guī)字符串匹配類型砰左。按前綴匹配。

/ 通用匹配场航,如果沒有匹配到,就匹配通用的

優(yōu)先級搜索問題:不同類型的location映射決定是否繼續(xù)向下搜索

等號類型、^~類型:一旦匹配上就停止搜索了糊昙,不會再匹配其他location了

正則表達式類型(~ ~*),常規(guī)字符串匹配類型/xxx/?: 匹配到之后,還會繼續(xù)搜索其他其它location憋他,直到找到優(yōu)先級最高的,或者找到第一種情況而停止搜索

location優(yōu)先級從高到底:

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

location?=?/?{#?精確匹配/髓削,主機名后面不能帶任何字符串?/[?configuration?A?]}location?/?{#?匹配所有以?/?開頭的請求竹挡。#?但是如果有更長的同類型的表達式,則選擇更長的表達式立膛。#?如果有正則表達式可以匹配揪罕,則優(yōu)先匹配正則表達式。[?configuration?B?]}location?/documents/?{#?匹配所有以?/documents/?開頭的請求宝泵,匹配符合以后好啰,還要繼續(xù)往下搜索。#?但是如果有更長的同類型的表達式儿奶,則選擇更長的表達式框往。#?如果有正則表達式可以匹配,則優(yōu)先匹配正則表達式廓握。[?configuration?C?]}location?^~?/images/?{#?匹配所有以?/images/?開頭的表達式搅窿,如果匹配成功,則停止匹配查找隙券,停止搜索男应。#?所以,即便有符合的正則表達式location娱仔,也不會被使用[?configuration?D?]}location?~*?\.(gif|jpg|jpeg)$?{#?匹配所有以 gif jpg jpeg結(jié)尾的請求沐飘。#?但是?以?/images/開頭的請求,將使用?Configuration?D牲迫,D具有更高的優(yōu)先級[?configuration?E?]}location?/images/?{#?字符匹配到?/images/耐朴,還會繼續(xù)往下搜索[?configuration?F?]}location?=?/test.htm?{????root???/usr/local/var/www/htm;????index??index.htm;}

注意:location的優(yōu)先級與location配置的位置無關(guān)

三、反向代理

反向代理應(yīng)該是Nginx使用最多的功能了盹憎,反向代理(Reverse Proxy)方式是指以代理服務(wù)器來接受internet上的連接請求筛峭,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請求連接的客戶端陪每,此時代理服務(wù)器對外就表現(xiàn)為一個反向代理服務(wù)器影晓。

簡單來說就是真實的服務(wù)器不能直接被外部網(wǎng)絡(luò)訪問,所以需要一臺代理服務(wù)器檩禾,而代理服務(wù)器能被外部網(wǎng)絡(luò)訪問的同時又跟真實服務(wù)器在同一個網(wǎng)絡(luò)環(huán)境挂签,當(dāng)然也可能是同一臺服務(wù)器,端口不同而已盼产。

反向代理通過proxy_pass指令來實現(xiàn)饵婆。

啟動一個Java Web項目,端口號為8081

server{listen80;server_namelocalhost;location/?{proxy_passhttp://localhost:8081;proxy_set_headerHost$host:$server_port;#?設(shè)置用戶ip地址proxy_set_headerX-Forwarded-For$remote_addr;#?當(dāng)請求服務(wù)器出錯去尋找其他服務(wù)器proxy_next_upstreamerrortimeout?invalid_header?http_500?http_502?http_503;?????}}

當(dāng)我們訪問localhost的時候戏售,就相當(dāng)于訪問?localhost:8081了

四侨核、負載均衡

負載均衡也是Nginx常用的一個功能草穆,負載均衡其意思就是分攤到多個操作單元上進行執(zhí)行,例如Web服務(wù)器芹关、FTP服務(wù)器续挟、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)侥衬。

簡單而言就是當(dāng)有2臺或以上服務(wù)器時诗祸,根據(jù)規(guī)則隨機的將請求分發(fā)到指定的服務(wù)器上處理,負載均衡配置一般都需要同時配置反向代理轴总,通過反向代理跳轉(zhuǎn)到負載均衡直颅。而Nginx目前支持自帶3種負載均衡策略,還有2種常用的第三方策略怀樟。

負載均衡通過upstream指令來實現(xiàn)功偿。推薦:Java面試題大全

1. RR(round robin :輪詢 默認)

每個請求按時間順序逐一分配到不同的后端服務(wù)器,也就是說第一次請求分配到第一臺服務(wù)器上往堡,第二次請求分配到第二臺服務(wù)器上械荷,如果只有兩臺服務(wù)器,第三次請求繼續(xù)分配到第一臺上虑灰,這樣循環(huán)輪詢下去吨瞎,也就是服務(wù)器接收請求的比例是 1:1, 如果后端服務(wù)器down掉穆咐,能自動剔除颤诀。輪詢是默認配置,不需要太多的配置

同一個項目分別使用8081和8082端口啟動項目

upstreamweb_servers?{serverlocalhost:8081;serverlocalhost:8082;??}server{listen80;server_namelocalhost;#access_log??logs/host.access.log??main;location/?{proxy_passhttp://web_servers;#?必須指定Header?Hostproxy_set_headerHost$host:$server_port;????}?}

訪問地址仍然可以獲得響應(yīng)?http://localhost/api/user/login?username=zhangsan&password=111111?对湃,這種方式是輪詢的

2. 權(quán)重

指定輪詢幾率崖叫,weight和訪問比率成正比, 也就是服務(wù)器接收請求的比例就是各自配置的weight的比例,用于后端服務(wù)器性能不均的情況,比如服務(wù)器性能差點就少接收點請求拍柒,服務(wù)器性能好點就多處理點請求心傀。

upstreamtest?{serverlocalhost:8081weight=1;serverlocalhost:8082weight=3;serverlocalhost:8083weight=4backup;}

示例是4次請求只有一次被分配到8081上,其他3次分配到8082上拆讯。backup是指熱備剧包,只有當(dāng)8081和8082都宕機的情況下才走8083

3. ip_hash

上面的2種方式都有一個問題,那就是下一個請求來的時候請求可能分發(fā)到另外一個服務(wù)器往果,當(dāng)我們的程序不是無狀態(tài)的時候(采用了session保存數(shù)據(jù)),這時候就有一個很大的很問題了一铅,比如把登錄信息保存到了session中陕贮,那么跳轉(zhuǎn)到另外一臺服務(wù)器的時候就需要重新登錄了,所以很多時候我們需要一個客戶只訪問一個服務(wù)器潘飘,那么就需要用iphash了肮之,iphash的每個請求按訪問ip的hash結(jié)果分配掉缺,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題戈擒。

upstreamtest{ip_hash;serverlocalhost:8080;serverlocalhost:8081;}

4. fair(第三方)

按后端服務(wù)器的響應(yīng)時間來分配請求眶明,響應(yīng)時間短的優(yōu)先分配。這個配置是為了更快的給用戶響應(yīng)

upstreambackend{fair;serverlocalhost:8080;serverlocalhost:8081;}

5. url_hash(第三方)

按訪問url的hash結(jié)果來分配請求筐高,使每個url定向到同一個后端服務(wù)器搜囱,后端服務(wù)器為緩存時比較有效。在upstream中加入hash語句柑土,server語句中不能寫入weight等其他的參數(shù)蜀肘,hash_method是使用的hash算法

upstreambackend?{hash$request_uri;hash_methodcrc32;serverlocalhost:8080;serverlocalhost:8081;}

以上5種負載均衡各自適用不同情況下使用,所以可以根據(jù)實際情況選擇使用哪種策略模式,不過fair和url_hash需要安裝第三方模塊才能使用稽屏。

五扮宠、動靜分離

動靜分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后狐榔,我們就可以根據(jù)靜態(tài)資源的特點將其做緩存操作坛增,這就是網(wǎng)站靜態(tài)化處理的核心思路。

upstreamweb_servers?{serverlocalhost:8081;serverlocalhost:8082;??}server{listen80;server_namelocalhost;set$doc_root/usr/local/var/www;location~*?\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${root$doc_root/img;????}location/?{proxy_passhttp://web_servers;#?必須指定Header?Hostproxy_set_headerHost$host:$server_port;????}error_page500502503504/50x.html;location=?/50x.html?{root$doc_root;????}?}

六薄腻、其他

1.return指令

返回http狀態(tài)碼 和 可選的第二個參數(shù)可以是重定向的URL

location?/permanently/moved/url?{return301http://www.example.com/moved/here;}

2. rewrite指令

重寫URI請求 rewrite收捣,通過使用rewrite指令在請求處理期間多次修改請求URI,該指令具有一個可選參數(shù)和兩個必需參數(shù)被廓。

第一個(必需)參數(shù)是請求URI必須匹配的正則表達式坏晦。

第二個參數(shù)是用于替換匹配URI的URI。

可選的第三個參數(shù)是可以停止進一步重寫指令的處理或發(fā)送重定向(代碼301或302)的標志

location/users/?{rewrite?^/users/(.*)$/show?user=$1break;}

3. error_page指令

使用error_page指令嫁乘,您可以配置NGINX返回自定義頁面以及錯誤代碼昆婿,替換響應(yīng)中的其他錯誤代碼,或?qū)g覽器重定向到其他URI蜓斧。在以下示例中仓蛆,error_page指令指定要返回404頁面錯誤代碼的頁面(/404.html)。

error_page404/404.html;

4. 日志

訪問日志:需要開啟壓縮 gzip on; 否則不生成日志文件挎春,打開log_format看疙、access_log注釋

log_formatmain'$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;gzipon;

5. deny 指令

#?禁止訪問某個目錄location~*?\.(txt|doc)${

????root?$doc_root;

????deny?all;

}

6. 內(nèi)置變量

nginx的配置文件中可以使用的內(nèi)置變量以美元符$開始,也有人叫全局變量直奋。其中能庆,部分預(yù)定義的變量的值是可以改變的。另外脚线,關(guān)注Java知音公眾號搁胆,回復(fù)“后端面試”,送你一份面試題寶典!

$args?:#這個變量等于請求行中的參數(shù)渠旁,同$query_string

$content_length?:請求頭中的Content-length字段攀例。

$content_type?:請求頭中的Content-Type字段。

$document_root?:當(dāng)前請求在root指令中指定的值顾腊。

$host?:請求主機頭字段粤铭,否則為服務(wù)器名稱。

$http_user_agent?:客戶端agent信息

$http_cookie?:客戶端cookie信息

$limit_rate?:這個變量可以限制連接速率杂靶。

$request_method?:客戶端請求的動作梆惯,通常為GET或POST。

$remote_addr?:客戶端的IP地址伪煤。

$remote_port?:客戶端的端口加袋。

$remote_user?:已經(jīng)經(jīng)過Auth Basic Module驗證的用戶名。

$request_filename?:當(dāng)前請求的文件路徑抱既,由root或alias指令與URI請求生成职烧。

$scheme?:HTTP方法(如http,https)防泵。

$server_protocol?:請求使用的協(xié)議蚀之,通常是HTTP/1.0或HTTP/1.1。

$server_addr?:服務(wù)器地址捷泞,在完成一次系統(tǒng)調(diào)用后可以確定這個值足删。

$server_name?:服務(wù)器名稱。

$server_port?:請求到達服務(wù)器的端口號锁右。

$request_uri?:包含請求參數(shù)的原始URI失受,不包含主機名,如:”/foo/bar.php?arg=baz”咏瑟。

$uri?:不帶請求參數(shù)的當(dāng)前URI拂到,$uri不包含主機名,如”/foo/bar.html”码泞。

$document_uri?:與$uri相同

如果有需要領(lǐng)取免費資料的小伙伴們兄旬,可以點擊此處領(lǐng)取資料哦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末余寥,一起剝皮案震驚了整個濱河市领铐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宋舷,老刑警劉巖绪撵,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異祝蝠,居然都是意外死亡莲兢,警方通過查閱死者的電腦和手機汹来,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來改艇,“玉大人,你說我怎么就攤上這事坟岔≮诵郑” “怎么了?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵社付,是天一觀的道長承疲。 經(jīng)常有香客問我,道長鸥咖,這世上最難降的妖魔是什么燕鸽? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮啼辣,結(jié)果婚禮上啊研,老公的妹妹穿的比我還像新娘。我一直安慰自己鸥拧,他們只是感情好党远,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著富弦,像睡著了一般沟娱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腕柜,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天济似,我揣著相機與錄音,去河邊找鬼盏缤。 笑死砰蠢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛾找。 我是一名探鬼主播娩脾,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼打毛!你這毒婦竟也來了柿赊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤幻枉,失蹤者是張志新(化名)和其女友劉穎碰声,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體熬甫,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡胰挑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞻颂。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡豺谈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出贡这,到底是詐尸還是另有隱情茬末,我是刑警寧澤,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布盖矫,位于F島的核電站丽惭,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏辈双。R本人自食惡果不足惜责掏,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湃望。 院中可真熱鬧换衬,春花似錦、人聲如沸喜爷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩帐。三九已至术幔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湃密,已是汗流浹背诅挑。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泛源,地道東北人拔妥。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像达箍,于是被迫代替她去往敵國和親没龙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355

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