前端需要掌握的Nginx知識(shí)點(diǎn)

什么是Nginx?


Nginx是一款免費(fèi)開(kāi)源的高性能HTTP服務(wù)器以及反向代理服務(wù)器(Reverse Proxy),同時(shí)可以提供IMAP/POP3/SMATP代理服務(wù)等功能。能夠快速的響應(yīng)靜態(tài)頁(yè)面請(qǐng)求和支持第三方功能模塊擴(kuò)展弄诲。

下載 (2).png

Nginx的優(yōu)點(diǎn)


  • 高并發(fā)易遣、高性能(官方給出的并發(fā)數(shù)據(jù)5萬(wàn)济竹,實(shí)際中可以達(dá)到2-4萬(wàn))
  • 輕量級(jí)趴荸、內(nèi)存消耗少
  • 穩(wěn)定性高晌梨,宕機(jī)概率低
  • 支持熱部署
  • 模塊化設(shè)計(jì)钙姊,擴(kuò)展性較好
  • cpu親和

Nginx常用的場(chǎng)景


  • 靜態(tài)資源服務(wù)器
  • 動(dòng)態(tài)匹配
  • 反向代理
  • Gzip壓縮
  • 負(fù)載均衡

Nginx的安裝配置


mac下鏡像飛速安裝Homebrew教程: https://zhuanlan.zhihu.com/p/90508170

$ brew install nginx

Nginx常用的命令


  • 啟動(dòng): nginx
  • 查看版本號(hào): nginx -v
  • 查看nginx 編譯的參數(shù): nginx -V
  • 重新啟動(dòng)nginx: nginx -s reload
  • 優(yōu)雅重啟毯辅,并重新載入配置文件nginx.conf: /usr/local/nginx/sbin/nginx -s reload
  • 優(yōu)雅停止nginx,有連接時(shí)會(huì)等連接請(qǐng)求完成再殺死worker進(jìn)程 /usr/local/nginx/sbin/nginx -s quit
    具體常用的命令參考如下:
nginx -s stop       快速關(guān)閉Nginx煞额,可能不保存相關(guān)信息思恐,并迅速終止web服務(wù)。
nginx -s quit       平穩(wěn)關(guān)閉Nginx膊毁,保存相關(guān)信息胀莹,有安排的結(jié)束web服務(wù)。
nginx -s reload     因改變了Nginx相關(guān)配置婚温,需要重新加載配置而重載描焰。
nginx -s reopen     重新打開(kāi)日志文件。
nginx -c filename   為 Nginx 指定一個(gè)配置文件栅螟,來(lái)代替缺省的荆秦。
nginx -t            不運(yùn)行逆日,僅測(cè)試配置文件。nginx 將檢查配置文件的語(yǔ)法的正確性萄凤,并嘗試打開(kāi)配置文件中所引用到的文件室抽。
nginx -v            顯示 nginx 的版本。
nginx -V            顯示 nginx 的版本靡努,編譯器版本和配置參數(shù)坪圾。

成功看到歡迎頁(yè)面~!(對(duì)應(yīng)的html是/usr/local/var/www/index.html)


截屏2021-05-31 下午3.14.28.png

Nginx的默認(rèn)配置


Nginx 安裝目錄下的nginx.conf就是Nginx全局的配置文件惑朦,我們主要修改這里的內(nèi)容兽泄。nginx.conf.default作為配置文件的備份。

nginx默認(rèn)使用8080端口 如果發(fā)現(xiàn)端口被占用了漾月,可以殺掉使用使用改端口的進(jìn)程病梢,也可以修改/usr/local/etc/nginx/nginx.conf下的

http {
    server {
        listen       8181;
        server_name  localhost;  

        #charset koi8-r;
        .....
        }
    }

其中nginx.conf中的配置信息如下:


#user  nobody;
#設(shè)置工作進(jìn)程的數(shù)量
worker_processes  1;

#錯(cuò)誤日志存放目錄
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#進(jìn)程pid存放位置
#pid        logs/nginx.pid;

# 處理連接
events {
    # 設(shè)置連接數(shù),單個(gè)后臺(tái)進(jìn)程的最大并發(fā)數(shù)
    worker_connections  1024;
}


http {
    # 文件拓展名查找集合
    include       mime.types;
    # 當(dāng)查找不到對(duì)應(yīng)類型的時(shí)候默認(rèn)值
    default_type  application/octet-stream;

    # 日志格式,定義別名為 main
    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
    
    #nginx訪問(wèn)日志存放位置
    #access_log  logs/access.log  main;

    # 調(diào)用 sendfile 系統(tǒng)傳輸文件
    sendfile        on;  #開(kāi)啟高效傳輸模式
    #tcp_nopush     on; #減少網(wǎng)絡(luò)報(bào)文段的數(shù)量

    # 客戶端與服務(wù)器連接超時(shí)時(shí)間梁肿,超時(shí)自動(dòng)斷開(kāi)
    #keepalive_timeout  0;
    keepalive_timeout  65;

    # 開(kāi)啟gizip 壓縮
    #gzip  on;

    # 虛擬主機(jī)
    server {
        listen       8181;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        # 路由
        location / {
            root   html;
            index  index.html index.htm;

            #第一種情況 拒絕訪問(wèn)ip地址段為 50-100 的ip訪問(wèn)
            deny 192.168.10.50/100;
            
            # 第二種情況 只允許ip地址為 192.168.10.50 的ip訪問(wèn)
            allow 192.168.10.50;
            deny all;
            
            # 第三種情況 這樣配置都不能訪問(wèn)蜓陌,從上到下依次匹配
            deny all;
            allow 192.168.10.50;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}
    include servers/*;
}

搭建靜態(tài)站點(diǎn)

# 虛擬主機(jī)server塊
server {
    # 端口
    listen   8080;
    # 匹配請(qǐng)求中的host值
    server_name  localhost;
    
    # 監(jiān)聽(tīng)請(qǐng)求路徑
    location / {
        # 查找目錄
        root /source;
        # 默認(rèn)查找
        index index.html index.htm;
    }
}

字段說(shuō)明:

  • server 配置虛擬主機(jī)的相關(guān)參數(shù),可以有多個(gè)
  • server_name 通過(guò)請(qǐng)求中的host值 找到對(duì)應(yīng)的虛擬主機(jī)的配置
  • location 配置請(qǐng)求路由吩蔑,處理相關(guān)頁(yè)面情況
  • root 查找資源的路徑

配置完成后執(zhí)行 nginx -t 看是否有錯(cuò)誤钮热,如果看到的是下面這種就是成功了

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

然后執(zhí)行nginx -s reload 更新Nginx配置文件,這時(shí)候打開(kāi)瀏覽器 輸入 localhost:8080 應(yīng)該就能看到你的頁(yè)面了。

動(dòng)態(tài)匹配(請(qǐng)求過(guò)濾)

通常在開(kāi)發(fā)環(huán)境或者測(cè)試環(huán)境的時(shí)候呢我們修改了代碼烛芬,因?yàn)闉g覽器緩存隧期,可能不會(huì)生效,需要手動(dòng)清除緩存赘娄,才能看到修改后的效果仆潮,這里我們做一個(gè)配置讓瀏覽器不緩存相關(guān)的資源。

location ~* \.(js|css|png|jpg|gif)$ {
    add_header Cache-Control no-store;
}

~* .(js|css|png|jpg|gif)$ 是匹配以相關(guān)文件類型然后單獨(dú)處理遣臼。 add_header 是給請(qǐng)求的響應(yīng)加上一個(gè)頭信息Cache-Control no-store性置,告知瀏覽器禁用緩存,每次都從服務(wù)器獲取 效果如下:

截屏2021-05-31 下午3.37.13.png

匹配規(guī)則

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

location =|~|~*|^~| /uri/

  • = 表示精確匹配暑诸。只有請(qǐng)求的url路徑與后面的字符串完全相等時(shí)蚌讼,才會(huì)命中(優(yōu)先級(jí)最高)。
  • ^~ 表示如果該符號(hào)后面的字符是最佳匹配个榕,采用該規(guī)則,不再進(jìn)行后續(xù)的查找芥喇。
  • ~ 表示該規(guī)則是使用正則定義的西采,區(qū)分大小寫。
  • ~* 表示該規(guī)則是使用正則定義的继控,不區(qū)分大小寫械馆。
  • / 通用匹配胖眷,任何請(qǐng)求都會(huì)匹配到

通過(guò)狀態(tài)碼來(lái)過(guò)濾請(qǐng)求

# 通過(guò)狀態(tài)碼,返回指定的錯(cuò)誤頁(yè)面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /source/error_page;
}

反向代理解決跨域


在前后端分離的開(kāi)發(fā)中霹崎,跨域問(wèn)題是一個(gè)非常常見(jiàn)的問(wèn)題珊搀,現(xiàn)在解決跨域問(wèn)題比較常用的兩種方式為:

  • 跨域資源請(qǐng)求(CORS)
  • Nginx反向代理


    612653-20190226142303336-49757621.png
截屏2021-05-31 下午4.29.29.png

先來(lái)看上面的圖 ,當(dāng)用戶請(qǐng)求xx.720ui.com/server1的時(shí)候尾菇,Nginx會(huì)將請(qǐng)求轉(zhuǎn)發(fā)給Server1這個(gè)服務(wù)器上的具體應(yīng)用境析,從而達(dá)到跨域的目的

同時(shí)nginx解決跨域時(shí)常用的參數(shù)配置。

location /api {   
    # 請(qǐng)求host傳給后端
    proxy_set_header Host $http_host;
    # 請(qǐng)求ip 傳給后端
    proxy_set_header X-Real-IP $remote_addr;
    # 請(qǐng)求協(xié)議傳給后端
    proxy_set_header X-Scheme $scheme;
    # 路徑重寫
    rewrite  /api/(.*)  /$1  break;
    # 代理服務(wù)器
    proxy_pass http://localhost:9000;
}
  • 攔截路徑/api, 可以通過(guò)正則匹配
  • proxy_set_header 允許重新定義或添加字段傳遞給代理服務(wù)器的請(qǐng)求頭
  • $http_host remote_addr派诬、scheme 為Nginx內(nèi)置變量
  • rewrite 根據(jù)rewrite后的請(qǐng)求URI劳淆,將路徑重寫,如:接口路徑為 /user, 我們可以請(qǐng)求 /api/user默赂。(為什么需要重寫uri沛鸵?因?yàn)樵谑褂肗ginx做反向代理的時(shí)候,需要匹配到跨域的接口再做轉(zhuǎn)發(fā)缆八,為了方便匹配曲掰,會(huì)人為的在原接口中添加一段路徑(或標(biāo)示, 如例子中的api)奈辰,因此需要在匹配之后蜈缤、轉(zhuǎn)發(fā)之前把添加的那段去掉,因此需要rewrite)
  • break 繼續(xù)本次請(qǐng)求后面的處理 ,停止匹配下面的location冯挎。需要注意的是與之類似的last執(zhí)行過(guò)程則是停止當(dāng)前這個(gè)請(qǐng)求底哥,并根據(jù)rewrite匹配的規(guī)則重新發(fā)起一個(gè)請(qǐng)求,從上到下依次匹配location后面的規(guī)則
  • proxy_pass 代理服務(wù)器

原理:Nginx攔截到相關(guān)匹配規(guī)則, Nginx再將請(qǐng)求轉(zhuǎn)發(fā)到http://localhost:9090房官,Nginx得到請(qǐng)求后再響應(yīng)到前端趾徽,可以直接請(qǐng)求/api/user完成請(qǐng)求。
nginx跨域請(qǐng)求一個(gè)簡(jiǎn)單的dome:

server
{
    listen 80;
    server_name www.1212.com;

    location ^~ /blog/ {
        proxy_pass http://blog.12121.com/;
    }   
}

總結(jié):大功告成????????????????????????????????????????

參考鏈接:

  1. https://juejin.cn/post/6844903817595584525
  2. https://juejin.cn/post/6844904082067423246
  3. https://juejin.cn/post/6844904020360986631
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末翰守,一起剝皮案震驚了整個(gè)濱河市孵奶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蜡峰,老刑警劉巖了袁,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異湿颅,居然都是意外死亡载绿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門油航,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)崭庸,“玉大人,你說(shuō)我怎么就攤上這事∨孪恚” “怎么了执赡?”我有些...
    開(kāi)封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)函筋。 經(jīng)常有香客問(wèn)我沙合,道長(zhǎng),這世上最難降的妖魔是什么跌帐? 我笑而不...
    開(kāi)封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任首懈,我火速辦了婚禮,結(jié)果婚禮上含末,老公的妹妹穿的比我還像新娘猜拾。我一直安慰自己,他們只是感情好佣盒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布挎袜。 她就那樣靜靜地躺著,像睡著了一般肥惭。 火紅的嫁衣襯著肌膚如雪盯仪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天蜜葱,我揣著相機(jī)與錄音全景,去河邊找鬼。 笑死牵囤,一個(gè)胖子當(dāng)著我的面吹牛爸黄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播揭鳞,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炕贵,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了野崇?” 一聲冷哼從身側(cè)響起称开,我...
    開(kāi)封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎乓梨,沒(méi)想到半個(gè)月后鳖轰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扶镀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蕴侣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狈惫。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睛蛛,死狀恐怖鹦马,靈堂內(nèi)的尸體忽然破棺而出胧谈,到底是詐尸還是另有隱情忆肾,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布菱肖,位于F島的核電站客冈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏稳强。R本人自食惡果不足惜场仲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望退疫。 院中可真熱鬧渠缕,春花似錦、人聲如沸褒繁。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棒坏。三九已至燕差,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間坝冕,已是汗流浹背徒探。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留喂窟,地道東北人测暗。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像磨澡,于是被迫代替她去往敵國(guó)和親碗啄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 一钱贯、Nginx是什么挫掏? 定義:Nginx (engine x) 是一個(gè)高性能的HTTP和反向代理web服務(wù)器。 從...
    今天又要上班嗎閱讀 618評(píng)論 0 0
  • Nginx與Node.js “Nginx是一款輕量級(jí)的HTTP服務(wù)器秩命,采用事件驅(qū)動(dòng)的異步非阻塞處理方式框架尉共,這讓其...
    bayi_lzp閱讀 331評(píng)論 1 0
  • 一.跨域的定義 同源策略是一種約定,它是瀏覽器最核心也最基本的安全功能弃锐,如果缺少了同源策略袄友,瀏覽器很容易受到XSS...
    0winder0閱讀 316評(píng)論 0 0
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來(lái)的情緒霹菊。表情可以傳達(dá)很多信息剧蚣。高興了當(dāng)然就笑了支竹,難過(guò)就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,193評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者鸠按,不喜歡去冒險(xiǎn)礼搁,但是人生放棄了冒險(xiǎn),也就放棄了無(wú)數(shù)的可能目尖。 ...
    yichen大刀閱讀 6,033評(píng)論 0 4