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知識(shí)

        共 4580字,需瀏覽 10分鐘

         ·

        2020-09-21 20:45


        「觀感度:?????」

        「口味:虎皮雞蛋」

        「烹飪時(shí)間:10min」

        本文已收錄在前端食堂同名倉(cāng)庫(kù)Github github.com/Geekhyt,歡迎光臨食堂,如果覺(jué)得酒菜還算可口,賞個(gè) Star 對(duì)食堂老板來(lái)說(shuō)是莫大的鼓勵(lì)。

        歷史背景

        互聯(lián)網(wǎng)的全球化導(dǎo)致了互聯(lián)網(wǎng)的數(shù)據(jù)量快速增長(zhǎng),加上在本世紀(jì)初摩爾定律在單核 CPU 上的失效,CPU 朝著多核方向發(fā)展,而 Apache 顯然并沒(méi)有做好多核架構(gòu)的準(zhǔn)備,它的一個(gè)進(jìn)程同一時(shí)間只能處理一個(gè)連接,處理完一個(gè)請(qǐng)求后才能處理下一個(gè),這無(wú)疑不能應(yīng)對(duì)如今互聯(lián)網(wǎng)上海量的用戶。況且進(jìn)程間切換的成本是非常高的。在這種背景下,Nginx 應(yīng)運(yùn)而生,可以輕松處理數(shù)百萬(wàn)、上千萬(wàn)的連接。

        Nginx 優(yōu)勢(shì)

        • 高并發(fā)高性能
        • 可擴(kuò)展性好
        • 高可靠性
        • 熱部署
        • 開(kāi)源許可證

        Nginx 主要應(yīng)用場(chǎng)景

        • 靜態(tài)資源服務(wù),通過(guò)本地文件系統(tǒng)提供服務(wù)
        • 反向代理服務(wù)、負(fù)載均衡
        • API服務(wù)、權(quán)限控制,減少應(yīng)用服務(wù)器壓力

        Nginx 配置文件和目錄

        通過(guò) rpm -ql nginx 可以查看 Nginx 安裝的配置文件和目錄。

        如圖是我在某某云上安裝的最新穩(wěn)定版本的Nginx的配置文件及目錄。

        • /etc/nginx/nginx.conf 核心配置文件
        • /etc/nginx/conf.d/default.conf 默認(rèn)http服務(wù)器配置文件
        • /etc/nginx/fastcgi_params fastcgi配置
        • /etc/nginx/scgi_params scgi配置
        • /etc/nginx/uwsgi_params uwsgi配置
        • /etc/nginx/koi-utf
        • /etc/nginx/koi-win
        • /etc/nginx/win-utf 這三個(gè)文件是編碼映射文件,因?yàn)樽髡呤嵌韲?guó)人
        • /etc/nginx/mime.types 設(shè)置HTTP協(xié)議的Content-Type與擴(kuò)展名對(duì)應(yīng)關(guān)系的文件
        • /usr/lib/systemd/system/nginx-debug.service
        • /usr/lib/systemd/system/nginx.service
        • /etc/sysconfig/nginx
        • /etc/sysconfig/nginx-debug 這四個(gè)文件是用來(lái)配置守護(hù)進(jìn)程管理的
        • /etc/nginx/modules 基本共享庫(kù)和內(nèi)核模塊
        • /usr/share/doc/nginx-1.18.0 幫助文檔
        • /usr/share/doc/nginx-1.18.0/COPYRIGHT 版權(quán)聲明
        • /usr/share/man/man8/nginx.8.gz 手冊(cè)
        • /var/cache/nginx Nginx的緩存目錄
        • /var/log/nginx Nginx的日志目錄
        • /usr/sbin/nginx 可執(zhí)行命令
        • /usr/sbin/nginx-debug 調(diào)試執(zhí)行可執(zhí)行命令

        關(guān)于 Nginx 的常用命令以及配置文件語(yǔ)法很容易就可以搜到,本文不作贅述,下面從 Nginx 的功能以及實(shí)際場(chǎng)景出發(fā)看一看各個(gè)場(chǎng)景下 Nginx 可以提供給我們哪些配置項(xiàng)。在此之前,我們先來(lái)明確兩個(gè)概念:

        正向代理 Forward proxy

        一句話解釋正向代理,正向代理的對(duì)象是客戶端,服務(wù)器端看不到真正的客戶端。

        resolver?8.8.8.8?#?谷歌的域名解析地址
        server?{
        ?location?/?{
        ??????#?當(dāng)客戶端請(qǐng)求我的時(shí)候,我會(huì)把請(qǐng)求轉(zhuǎn)發(fā)給它
        ??????#?$http_host?要訪問(wèn)的主機(jī)名?$request_uri?請(qǐng)求路徑
        ??????proxy_pass?http://$http_host$request_uri;
        ?}
        }

        反向代理 Reverse proxy

        一句話解釋反向代理,反向代理的對(duì)象是服務(wù)端,客戶端看不到真正的服務(wù)端。

        跨域

        跨域是前端工程師都會(huì)面臨的場(chǎng)景,跨域的解決方案有很多。不過(guò)要知道在生產(chǎn)中,要么使用 CORS 、要么使用 Nginx 反向代理來(lái)解決跨域。在 Nginx 的配置文件中進(jìn)行如下配置即可:

        server?{
        ????listen???80;
        ????server_name???localhost;?#?用戶訪問(wèn)?localhost,反向代理到?http://webcanteen.com
        ????location?/?{
        ????????proxy_pass?http://webcanteen.com
        ????}
        }

        Gzip

        Gzip 是互聯(lián)網(wǎng)上非常普遍的一種數(shù)據(jù)壓縮格式,對(duì)于純文本來(lái)說(shuō)可以壓縮到原大小的 40%,可以節(jié)省大量的帶寬。不過(guò)需要注意的是,啟用 Gzip 所需的 HTTP 最低版本是 1.1。

        location?~?.*\.?(jpg|png|gif)$?{
        ????gzip?off;?#關(guān)閉壓縮
        ????root?/data/www/images;
        }
        location?~?.*\.?(html|js|css)$?{
        ????gzip?on;?#啟用壓縮
        ????gzip_min_length?1k;?#?超過(guò)1K的文件才壓縮
        ????gzip_http_version?1.1;?#?啟用gzip壓縮所需的HTTP最低版本
        ????gzip_comp_level?9;?#?壓縮級(jí)別,壓縮比率越高,文件被壓縮的體積越小
        ????gzip_types?text/css?application/javascript;?#?進(jìn)行壓縮的文件類(lèi)型
        ????root?/data/www/html;
        }

        請(qǐng)求限制

        對(duì)于大流量惡意的訪問(wèn),會(huì)造成帶寬的浪費(fèi),給服務(wù)器增加壓力。往往對(duì)于同一 IP 的連接數(shù)以及并發(fā)數(shù)進(jìn)行限制。

        關(guān)于請(qǐng)求限制主要有兩種類(lèi)型:

        • limit_conn_module 連接頻率限制
        • limit_req_module 請(qǐng)求頻率限制
        #?$binary_remote_addr?遠(yuǎn)程IP地址?zone?區(qū)域名稱?10m內(nèi)存區(qū)域大小
        limit_conn_zone?$binary_remote_addr?zone=coon_zone:10m;
        server?{
        ????#?conn_zone?設(shè)置對(duì)應(yīng)的共享內(nèi)存區(qū)域?1是限制的數(shù)量
        ?limit_conn?conn_zone?1;
        }
        #?$binary_remote_addr?遠(yuǎn)程IP地址?zone?區(qū)域名稱?10m內(nèi)存區(qū)域大小?rate?為請(qǐng)求頻率?1s?一次
        limit_req_zone?$binary_remote_addr?zone=req_zone:10m?rate=1r/s;
        server?{
        ????location?/?{
        ????????#?設(shè)置對(duì)應(yīng)的共享內(nèi)存區(qū)域?burst最大請(qǐng)求數(shù)閾值?nodelay不希望超過(guò)的請(qǐng)求被延遲
        ????????limit_req?zone=req_zone?burst=5?nodelay;
        ????}
        }

        訪問(wèn)控制

        關(guān)于訪問(wèn)控制主要有兩種類(lèi)型:

        • -http_access_module 基于 IP 的訪問(wèn)控制
        • -http_auth_basic_module 基于用戶的信任登陸

        (基于用戶的信任登陸不是很安全,本文不做配置介紹)

        以下是基于 IP 的訪問(wèn)控制:

        server?{
        ?location?~?^/index.html?{
        ??#?匹配?index.html?頁(yè)面?除了?127.0.0.1?以外都可以訪問(wèn)
        ??deny?127.0.0.1;
        ??allow?all;
        ?}
        }

        ab命令

        ab命令全稱為:Apache bench,是 Apache 自帶的壓力測(cè)試工具,也可以測(cè)試 Nginx、IIS 等其他 Web 服務(wù)器。

        • -n 總共的請(qǐng)求數(shù)
        • -c 并發(fā)的請(qǐng)求數(shù)
        ab?-n?1000?-c?5000?http://127.0.0.1/

        防盜鏈

        防盜鏈的原理就是根據(jù)請(qǐng)求頭中 referer 得到網(wǎng)頁(yè)來(lái)源,從而實(shí)現(xiàn)訪問(wèn)控制。這樣可以防止網(wǎng)站資源被非法盜用,從而保證信息安全,減少帶寬損耗,減輕服務(wù)器壓力。

        location?~?.*\.(jpg|png|gif)$?{?#?匹配防盜鏈資源的文件類(lèi)型
        ????#?通過(guò)?valid_referers?定義合法的地址白名單?$invalid_referer?不合法的返回403??
        ????valid_referers?none?blocked?127.0.0.1;
        ????if?($invalid_referer)?{
        ????????return?403;
        ????}
        }

        負(fù)載均衡 Load Balance

        當(dāng)我們的網(wǎng)站需要解決高并發(fā)、海量數(shù)據(jù)問(wèn)題時(shí),就需要使用負(fù)載均衡來(lái)調(diào)度服務(wù)器。將請(qǐng)求合理的分發(fā)到應(yīng)用服務(wù)器集群中的一臺(tái)臺(tái)服務(wù)器上。

        Nginx 可以為我們提供負(fù)載均衡的能力,具體配置如下:

        #?upstream?指定后端服務(wù)器地址
        #?weight?設(shè)置權(quán)重
        #?server?中會(huì)將?http://webcanteen?的請(qǐng)求轉(zhuǎn)發(fā)到?upstream?池中
        upstream?webcanteen?{
        ????server?127.0.0.1:66?weight=10;
        ????server?127.0.0.1:77?weight=1;
        ????server?127.0.0.1:88?weight=1;
        }
        server?{
        ????location?/?{
        ????????proxy_pass?http://webcanteen
        ????}
        }

        后端服務(wù)器狀態(tài)

        后端服務(wù)器支持以下的狀態(tài)配置:

        • down:當(dāng)前服務(wù)器不參與負(fù)載均衡
        • backup:當(dāng)其他節(jié)點(diǎn)都無(wú)法使用時(shí)的備用服務(wù)器
        • max_fails:允許請(qǐng)求失敗的次數(shù),若到達(dá)就會(huì)休眠
        • fail_timeout:經(jīng)過(guò)max_fails次失敗后,服務(wù)器的暫停時(shí)間,默認(rèn)為10s
        • max_conns:限制每個(gè)服務(wù)器的最大接收連接數(shù)
        upstream?webcanteen?{
        ?server?127.0.0.1:66?down;
        ?server?127.0.0.1:77?backup;
        ?server?127.0.0.1:88??max_fails=3?fail_timeout=10s;
        ?server?127.0.0.1:99?max_conns=1000;
        }

        分配方式

        • 輪詢(默認(rèn)),每個(gè)請(qǐng)求按照時(shí)間順序輪流分配到不同的后端服務(wù)器,如果某臺(tái)后端服務(wù)器宕機(jī),Nginx 輪詢列表會(huì)自動(dòng)將它去除掉。
        • weight(加權(quán)輪詢),輪詢的加強(qiáng)版,weight 和訪問(wèn)幾率成正比,主要用于后端服務(wù)器性能不均的場(chǎng)景。
        • ip_hash,每個(gè)請(qǐng)求按照訪問(wèn) IP 的 hash 結(jié)果分配,這樣每個(gè)訪問(wèn)可以固定訪問(wèn)一個(gè)后端服務(wù)器。
        • url_hash,按照訪問(wèn) URL 的 hash 結(jié)果來(lái)分配請(qǐng)求,使得每個(gè)URL定向到同一個(gè)后端服務(wù)器上,主要應(yīng)用于后端服務(wù)器為緩存時(shí)的場(chǎng)景。
        • 自定義hash,基于任意關(guān)鍵字作為 hash key 實(shí)現(xiàn) hash 算法的負(fù)載均衡
        • fair,按照后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,響應(yīng)時(shí)間短則優(yōu)先分配。

        ? 在看和轉(zhuǎn)發(fā)是莫大鼓勵(lì)??


        瀏覽 71
        點(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>
            性处破与摘花过程videos | 成人午夜色情无码视毛片 | 成人欧美精品一区二区 | 成人免费a片无遮挡 | 黄色视频网站免费 | 国产成人深夜福利在线 | 国产亲妺妺乱的性视频 | 色五月精品 | 91蜜桃传媒精品久久久一二三区 | 中国黄色小视频 |