<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 的 5 大應(yīng)用場(chǎng)景,太實(shí)用了!

          共 14463字,需瀏覽 29分鐘

           ·

          2021-08-23 16:12

          上一篇:深夜看了張一鳴的微博,讓我越想越后怕

          一、HTTP服務(wù)器

          Nginx本身也是一個(gè)靜態(tài)資源的服務(wù)器,當(dāng)只有靜態(tài)資源的時(shí)候,就可以使用Nginx來做服務(wù)器,如果一個(gè)網(wǎng)站只是靜態(tà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、訪問測(cè)試

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

          4、指令簡(jiǎn)介

          • server : 用于定義服務(wù),http中可以有多個(gè)server塊
          • listen : 指定服務(wù)器偵聽請(qǐng)求的IP地址和端口,如果省略地址,服務(wù)器將偵聽所有地址,如果省略端口,則使用標(biāo)準(zhǔn)端口
          • server_name : 服務(wù)名稱,用于配置域名
          • location : 用于配置映射路徑uri對(duì)應(yīng)的配置,一個(gè)server中可以有多個(gè)location, location后面跟一個(gè)uri,可以是一個(gè)正則表達(dá)式, / 表示匹配任意路徑, 當(dāng)客戶端訪問的路徑滿足這個(gè)uri時(shí)就會(huì)執(zhí)行l(wèi)ocation塊里面的代碼
          • root : 根路徑,當(dāng)訪問http://localhost/test.html,“/test.html”會(huì)匹配到”/”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時(shí)后面不跟任何路徑是不走root直接走index指令的;如果訪問路徑中沒有指定具體的文件,則返回index設(shè)置的資源,如果訪問http://localhost/html/ 則默認(rèn)返回index.html
          5、location uri正則表達(dá)式
          • . :匹配除換行符以外的任意字符
          • ? :重復(fù)0次或1次
          • + :重復(fù)1次或更多次
          • * :重復(fù)0次或更多次
          • \d :匹配數(shù)字
          • ^ :匹配字符串的開始
          • $ :匹配字符串的結(jié)束
          • {n} :重復(fù)n次
          • {n,} :重復(fù)n次或更多次
          • [c] :匹配單個(gè)字符c
          • [a-z] :匹配a-z小寫字母的任意一個(gè)
          • (a|b|c) : 屬線表示匹配任意一種情況,每種情況使用豎線分隔,一般使用小括號(hào)括括住,匹配符合a字符 或是b字符 或是c字符的字符串
          • \ 反斜杠:用于轉(zhuǎn)義特殊字符
          小括號(hào)()之間匹配的內(nèi)容,可以在后面通過$1來引用,$2表示的是前面第二個(gè)()里的內(nèi)容。正則里面容易讓人困惑的是\轉(zhuǎn)義特殊字符。

          二、靜態(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指令,語法 set 變量名值;引用使用變量名值;引用使用變量名; 這里自定義了doc_root變量。

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

          • 使用路徑,如 /images/ 一般圖片都會(huì)放在某個(gè)圖片目錄下,
          • 使用后綴,如 .jpg、.png 等后綴匹配模式
          訪問http://localhost/test.jpg 會(huì)映射到 $doc_root/img

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

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

          • =    進(jìn)行普通字符精確匹配。也就是完全匹配。
          • ^~     前綴匹配。如果匹配成功,則不再匹配其他location。
          • ~    表示執(zhí)行一個(gè)正則匹配,區(qū)分大小寫
          • ~*     表示執(zhí)行一個(gè)正則匹配,不區(qū)分大小寫
          • /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á)式類型有關(guān),和在配置文件中的先后順序無關(guān)。相同類型的表達(dá)式,字符串長的會(huì)優(yōu)先匹配。推薦:Java面試題大全

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

          • 等號(hào)類型(=)的優(yōu)先級(jí)最高。一旦匹配成功,則不再查找其他匹配項(xiàng),停止搜索。
          • ^~類型表達(dá)式,不屬于正則表達(dá)式。一旦匹配成功,則不再查找其他匹配項(xiàng),停止搜索。
          • 正則表達(dá)式類型(~ ~*)的優(yōu)先級(jí)次之。如果有多個(gè)location的正則能匹配的話,則使用正則表達(dá)式最長的那個(gè)。
          • 常規(guī)字符串匹配類型。按前綴匹配。
          • / 通用匹配,如果沒有匹配到,就匹配通用的

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

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

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

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

          location = / {
              # 精確匹配/,主機(jī)名后面不能帶任何字符串 /
              [ configuration A ]
          }
          location / {
              # 匹配所有以 / 開頭的請(qǐng)求。
              # 但是如果有更長的同類型的表達(dá)式,則選擇更長的表達(dá)式。
              # 如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。
              [ configuration B ]
          }
          location /documents/ {
              # 匹配所有以 /documents/ 開頭的請(qǐng)求,匹配符合以后,還要繼續(xù)往下搜索。
              # 但是如果有更長的同類型的表達(dá)式,則選擇更長的表達(dá)式。
              # 如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。
              [ configuration C ]
          }
          location ^~ /images/ {
              # 匹配所有以 /images/ 開頭的表達(dá)式,如果匹配成功,則停止匹配查找,停止搜索。
              # 所以,即便有符合的正則表達(dá)式location,也不會(huì)被使用
              [ configuration D ]
          }

          location ~* \.(gif|jpg|jpeg)$ {
              # 匹配所有以 gif jpg jpeg結(jié)尾的請(qǐng)求。
              # 但是 以 /images/開頭的請(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配置的位置無關(guān)。另外,Nginx 系列面試題和答案全部整理好了,微信搜索互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)發(fā)送:2T,可以在線閱讀。

          三、反向代理

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

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

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

          啟動(dòng)一個(gè)Java Web項(xiàng)目,端口號(hào)為8081,可以利用 Spring Boot 快速搭建一個(gè)項(xiàng)目:https://github.com/javastacks/spring-boot-best-practice

          server {
              listen       80;
              server_name  localhost;

              location / {
                  proxy_pass http://localhost:8081;
                  proxy_set_header Host $host:$server_port;
                  # 設(shè)置用戶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問localhost的時(shí)候,就相當(dāng)于訪問 localhost:8081了。

          四、負(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í)配置反向代理,通過反向代理跳轉(zhuǎn)到負(fù)載均衡。而Nginx目前支持自帶3種負(fù)載均衡策略,還有2種常用的第三方策略。

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

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

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

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

          2. 權(quán)重

          指定輪詢幾率,weight和訪問比率成正比, 也就是服務(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

          3. ip_hash

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

          upstream test {
              ip_hash;
              server localhost:8080;
              server localhost:8081;
          }

          4. fair(第三方)

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

          upstream backend {
              fair;
              server localhost:8080;
              server localhost:8081;
          }

          5. url_hash(第三方)

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

          upstream backend {
              hash $request_uri;
              hash_method crc32;
              server localhost:8080;
              server localhost:8081;
          }

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

          五、動(dòng)靜分離

          動(dòng)靜分離是讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動(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;
              }

           }

          六、其他

          1.return指令

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

          location /permanently/moved/url {
              return 301 http://www.example.com/moved/here;
          }

          2. rewrite指令

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

          第一個(gè)(必需)參數(shù)是請(qǐng)求URI必須匹配的正則表達(dá)式。

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

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

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

          3. error_page指令

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

          error_page 404 /404.html;

          4. 日志

          訪問日志:需要開啟壓縮 gzip on; 否則不生成日志文件,打開log_formataccess_log注釋

          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;

          5. deny 指令

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

          6. 內(nèi)置變量

          nginx的配置文件中可以使用的內(nèi)置變量以美元符$開始,也有人叫全局變量。其中,部分預(yù)定義的變量的值是可以改變的。另外,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Nginx 系列面試題和答案,非常齊全。

          • $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ù)器名稱。
          • $http_user_agent :客戶端agent信息
          • $http_cookie :客戶端cookie信息
          • $limit_rate :這個(gè)變量可以限制連接速率。
          • $request_method :客戶端請(qǐng)求的動(dòng)作,通常為GET或POST。
          • $remote_addr :客戶端的IP地址。
          • $remote_port :客戶端的端口。
          • $remote_user :已經(jīng)經(jīng)過Auth Basic Module驗(yàn)證的用戶名。
          • $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ù)器名稱。
          • $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相同

          原文鏈接:https://blog.csdn.net/vbirdbest/article/details/80913319

          感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。

              · END ·
          最后,關(guān)注公眾號(hào)互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的 Java 系列面試題和答案,非常齊全


          正文結(jié)束


          推薦閱讀 ↓↓↓

          1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          2.如何才能成為優(yōu)秀的架構(gòu)師?

          3.從零開始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4.程序員一般可以從什么平臺(tái)接私活?

          5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...

          6.IntelliJ IDEA 2019.3 首個(gè)最新訪問版本發(fā)布,新特性搶先看

          7.這封“領(lǐng)導(dǎo)痛批95后下屬”的郵件,句句扎心!

          8.15張圖看懂瞎忙和高效的區(qū)別!

          一個(gè)人學(xué)習(xí)、工作很迷茫?


          點(diǎn)擊「閱讀原文」加入我們的小圈子!

          瀏覽 34
          點(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>
                  欧美精品一区二区少妇免费A片 | 久久精品欧美一 | 青青草午夜 | 人人插人人射 | 久久午夜福利视频 |