此文已同步到因卓誒博客:
Nginx:很正經(jīng)的學(xué)習(xí)筆記(一) - 因卓誒-愛分享愛原創(chuàng)的技術(shù)博客 ~ 個人博客www.yinzhuoei.comNginx是一款高性能服務(wù)器,最近這幾年非持龈火,以輕量且高并發(fā)巷懈,高性能著稱,那么此筆記將不會從0開始講解API慌洪,而是會從各種問題入手顶燕,通過問題學(xué)習(xí)nginx凑保。
特點(diǎn):
- IO多路復(fù)用
- 高性能
- 高并發(fā)
- 占用系統(tǒng)資源少
Nginx作為一個WEB服務(wù)器,有著大好的未來涌攻,市場份額非常給力欧引,同時也是份額上升速度最快的web服務(wù)器。
Nginx作為前端來說恳谎,需要學(xué)習(xí)什么芝此?我們只需要學(xué)習(xí)Nginx在應(yīng)用部署,反向代理因痛,處理資源的進(jìn)程婚苹,亦或者是搭建網(wǎng)站的基礎(chǔ)知識,如果你還沒有一個blog鸵膏,那么就從現(xiàn)在開始學(xué)習(xí)nginx并且搭建你的第一個網(wǎng)站吧膊升。
反向代理與正向代理
我們在平時上外網(wǎng)的時候,比如谷歌谭企,youtube廓译,twitter,Ins等债查,如果使用我們內(nèi)地網(wǎng)絡(luò)非区,是訪問不成功的,只有在香港臺灣或者境外才能訪問到類似的外網(wǎng)盹廷。那我們需要通過內(nèi)地網(wǎng)絡(luò)去訪問外網(wǎng)只能通過一個proxy代理去做一個請求的轉(zhuǎn)發(fā)征绸,我們的內(nèi)地網(wǎng)絡(luò)請求在到達(dá)外網(wǎng)地址之前,會經(jīng)過一層代理速和,這個代理會去請求外網(wǎng)歹垫,請求成功之后會把頁面呈現(xiàn)給我們的客戶端。
在這個過程中颠放,外網(wǎng)服務(wù)器不知道我們的內(nèi)地網(wǎng)絡(luò)是誰排惨,只知道代理地址,所以對于外網(wǎng)服務(wù)器來說碰凶,請求的真實客戶端是看不到的暮芭。那么這個過程就叫做 正向代理,proxy代理的是客戶端欲低。
反向代理是相反的辕宏,代理的是服務(wù)端,對于客戶端而言砾莱,訪問的服務(wù)器僅僅是多個真實服務(wù)器的一個代理而已瑞筐,所以對于客戶端用戶而言,真實服務(wù)器的信息是不可見的腊瑟。這樣的過程也就是反向代理聚假,proxy代理的是服務(wù)端块蚌。
Nginx如何去做反向代理?
server{ listen 80; server_name nginx.yinzhuoei.com; location / { proxy_pass http://yinzhuoei.com; }}
其他的proxy配置:
proxy_set_header :在將客戶端請求發(fā)送給后端服務(wù)器之前膘格,更改來自客戶端的請求頭信息峭范。proxy_connect_timeout:配置Nginx與后端代理服務(wù)器嘗試建立連接的超時時間。proxy_read_timeout : 配置Nginx向后端服務(wù)器組發(fā)出read請求后瘪贱,等待相應(yīng)的超時時間纱控。proxy_send_timeout:配置Nginx向后端服務(wù)器組發(fā)出write請求后,等待相應(yīng)的超時時間菜秦。proxy_redirect :用于修改后端服務(wù)器返回的響應(yīng)頭中的Location和Refresh甜害。
解決跨域
通過反向代理解決跨域:
server{ listen 3003; server_name localhost; ## = /表示精確匹配路徑為/的url location = / { proxy_pass http://localhost:5500; } ## 若 proxy_pass最后為/ 如http://localhost:3000/;匹配/no/son,則真實匹配為http://localhost:3000/son location /no { proxy_pass http://localhost:3000; } ## /ok/表示精確匹配以ok開頭的url喷户,/ok2是匹配不到的唾那,/ok/son則可以 location /ok/ { proxy_pass http://localhost:3000; }}
加header頭允許跨域:
server{ listen 3002; server_name localhost; location /ok { proxy_pass http://localhost:3000; # 指定允許跨域的方法,*代表所有 add_header Access-Control-Allow-Methods *; # 預(yù)檢命令的緩存褪尝,如果不緩存每次會發(fā)送兩次請求 add_header Access-Control-Max-Age 3600; # 帶cookie請求需要加上這個字段闹获,并設(shè)置為true add_header Access-Control-Allow-Credentials true; # 表示允許這個域跨域調(diào)用(客戶端發(fā)送請求的域名和端口) # $http_origin動態(tài)獲取請求客戶端請求的域 不用*的原因是帶cookie的請求不支持*號 add_header Access-Control-Allow-Origin $http_origin; # 表示請求頭的字段 動態(tài)獲取 add_header Access-Control-Allow-Headers $http_access_control_request_headers; # OPTIONS預(yù)檢命令,預(yù)檢命令通過時才發(fā)送請求 # 檢查請求的類型是不是預(yù)檢命令 if ($request_method = OPTIONS){ return 200; } }}
Master&Woker模式
Nginx啟動之后河哑,啟動了80端口進(jìn)行服務(wù)監(jiān)聽避诽,那么進(jìn)程中就存在一個Mater主進(jìn)程和多個Woker進(jìn)程;
Master進(jìn)程的作用就是:讀取&驗證nginx.conf配置文件并且管理多個woker進(jìn)程璃谨;接受外部信號沙庐;監(jiān)控Woker,如果Woker掛掉佳吞,將自動重啟Woker拱雏;
Woker進(jìn)程的作用就是:多個Woker會攔截所有的請求并做出處理;每一個woker進(jìn)程維護(hù)一個線程底扳;woker的個數(shù)和CPU有關(guān)铸抑,從nginx.conf配置woker個數(shù),配置幾個就是幾個衷模,但是要避免配置過多鹊汛,要充分利用CPU;
一個請求到響應(yīng)的流程:
- Nginx啟動阱冶,Matster進(jìn)程根據(jù)nginx.conf初始化刁憋;初始化監(jiān)聽socket;fork出多個woker進(jìn)程;
- 發(fā)起請求
- woker進(jìn)程們一起競爭,勝出者通過三次握手,建立socket連接雹嗦,處理請求。
如何做熱部署呢报强?
熱部署就和前端熱部署一樣的性質(zhì)瞒御,即修改配置文件钾腺,不需要重啟服務(wù)器就可以使用最新的配置泥耀。
通過這樣的一個命令即可熱部署,無需重啟蛔添,隨時改隨時用痰催。
一般情況下,我們做熱部署可以有幾個方案迎瞧,比如前端夸溶,webpack的本地開發(fā)工具,webpack-dev-server凶硅,即本地啟動一個服務(wù)缝裁,開啟一個websocket,當(dāng)我們的文件改動足绅,就重新加載這個css/js捷绑。
而nginx也是同樣的方式么?我們的主進(jìn)程master去發(fā)布一個修改請求氢妈,然后woker去訂閱這個消息粹污,實現(xiàn)類似這樣的熱部署?
其實不然首量,nginx使用的是如下的方案壮吩,當(dāng)master監(jiān)聽到配置文件的更改,會創(chuàng)建一批新的woker去執(zhí)行新的請求加缘,老的woker進(jìn)程會在任務(wù)處理完畢之后鸭叙,再由master殺掉進(jìn)程。
如何做到高并發(fā)拣宏?
Nginx采用多進(jìn)程+異步非阻塞方式(IO多路復(fù)用):
關(guān)于異步和同步沈贝,我需要做一些概念上的整理;
同步和異步指的是消息的通信機(jī)制蚀浆,我們做web開發(fā)是最能理解同步異步的區(qū)別的缀程,因為我們天天和接口打交道;
1)所謂同步指的就是發(fā)起一個請求/調(diào)用市俊,在沒有得到結(jié)果之前就不會返回杨凑,一旦得到結(jié)果就立即返回;
2)所謂異步指的就是發(fā)起一個請求/調(diào)用摆昧,調(diào)用者不會主動去care被調(diào)用者撩满,而被調(diào)用者拿到結(jié)果之后會通知調(diào)用者
而阻塞非阻塞指的是程序在等待調(diào)用結(jié)果時的狀態(tài);
1)阻塞調(diào)用指的就是,結(jié)果返回之前當(dāng)前線程被掛起伺帘,調(diào)用線程在返回之后才返回昭躺;那么掛起的這個線程是會被阻塞的;
2)非阻塞調(diào)用指的就是伪嫁,不能立刻得到結(jié)果之前领炫,線程是不會被掛起的,仍然可以做其他事情张咳;那么非阻塞調(diào)用如何知道得到結(jié)果了呢帝洪,需要定時去check的;
關(guān)于阻塞IO和非阻塞IO等我總結(jié)完了再說哈脚猾,還有關(guān)于Nginx的IO多路復(fù)用Epoll模型葱峡,這個是延申知識了,我也需要學(xué)習(xí)整理哈龙助,現(xiàn)在還不清楚這一塊的東西砰奕。
Nginx后續(xù)章節(jié)過段時間發(fā),中間要發(fā)幾篇shadowDom和劍指題解的文章提鸟,大家耐心等待...
學(xué)習(xí)資料如下: