成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端開發(fā)者必備的Nginx知識(shí)

pumpkin9 / 2306人閱讀

摘要:反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來自客戶端的請(qǐng)求,幫助服務(wù)器做請(qǐng)求轉(zhuǎn)發(fā),負(fù)載均衡等。如何實(shí)現(xiàn)負(fù)載均衡指定后端服務(wù)器地址列表在中攔截響應(yīng)請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到中配置的服務(wù)器列表。

nginx在應(yīng)用程序中的作用

解決跨域

請(qǐng)求過濾

配置gzip

負(fù)載均衡

靜態(tài)資源服務(wù)器

nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,也是一個(gè)通用的TCP/UDP代理服務(wù)器,最初由俄羅斯人Igor Sysoev編寫。

nginx現(xiàn)在幾乎是眾多大型網(wǎng)站的必用技術(shù),大多數(shù)情況下,我們不需要親自去配置它,但是了解它在應(yīng)用程序中所擔(dān)任的角色,以及如何解決這些問題是非常必要的。

下面我將從nginx在企業(yè)中的真實(shí)應(yīng)用來解釋nginx在應(yīng)用程序中起到的作用。

為了便于理解,首先先來了解一下一些基礎(chǔ)知識(shí),nginx是一個(gè)高性能的反向代理服務(wù)器那么什么是反向代理呢?

正向代理與反向代理

代理是在服務(wù)器和客戶端之間假設(shè)的一層服務(wù)器,代理將接收客戶端的請(qǐng)求并將它轉(zhuǎn)發(fā)給服務(wù)器,然后將服務(wù)端的響應(yīng)轉(zhuǎn)發(fā)給客戶端。

不管是正向代理還是反向代理,實(shí)現(xiàn)的都是上面的功能。

正向代理
正向代理,意思是一個(gè)位于客戶端和原始服務(wù)器(origin server)之間的服務(wù)器,為了從原始服務(wù)器取得內(nèi)容,客戶端向代理發(fā)送一個(gè)請(qǐng)求并指定目標(biāo)(原始服務(wù)器),然后代理向原始服務(wù)器轉(zhuǎn)交請(qǐng)求并將獲得的內(nèi)容返回給客戶端。

正向代理是為我們服務(wù)的,即為客戶端服務(wù)的,客戶端可以根據(jù)正向代理訪問到它本身無法訪問到的服務(wù)器資源。

正向代理對(duì)我們是透明的,對(duì)服務(wù)端是非透明的,即服務(wù)端并不知道自己收到的是來自代理的訪問還是來自真實(shí)客戶端的訪問。

反向代理
 反向代理(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ù)器。

反向代理是為服務(wù)端服務(wù)的,反向代理可以幫助服務(wù)器接收來自客戶端的請(qǐng)求,幫助服務(wù)器做請(qǐng)求轉(zhuǎn)發(fā),負(fù)載均衡等。

反向代理對(duì)服務(wù)端是透明的,對(duì)我們是非透明的,即我們并不知道自己訪問的是代理服務(wù)器,而服務(wù)器知道反向代理在為他服務(wù)。
圖片描述

基本配置 配置結(jié)構(gòu)

下面是一個(gè)nginx配置文件的基本結(jié)構(gòu):

events { 

}

http 
{
    server
    { 
        location path
        {
            ...
        }
        location path
        {
            ...
        }
     }

    server
    {
        ...
    }

}

main:nginx的全局配置,對(duì)全局生效。

events:配置影響nginx服務(wù)器或與用戶的網(wǎng)絡(luò)連接。

http:可以嵌套多個(gè)server,配置代理,緩存,日志定義等絕大多數(shù)功能和第三方模塊的配置。

server:配置虛擬主機(jī)的相關(guān)參數(shù),一個(gè)http中可以有多個(gè)server。

location:配置請(qǐng)求的路由,以及各種頁面的處理情況。

upstream:配置后端服務(wù)器具體地址,負(fù)載均衡配置不可或缺的部分。

內(nèi)置變量

下面是nginx一些配置中常用的內(nèi)置全局變量,你可以在配置的任何位置使用它們。

| 變量名 | 功能 |
| ------ | ------ |
| $host| 請(qǐng)求信息中的Host,如果請(qǐng)求中沒有Host行,則等于設(shè)置的服務(wù)器名 |
| $request_method | 客戶端請(qǐng)求類型,如GET、POST
| $remote_addr | 客戶端的IP地址 |
|$args | 請(qǐng)求中的參數(shù) |
|$content_length| 請(qǐng)求頭中的Content-length字段 |
|$http_user_agent | 客戶端agent信息 |
|$http_cookie | 客戶端cookie信息 |
|$remote_addr | 客戶端的IP地址 |
|$remote_port | 客戶端的端口 |
|$server_protocol | 請(qǐng)求使用的協(xié)議,如HTTP/1.0、·HTTP/1.1` |
|$server_addr | 服務(wù)器地址 |
|$server_name| 服務(wù)器名稱|
|$server_port|服務(wù)器的端口號(hào)|

解決跨域

先追本溯源以下,跨域究竟是怎么回事。

跨域的定義

同源策略限制了從同一個(gè)源加載的文檔或腳本如何與來自另一個(gè)源的資源進(jìn)行交互。這是一個(gè)用于隔離潛在惡意文件的重要安全機(jī)制。通常不允許不同源間的讀操作。

同源的定義

如果兩個(gè)頁面的協(xié)議,端口(如果有指定)和域名都相同,則兩個(gè)頁面具有相同的源。

nginx解決跨域的原理

例如:

前端server的域名為:fe.server.com

后端服務(wù)的域名為:dev.server.com

現(xiàn)在我在fe.server.com對(duì)dev.server.com發(fā)起請(qǐng)求一定會(huì)出現(xiàn)跨域。

現(xiàn)在我們只需要啟動(dòng)一個(gè)nginx服務(wù)器,將server_name設(shè)置為fe.server.com,然后設(shè)置相應(yīng)的location以攔截前端需要跨域的請(qǐng)求,最后將請(qǐng)求代理回dev.server.com。如下面的配置:

server {
        listen       80;
        server_name  fe.server.com;
        location / {
                proxy_pass dev.server.com;
        }
}

這樣可以完美繞過瀏覽器的同源策略:fe.server.com訪問nginxfe.server.com屬于同源訪問,而nginx對(duì)服務(wù)端轉(zhuǎn)發(fā)的請(qǐng)求不會(huì)觸發(fā)瀏覽器的同源策略。

請(qǐng)求過濾

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/404.jpg)

根據(jù)狀態(tài)碼過濾

error_page 500 501 502 503 504 506 /50x.html;
    location = /50x.html {
        #將跟路徑改編為存放html的路徑。
        root /root/static/html;
    }

根據(jù)URL名稱過濾,精準(zhǔn)匹配URL,不匹配的URL全部重定向到主頁。

location / {
    rewrite  ^.*$ /index.html  redirect;
}

根據(jù)請(qǐng)求類型過濾。

if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
        return 403;
    }
配置gzip

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/gzip.jpg)

GZIP是規(guī)定的三種標(biāo)準(zhǔn)HTTP壓縮格式之一。目前絕大多數(shù)的網(wǎng)站都在使用 GZIP 傳輸 HTML、CSSJavaScript 等資源文件。

對(duì)于文本文件,GZip 的效果非常明顯,開啟后傳輸所需流量大約會(huì)降至 1/4 ~ 1/3。

并不是每個(gè)瀏覽器都支持gzip的,如何知道客戶端是否支持gzip呢,請(qǐng)求頭中的Accept-Encoding來標(biāo)識(shí)對(duì)壓縮的支持。

啟用gzip同時(shí)需要客戶端和服務(wù)端的支持,如果客戶端支持gzip的解析,那么只要服務(wù)端能夠返回gzip的文件就可以啟用gzip了,我們可以通過nginx的配置來讓服務(wù)端支持gzip。下面的responecontent-encoding:gzip,指服務(wù)端開啟了gzip的壓縮方式。

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/gzip2.png)

    gzip                    on;
    gzip_http_version       1.1;        
    gzip_comp_level         5;
    gzip_min_length         1000;
    gzip_types text/csv text/xml text/css text/plain text/javascript application/javascript application/x-javascript application/json application/xml;
gzip

開啟或者關(guān)閉gzip模塊

默認(rèn)值為 off

可配置為 on / off

gzip_http_version

啟用 GZip 所需的 HTTP 最低版本

默認(rèn)值為 HTTP/1.1

這里為什么默認(rèn)版本不是1.0呢?

HTTP 運(yùn)行在 TCP 連接之上,自然也有著跟 TCP 一樣的三次握手、慢啟動(dòng)等特性。

啟用持久連接情況下,服務(wù)器發(fā)出響應(yīng)后讓TCP連接繼續(xù)打開著。同一對(duì)客戶/服務(wù)器之間的后續(xù)請(qǐng)求和響應(yīng)可以通過這個(gè)連接發(fā)送。

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/keepalive.png)

為了盡可能的提高 HTTP 性能,使用持久連接就顯得尤為重要了。

HTTP/1.1 默認(rèn)支持 TCP 持久連接,HTTP/1.0 也可以通過顯式指定 Connection: keep-alive 來啟用持久連接。對(duì)于 TCP 持久連接上的 HTTP 報(bào)文,客戶端需要一種機(jī)制來準(zhǔn)確判斷結(jié)束位置,而在 HTTP/1.0 中,這種機(jī)制只有 Content-Length。而在HTTP/1.1 中新增的 Transfer-Encoding: chunked 所對(duì)應(yīng)的分塊傳輸機(jī)制可以完美解決這類問題。

nginx同樣有著配置chunked的屬性chunked_transfer_encoding,這個(gè)屬性是默認(rèn)開啟的。

Nginx 在啟用了GZip的情況下,不會(huì)等文件 GZip 完成再返回響應(yīng),而是邊壓縮邊響應(yīng),這樣可以顯著提高 TTFB(Time To First Byte,首字節(jié)時(shí)間,WEB 性能優(yōu)化重要指標(biāo))。這樣唯一的問題是,Nginx 開始返回響應(yīng)時(shí),它無法知道將要傳輸?shù)奈募罱K有多大,也就是無法給出 Content-Length 這個(gè)響應(yīng)頭部。

所以,在HTTP1.0中如果利用Nginx 啟用了GZip,是無法獲得 Content-Length 的,這導(dǎo)致HTTP1.0中開啟持久鏈接和使用GZip只能二選一,所以在這里gzip_http_version默認(rèn)設(shè)置為1.1。

gzip_comp_level

壓縮級(jí)別,級(jí)別越高壓縮率越大,當(dāng)然壓縮時(shí)間也就越長(zhǎng)(傳輸快但比較消耗cpu)。

默認(rèn)值為 1

壓縮級(jí)別取值為1-9

gzip_min_length

設(shè)置允許壓縮的頁面最小字節(jié)數(shù),Content-Length小于該值的請(qǐng)求將不會(huì)被壓縮

默認(rèn)值:0

當(dāng)設(shè)置的值較小時(shí),壓縮后的長(zhǎng)度可能比原文件大,建議設(shè)置1000以上

gzip_types

要采用gzip壓縮的文件類型(MIME類型)

默認(rèn)值:text/html(默認(rèn)不壓縮js/css)

負(fù)載均衡 什么是負(fù)載均衡

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/nginx3.jpg)

如上面的圖,前面是眾多的服務(wù)窗口,下面有很多用戶需要服務(wù),我們需要一個(gè)工具或策略來幫助我們將如此多的用戶分配到每個(gè)窗口,來達(dá)到資源的充分利用以及更少的排隊(duì)時(shí)間。

把前面的服務(wù)窗口想像成我們的后端服務(wù)器,而后面終端的人則是無數(shù)個(gè)客戶端正在發(fā)起請(qǐng)求。負(fù)載均衡就是用來幫助我們將眾多的客戶端請(qǐng)求合理的分配到各個(gè)服務(wù)器,以達(dá)到服務(wù)端資源的充分利用和更少的請(qǐng)求時(shí)間。

nginx如何實(shí)現(xiàn)負(fù)載均衡

Upstream指定后端服務(wù)器地址列表

upstream balanceServer {
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

在server中攔截響應(yīng)請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到Upstream中配置的服務(wù)器列表。

    server {
        server_name  fe.server.com;
        listen 80;
        location /api {
            proxy_pass http://balanceServer;
        }
    }

上面的配置只是指定了nginx需要轉(zhuǎn)發(fā)的服務(wù)端列表,并沒有指定分配策略。

nginx實(shí)現(xiàn)負(fù)載均衡的策略

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/loadBalancing.png)

輪詢策略

默認(rèn)情況下采用的策略,將所有客戶端請(qǐng)求輪詢分配給服務(wù)端。這種策略是可以正常工作的,但是如果其中某一臺(tái)服務(wù)器壓力太大,出現(xiàn)延遲,會(huì)影響所有分配在這臺(tái)服務(wù)器下的用戶。

upstream balanceServer {
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/nginx5.png)

最小連接數(shù)策略

將請(qǐng)求優(yōu)先分配給壓力較小的服務(wù)器,它可以平衡每個(gè)隊(duì)列的長(zhǎng)度,并避免向壓力大的服務(wù)器添加更多的請(qǐng)求。

upstream balanceServer {
    least_conn;
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

![image](https://lsqimg-1257917459.cos-website.ap-beijing.myqcloud.com/blog/nginx4.png)

最快響應(yīng)時(shí)間策略

依賴于NGINX Plus,優(yōu)先分配給響應(yīng)時(shí)間最短的服務(wù)器。

upstream balanceServer {
    fair;
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}

客戶端ip綁定

來自同一個(gè)ip的請(qǐng)求永遠(yuǎn)只分配一臺(tái)服務(wù)器,有效解決了動(dòng)態(tài)網(wǎng)頁存在的session共享問題。

upstream balanceServer {
    ip_hash;
    server 10.1.22.33:12345;
    server 10.1.22.34:12345;
    server 10.1.22.35:12345;
}
靜態(tài)資源服務(wù)器
location ~* .(png|gif|jpg|jpeg)$ {
    root    /root/static/;  
    autoindex on;
    access_log  off;
    expires     10h;# 設(shè)置過期時(shí)間為10小時(shí)          
}

匹配以png|gif|jpg|jpeg為結(jié)尾的請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到本地路徑,root中指定的路徑即nginx本地路徑。同時(shí)也可以進(jìn)行一些緩存的設(shè)置。

小結(jié)

nginx的功能非常強(qiáng)大,還有很多需要探索,上面的一些配置都是公司配置的真實(shí)應(yīng)用(精簡(jiǎn)過了)。

文中如有錯(cuò)誤,歡迎在評(píng)論區(qū)指正,如果這篇文章幫助到了你,歡迎點(diǎn)贊和關(guān)注。

想閱讀更多優(yōu)質(zhì)文章、可關(guān)注我的github博客,你的star?、點(diǎn)贊和關(guān)注是我持續(xù)創(chuàng)作的動(dòng)力!

推薦大家使用Fundebug,一款很好用的BUG監(jiān)控工具~

推薦關(guān)注我的微信公眾號(hào)【code秘密花園】,每天推送高質(zhì)量文章,我們一起交流成長(zhǎng)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/40374.html

相關(guān)文章

  • Web前端必備-Nginx知識(shí)匯總

    摘要:安裝簡(jiǎn)單配置簡(jiǎn)潔啟動(dòng)快速便捷支持熱部署支持擁有高度模塊化的設(shè)計(jì)。備注在版本之前,不能在中使用權(quán)重。不能與同時(shí)使用。當(dāng)有服務(wù)器需要剔除,必須手動(dòng)掉。表示把請(qǐng)求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器。表示當(dāng)前的暫時(shí)不參與負(fù)載均衡。表示預(yù)留的備份機(jī)器。 本文已同步到專業(yè)技術(shù)網(wǎng)站 www.sufaith.com, 該網(wǎng)站專注于前后端開發(fā)技術(shù)與經(jīng)驗(yàn)分享, 包含Web開發(fā)、Nodejs、Python、Lin...

    whatsns 評(píng)論0 收藏0
  • IT運(yùn)維必備技能

    摘要:熟練使用等抓包工具底層大神級(jí),內(nèi)核其它素養(yǎng)處理方式除了技能,我覺得素養(yǎng)態(tài)度也可以談?wù)劙踩\(yùn)維人員的權(quán)限很大,所以一定要保證帳號(hào)私鑰的安全。應(yīng)該第一時(shí)間和開發(fā)部門確認(rèn),要求優(yōu)化代碼。進(jìn)取心不斷學(xué)習(xí)運(yùn)維的知識(shí)范圍很廣,要不斷學(xué)習(xí)。 寫代碼寫了10多年, 從小公司到大公司, 前端, 后端, 數(shù)據(jù)庫, 運(yùn)維什么都做, 最后還是專職做運(yùn)維了. 整理下運(yùn)維的一些技能, 部分是網(wǎng)上資料并整理. Li...

    lily_wang 評(píng)論0 收藏0
  • 平時(shí)積累前端資源,持續(xù)更新中。。。

    本文收集學(xué)習(xí)過程中使用到的資源。 持續(xù)更新中…… 項(xiàng)目地址 https://github.com/abc-club/f... 目錄 vue react react-native Weex typescript Taro nodejs 常用庫 css js es6 移動(dòng)端 微信公眾號(hào) 小程序 webpack GraphQL 性能與監(jiān)控 高質(zhì)文章 趨勢(shì) 動(dòng)效 數(shù)據(jù)結(jié)構(gòu)與算法 js core 代碼規(guī)范...

    acrazing 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

pumpkin9

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<