<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 8907字,需瀏覽 18分鐘

           ·

          2022-03-01 21:41


          ?1?
          HPPT

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

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


          2、配置nginx.conf中的server。
          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;
          ????????}
          ????}
          }

          3、訪問(wèn)測(cè)試

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

          注意:如果訪問(wèn)圖片出現(xiàn)403 Forbidden錯(cuò)誤,可能是因?yàn)閚ginx.conf的第一行user配置不對(duì),默認(rèn)是#user nobody;是注釋的,Linux下改成user root; macos下改成user用戶(hù)名所在組,然后重新加載配置文件或者重啟,再試一下就可以了, 用戶(hù)名可以通過(guò)who am i命令來(lái)查看。

          4、指令簡(jiǎn)介

          • 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

          5、location uri正則表達(dá)式

          • .:匹配除換行符以外的任意字符
          • ?:重復(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)義特殊字符

          小括號(hào)()之間匹配的內(nèi)容,可以在后面通過(guò)$1來(lái)引用,$2表示的是前面第二個(gè)()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符。

          ?2?
          靜態(tài)服務(wù)器

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

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


          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;
          ???????}
          ????}
          }

          自定義變量使用set指令,語(yǔ)法 set 變量名值;引用使用變量名值;引用使用變量名; 這里自定義了doc_root變量。

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

          • 使用路徑,如/images/一般圖片都會(huì)放在某個(gè)圖片目錄下
          • 使用后綴,如.jpg、.png等后綴匹配模式

          訪問(wèn)http://localhost/test.jpg會(huì)映射到$doc_root/img。

          訪問(wèn)http://localhost/images/test.jpg,當(dāng)同一個(gè)路徑滿(mǎn)足多個(gè)location時(shí),優(yōu)先匹配優(yōu)先級(jí)高的location,由于^~ 的優(yōu)先級(jí)大于~,所以會(huì)走/images/對(duì)應(yīng)的location。

          常見(jiàn)的location路徑映射路徑有以下幾種:

          • =:進(jìn)行普通字符精確匹配。也就是完全匹配
          • ^~:前綴匹配。如果匹配成功,則不再匹配其他location
          • ~:表示執(zhí)行一個(gè)正則匹配,區(qū)分大小寫(xiě)
          • ~*:表示執(zhí)行一個(gè)正則匹配,不區(qū)分大小寫(xiě)
          • /xxx/:常規(guī)字符串路徑匹配
          • /:通用匹配,任何請(qǐng)求都會(huì)匹配到

          location優(yōu)先級(jí)

          當(dāng)一個(gè)路徑匹配多個(gè)location時(shí)究竟哪個(gè)location能匹配到時(shí)有優(yōu)先級(jí)順序的,而優(yōu)先級(jí)的順序于location值的表達(dá)式類(lèi)型有關(guān),和在配置文件中的先后順序無(wú)關(guān)。相同類(lèi)型的表達(dá)式,字符串長(zhǎng)的會(huì)優(yōu)先匹配。

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

          • 等號(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)有匹配到,就匹配通用的

          優(yōu)先級(jí)搜索問(wèn)題:不同類(lèi)型的location映射決定是否繼續(xù)向下搜索。

          等號(hào)類(lèi)型、^~類(lèi)型:一旦匹配上就停止搜索了,不會(huì)再匹配其他location了
          正則表達(dá)式類(lèi)型(~ ~*),常規(guī)字符串匹配類(lèi)型/xxx/:匹配到之后,還會(huì)繼續(xù)搜索其他其它location,直到找到優(yōu)先級(jí)最高的,或者找到第一種情況而停止搜索

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

          (location =)>(location 完整路徑)>(location ^~ 路徑)>(location ~,~* 正則順序)>(location 部分起始路徑)>(/)
          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;
          }
          注意:location的優(yōu)先級(jí)與location配置的位置無(wú)關(guān)。

          ?3?
          反向代理

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

          簡(jiǎn)單來(lái)說(shuō)就是真實(shí)的服務(wù)器不能直接被外部網(wǎng)絡(luò)訪問(wèn),所以需要一臺(tái)代理服務(wù)器,而代理服務(wù)器能被外部網(wǎng)絡(luò)訪問(wèn)的同時(shí)又跟真實(shí)服務(wù)器在同一個(gè)網(wǎng)絡(luò)環(huán)境,當(dāng)然也可能是同一臺(tái)服務(wù)器,端口不同而已。

          反向代理通過(guò)proxy_pass指令來(lái)實(shí)現(xiàn)。

          啟動(dòng)一個(gè)Java Web項(xiàng)目,端口號(hào)為8081:
          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;?
          ????}

          }
          當(dāng)我們?cè)L問(wèn)localhost的時(shí)候,就相當(dāng)于訪問(wèn) localhost:8081了。

          ?4?
          負(fù)載均衡

          負(fù)載均衡也是Nginx常用的一個(gè)功能,負(fù)載均衡其意思就是分?jǐn)偟蕉鄠€(gè)操作單元上進(jìn)行執(zhí)行,例如Web服務(wù)器、FTP服務(wù)器、企業(yè)關(guān)鍵應(yīng)用服務(wù)器和其它關(guān)鍵任務(wù)服務(wù)器等,從而共同完成工作任務(wù)。簡(jiǎn)單而言就是當(dāng)有2臺(tái)或以上服務(wù)器時(shí),根據(jù)規(guī)則隨機(jī)的將請(qǐng)求分發(fā)到指定的服務(wù)器上處理,負(fù)載均衡配置一般都需要同時(shí)配置反向代理,通過(guò)反向代理跳轉(zhuǎn)到負(fù)載均衡。而Nginx目前支持自帶3種負(fù)載均衡策略,還有2種常用的第三方策略。

          負(fù)載均衡通過(guò)upstream指令來(lái)實(shí)現(xiàn)。

          RR(round robin:輪詢(xún) 默認(rèn))

          每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,也就是說(shuō)第一次請(qǐng)求分配到第一臺(tái)服務(wù)器上,第二次請(qǐng)求分配到第二臺(tái)服務(wù)器上,如果只有兩臺(tái)服務(wù)器,第三次請(qǐng)求繼續(xù)分配到第一臺(tái)上,這樣循環(huán)輪詢(xún)下去,也就是服務(wù)器接收請(qǐng)求的比例是1:1, 如果后端服務(wù)器down掉,能自動(dòng)剔除。輪詢(xún)是默認(rèn)配置,不需要太多的配置。

          同一個(gè)項(xiàng)目分別使用8081和8082端口啟動(dòng)項(xiàng)目:
          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;
          ????}
          ?}
          訪問(wèn)地址仍然可以獲得響應(yīng)http://localhost/api/user/login?username=zhangsan&password=111111,這種方式是輪詢(xún)的。

          權(quán)重

          指定輪詢(xún)幾率,weight和訪問(wèn)比率成正比, 也就是服務(wù)器接收請(qǐng)求的比例就是各自配置的weight的比例,用于后端服務(wù)器性能不均的情況,比如服務(wù)器性能差點(diǎn)就少接收點(diǎn)請(qǐng)求,服務(wù)器性能好點(diǎn)就多處理點(diǎn)請(qǐng)求。
          upstream?test?{
          ????server?localhost:8081?weight=1;
          ????server?localhost:8082?weight=3;
          ????server?localhost:8083?weight=4?backup;
          }
          示例是4次請(qǐng)求只有一次被分配到8081上,其他3次分配到8082上。backup是指熱備,只有當(dāng)8081和8082都宕機(jī)的情況下才走8083。

          ip_hash

          上面的2種方式都有一個(gè)問(wèn)題,那就是下一個(gè)請(qǐng)求來(lái)的時(shí)候請(qǐng)求可能分發(fā)到另外一個(gè)服務(wù)器,當(dāng)我們的程序不是無(wú)狀態(tài)的時(shí)候(采用了session保存數(shù)據(jù)),這時(shí)候就有一個(gè)很大的很問(wèn)題了,比如把登錄信息保存到了session中,那么跳轉(zhuǎn)到另外一臺(tái)服務(wù)器的時(shí)候就需要重新登錄了,所以很多時(shí)候我們需要一個(gè)客戶(hù)只訪問(wèn)一個(gè)服務(wù)器,那么就需要用iphash了,iphash的每個(gè)請(qǐng)求按訪問(wèn)ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問(wèn)一個(gè)后端服務(wù)器,可以解決session的問(wèn)題。
          upstream?test?{
          ????ip_hash;
          ????server?localhost:8080;
          ????server?localhost:8081;


          fair(第三方)

          按后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配。這個(gè)配置是為了更快的給用戶(hù)響應(yīng)。
          upstream?backend?{
          ????fair;
          ????server?localhost:8080;
          ????server?localhost:8081;
          }

          url_hash(第三方)

          按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效。?在upstream中加入hash語(yǔ)句,server語(yǔ)句中不能寫(xiě)入weight等其他的參數(shù),hash_method是使用的hash算法。
          upstream?backend?{
          ????hash?$request_uri;
          ????hash_method?crc32;
          ????server?localhost:8080;
          ????server?localhost:8081;
          }
          以上5種負(fù)載均衡各自適用不同情況下使用,所以可以根據(jù)實(shí)際情況選擇使用哪種策略模式,不過(guò)fair和url_hash需要安裝第三方模塊才能使用。

          ?5?
          動(dòng)靜分離

          動(dòng)靜分離是讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁(yè)根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開(kāi)來(lái),動(dòng)靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作,這就是網(wǎng)站靜態(tài)化處理的核心思路。
          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;
          ????}

          ?}

          ?6?
          其他

          return指令

          返回http狀態(tài)碼和可選的第二個(gè)參數(shù)可以是重定向的URL:
          location?/permanently/moved/url?{
          ????return?301?http://www.example.com/moved/here;
          }

          rewrite指令

          重寫(xiě)URI請(qǐng)求rewrite,通過(guò)使用rewrite指令在請(qǐng)求處理期間多次修改請(qǐng)求URI,該指令具有一個(gè)可選參數(shù)和兩個(gè)必需參數(shù)。第一個(gè)(必需)參數(shù)是請(qǐng)求URI必須匹配的正則表達(dá)式。第二個(gè)參數(shù)是用于替換匹配URI的URI??蛇x的第三個(gè)參數(shù)是可以停止進(jìn)一步重寫(xiě)指令的處理或發(fā)送重定向(代碼301或302)的標(biāo)志。
          location?/users/?{
          ????rewrite?^/users/(.*)$?/show?user=$1?break;
          }

          error_page指令

          使用error_page指令,你可以配置Nginx返回自定義頁(yè)面以及錯(cuò)誤代碼,替換響應(yīng)中的其他錯(cuò)誤代碼,或?qū)g覽器重定向到其他URI。在以下示例中,error_page指令指定要返回404頁(yè)面錯(cuò)誤代碼的頁(yè)面(/404.html)。
          error_page?404?/404.html;

          日志

          訪問(wèn)日志:需要開(kāi)啟壓縮gzip on,否則不生成日志文件,打開(kāi)log_format、access_log注釋?zhuān)?/span>
          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;

          deny指令
          #?禁止訪問(wèn)某個(gè)目錄
          location?~*?\.(txt|doc)${
          ????root?$doc_root;
          ????deny?all;
          }

          內(nèi)置變量

          Nginx的配置文件中可以使用的內(nèi)置變量以美元符$開(kāi)始,也有人叫全局變量。其中,部分預(yù)定義的變量的值是可以改變的。

          • $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


          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月婷婷AV手机免费观看 | 蜜桃四季春秘 一区二区三区 | 国产精品久久免费 | 俺去啦电影网 | 国产品黄色大片免费的 |