<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 的五大應用場景

          共 14444字,需瀏覽 29分鐘

           ·

          2021-08-04 23:59

          在下方公眾號后臺回復:面試手冊,可獲取杰哥匯總的 3 份面試 PDF 手冊。

          一、HTTP服務器

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

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

          2、 配置nginx.conf中的server

          user mengday staff;

          http {
              server {
                  listen       80;
                  server_name  localhost;
                  client_max_body_size 1024M;

                  # 默認location
                  location / {
                      root   /usr/local/var/www/html;
                      index  index.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 : 用于定義服務,http中可以有多個server塊

          listen : 指定服務器偵聽請求的IP地址和端口,如果省略地址,服務器將偵聽所有地址,如果省略端口,則使用標準端口

          server_name : 服務名稱,用于配置域名

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

          root : 根路徑,當訪問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 : 設置首頁,當只訪問server_name時后面不跟任何路徑是不走root直接走index指令的;如果訪問路徑中沒有指定具體的文件,則返回index設置的資源,如果訪問http://localhost/html/ 則默認返回index.html

          5、location uri正則表達式

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

          • ? :重復0次或1次

          • + :重復1次或更多次

          • * :重復0次或更多次

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

          • ^ :匹配字符串的開始

          • $ :匹配字符串的結束

          • {n} :重復n次

          • {n,} :重復n次或更多次

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

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

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

          • \ 反斜杠:用于轉義特殊字符

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


          二、靜態(tài)服務器

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

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

          http {
              server {
                  listen       80;
                  server_name  localhost;


                  set $doc_root /usr/local/var/www;

                  # 默認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)服務器location的映射一般有兩種方式:

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

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

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

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

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

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

          • ^~         前綴匹配。如果匹配成功,則不再匹配其他location。

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

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

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

          • /       通用匹配,任何請求都會匹配到

          location優(yōu)先級

          當一個路徑匹配多個location時究竟哪個location能匹配到時有優(yōu)先級順序的,而優(yōu)先級的順序于location值的表達式類型有關,和在配置文件中的先后順序無關。相同類型的表達式,字符串長的會優(yōu)先匹配。

          以下是按優(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結尾的請求。
              # 但是 以 /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配置的位置無關

          三、反向代理

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

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

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

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

          server {
              listen       80;
              server_name  localhost;

              location / {
                  proxy_pass http://localhost:8081;
                  proxy_set_header Host $host:$server_port;
                  # 設置用戶ip地址
                   proxy_set_header X-Forwarded-For $remote_addr;
                   # 當請求服務器出錯去尋找其他服務器
                   proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; 
              }

          }   

          當我們訪問localhost的時候,就相當于訪問 localhost:8081了

          四、負載均衡

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

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

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

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

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

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

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

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

          2. 權重

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

          upstream test {
              server localhost:8081 weight=1;
              server localhost:8082 weight=3;
              server localhost:8083 weight=4 backup;
          }

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

          3. ip_hash

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

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

          4. fair(第三方)

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

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

          5. url_hash(第三方)

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

          upstream backend {
              hash $request_uri;
              hash_method crc32;
              server localhost:8080;
              server localhost: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)化處理的核心思路。

          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)碼 和 可選的第二個參數(shù)可以是重定向的URL

          location /permanently/moved/url {
              return 301 http://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=$1 break;
          }

          3. error_page指令

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

          error_page 404 /404.html;

          4. 日志

          訪問日志:需要開啟壓縮 gzip on; 否則不生成日志文件,打開log_format、access_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 指令

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

          6. 內置變量

          nginx的配置文件中可以使用的內置變量以美元符$開始,也有人叫全局變量。其中,部分預定義的變量的值是可以改變的。

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

          • $content_length :請求頭中的Content-length字段。

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

          • $document_root :當前請求在root指令中指定的值。

          • $host :請求主機頭字段,否則為服務器名稱。

          • $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 :當前請求的文件路徑,由root或alias指令與URI請求生成。

          • $scheme :HTTP方法(如http,https)。

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

          • $server_addr :服務器地址,在完成一次系統(tǒng)調用后可以確定這個值。

          • $server_name :服務器名稱。

          • $server_port :請求到達服務器的端口號。

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

          • $uri :不帶請求參數(shù)的當前URI,$uri不包含主機名,如”/foo/bar.html”。

          • $document_uri :與$uri相同

          作者:vbirdbest
          blog.csdn.net/vbirdbest/article/details/80913319

          贈書福利

          這是一部基于Nginx新版本和云原生應用場景系統(tǒng)講解Nginx的著作,是作者十余年運維經(jīng)驗的總結。本書從應用、運維以及與Kubernetes和微服務集成3個維度對Nginx的基礎知識、工作原理、核心應用、運維管理、集成擴展等重點內容進行了全面、細致的講解。完全以實戰(zhàn)為導向,包含大量的配置案例和示例代碼,能幫助讀者快速掌握并在實際工作中熟練應用Nginx。

          本書詳解了Nginx架構、執(zhí)行流程、模塊實現(xiàn)與數(shù)據(jù)結構,剖析了Nginx源碼設計精髓與應用。帶你深入理解Nginx底層原理與設計,掌握高性能Web服務器開發(fā)核心,輕松應對高并發(fā)。不同于市面上常見的Nginx應用書籍,本書從Nginx底層的多進程模型、異步非阻塞I/O、數(shù)據(jù)結構與內存管理、通信協(xié)議與機制等角度分析了Nginx的底層原理和設計思路,揭示了Nginx高并發(fā)、高性能的本質。


          贈書規(guī)則: 為本文「點贊」+ 「在看」 +「留言」且與文章內容相關的優(yōu)質留言即可上墻并從所有留言中隨機選出三位讀者,從以上兩本中任選一本。

          截止時間: 2021年8月5日,晚 20:00

          領書須知: 提供點贊和在看截圖

          注意事項: 最終獲贈者請在24小時以內添加我的微信,備注:贈書??

          推薦閱讀

          Nginx 常用配置清單


          加速 Nginx 響應的 5 個措施!效果明顯~


          深入 Nginx 之事件驅動核心架構篇


          Nginx 為什么這么快!


          萬字總結,體系化帶你全面認識 Nginx !


          深入了解 Nginx!


          Nginx 這個功能厲害了!


          又一款 Nginx 管理可視化神器!通過界面完成配置監(jiān)控


          高性能 Nginx HTTPS 調優(yōu) - 如何為 HTTPS 提速 30%


          【建議收藏】神器 Nginx 的學習手冊

          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美最大操逼在线 | 影音先锋色成人 | 免费一级片电影网站 | 久久丫精品久久丫 | 免费观看黄色视频网站在线观看 |