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

          共 9520字,需瀏覽 20分鐘

           ·

          2021-07-30 18:13

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

          來源:https://blog.csdn.net/vbirdbest/article/details/80913319


          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ù)字
          • ^ :匹配字符串的開始
          • $ :匹配字符串的結(jié)束
          • {n} :重復n次
          • {n,} :重復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)服務器


          在公司中經(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值的表達式類型有關(guān),和在配置文件中的先后順序無關(guān)。相同類型的表達式,字符串長的會優(yōu)先匹配。


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



          優(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)


          反向代理


          反向代理應該是Nginx使用最多的功能了,反向代理(Reverse Proxy)方式是指以代理服務器來接受internet上的連接請求,然后將請求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡上的服務器,并將從服務器上得到的結(jié)果返回給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è)關(guān)鍵應用服務器和其它關(guān)鍵任務服務器等,從而共同完成工作任務。


          簡單而言就是當有2臺或以上服務器時,根據(jù)規(guī)則隨機的將請求分發(fā)到指定的服務器上處理,負載均衡配置一般都需要同時配置反向代理,通過反向代理跳轉(zhuǎn)到負載均衡。而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. 權(quán)重


          指定輪詢幾率,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中,那么跳轉(zhuǎn)到另外一臺服務器的時候就需要重新登錄了,所以很多時候我們需要一個客戶只訪問一個服務器,那么就需要用iphash了,iphash的每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務器,可以解決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結(jié)果來分配請求,使每個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返回自定義頁面以及錯誤代碼,替換響應中的其他錯誤代碼,或?qū)g覽器重定向到其他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. 內(nèi)置變量


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


          • $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)調(diào)用后可以確定這個值。
          • $server_name :服務器名稱。
          • $server_port :請求到達服務器的端口號。
          • $request_uri :包含請求參數(shù)的原始URI,不包含主機名,如:”/foo/bar.php?arg=baz”。
          • $uri :不帶請求參數(shù)的當前URI,$uri不包含主機名,如”/foo/bar.html”。
          • $document_uri :與$uri相同




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

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


          正文結(jié)束


          推薦閱讀 ↓↓↓

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

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

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

          4.程序員一般可以從什么平臺接私活?

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

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

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

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

          一個人學習、工作很迷茫?


          點擊「閱讀原文」加入我們的小圈子!

          瀏覽 21
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  欧美一级特黄色aa大片 | 欧美成人精品导航 | 无码蜜桃 | bbb日本在线 | 亚洲无玛在线 |