1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 13828字,需瀏覽 28分鐘

         ·

        2021-08-01 11:08

        點(diǎn)擊上方[全棧開發(fā)者社區(qū)]右上角[...][設(shè)為星標(biāo)?]

        點(diǎn)擊領(lǐng)取全棧資料全棧資料

        一、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、訪問測試

        • 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錯(cuò)誤,可能是因?yàn)閚ginx.conf 的第一行user配置不對,默認(rèn)是#user nobody;是注釋的,linux下改成user root; macos下改成user 用戶名 所在組; 然后重新加載配置文件或者重啟,再試一下就可以了, 用戶名可以通過who am i 命令來查看。

        4、指令簡介

        • server : 用于定義服務(wù),http中可以有多個(gè)server塊
        • listen : 指定服務(wù)器偵聽請求的IP地址和端口,如果省略地址,服務(wù)器將偵聽所有地址,如果省略端口,則使用標(biāo)準(zhǔn)端口
        • server_name : 服務(wù)名稱,用于配置域名
        • location : 用于配置映射路徑uri對應(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/對應(yīng)的location

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

        • =       進(jìn)行普通字符精確匹配。也就是完全匹配。
        • ^~         前綴匹配。如果匹配成功,則不再匹配其他location。
        • ~      表示執(zhí)行一個(gè)正則匹配,區(qū)分大小寫
        • ~*         表示執(zhí)行一個(gè)正則匹配,不區(qū)分大小寫
        • /xxx/   常規(guī)字符串路徑匹配
        • /       通用匹配,任何請求都會(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 / {
            # 匹配所有以 / 開頭的請求。
            # 但是如果有更長的同類型的表達(dá)式,則選擇更長的表達(dá)式。
            # 如果有正則表達(dá)式可以匹配,則優(yōu)先匹配正則表達(dá)式。
            [ configuration B ]
        }
        location /documents/ {
            # 匹配所有以 /documents/ 開頭的請求,匹配符合以后,還要繼續(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é)尾的請求。
            # 但是 以 /images/開頭的請求,將使用 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)

        三、反向代理

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

        簡單來說就是真實(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

        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)請求服務(wù)器出錯(cuò)去尋找其他服務(wù)器
                 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503; 
            }

        }   

        當(dāng)我們訪問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ù)。

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

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

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

        每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器,也就是說第一次請求分配到第一臺(tái)服務(wù)器上,第二次請求分配到第二臺(tái)服務(wù)器上,如果只有兩臺(tái)服務(wù)器,第三次請求繼續(xù)分配到第一臺(tái)上,這樣循環(huán)輪詢下去,也就是服務(wù)器接收請求的比例是 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ù)器接收請求的比例就是各自配置的weight的比例,用于后端服務(wù)器性能不均的情況,比如服務(wù)器性能差點(diǎn)就少接收點(diǎn)請求,服務(wù)器性能好點(diǎn)就多處理點(diǎn)請求。

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

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

        3. ip_hash

        上面的2種方式都有一個(gè)問題,那就是下一個(gè)請求來的時(shí)候請求可能分發(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è)請求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題。

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

        4. fair(第三方)

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

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

        5. url_hash(第三方)

        按訪問url的hash結(jié)果來分配請求,使每個(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請求 rewrite,通過使用rewrite指令在請求處理期間多次修改請求URI,該指令具有一個(gè)可選參數(shù)和兩個(gè)必需參數(shù)。

        第一個(gè)(必需)參數(shù)是請求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)注Java知音公眾號(hào),回復(fù)“后端面試”,送你一份面試題寶典!

        • $args#這個(gè)變量等于請求行中的參數(shù),同$query_string
        • $content_length :請求頭中的Content-length字段。
        • $content_type :請求頭中的Content-Type字段。
        • $document_root :當(dāng)前請求在root指令中指定的值。
        • $host :請求主機(jī)頭字段,否則為服務(wù)器名稱。
        • $http_user_agent :客戶端agent信息
        • $http_cookie :客戶端cookie信息
        • $limit_rate :這個(gè)變量可以限制連接速率。
        • $request_method :客戶端請求的動(dòng)作,通常為GET或POST。
        • $remote_addr :客戶端的IP地址。
        • $remote_port :客戶端的端口。
        • $remote_user :已經(jīng)經(jīng)過Auth Basic Module驗(yàn)證的用戶名。
        • $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)用后可以確定這個(gè)值。
        • $server_name :服務(wù)器名稱。
        • $server_port :請求到達(dá)服務(wù)器的端口號(hào)。
        • $request_uri :包含請求參數(shù)的原始URI,不包含主機(jī)名,如:”/foo/bar.php?arg=baz”。
        • $uri :不帶請求參數(shù)的當(dāng)前URI,$uri不包含主機(jī)名,如”/foo/bar.html”。
        • $document_uri :與$uri相同

        覺得本文對你有幫助?請分享給更多人

        關(guān)注「全棧開發(fā)者社區(qū)」加星標(biāo),提升全棧技能

        本公眾號(hào)會(huì)不定期給大家發(fā)福利,包括送書、學(xué)習(xí)資源等,敬請期待吧!

        如果感覺推送內(nèi)容不錯(cuò),不妨右下角點(diǎn)個(gè)在看轉(zhuǎn)發(fā)朋友圈或收藏,感謝支持。


        好文章,留言、點(diǎn)贊、在看和分享一條龍吧??

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            日韩城人视频 | 丁香五月精品 | 乱伦一级黄色视频 | 少妇被又大又硬又粗又黄 | 人人爱人人做 | 日韩欧美久久 | 久久久国产精品免费A片分环卫 | 啊灬啊灬啊灬啊灬高潮了影片日本 | а√天堂中文在线资源8 | 免费荫蒂添的好舒服视频 |