分布式
Nginx
1. 請(qǐng)解釋什么是C10K問題或者知道什么是C10K問題嗎赃磨?
在1999年窘问,Dan Kegel向網(wǎng)絡(luò)服務(wù)器提出了一個(gè)難題
是時(shí)候讓網(wǎng)絡(luò)服務(wù)器去同時(shí)應(yīng)對(duì)10k個(gè)客戶端了。你覺得呢枷踏?畢竟網(wǎng)絡(luò)已經(jīng)變得很普及了步鉴。
通過改善操作系統(tǒng)內(nèi)核和從像Apache那樣的線程服務(wù)器遷移到像Nginx,Node這樣的時(shí)間驅(qū)動(dòng)服務(wù)器艾君,C10K問題已經(jīng)被解決了。現(xiàn)在我們更需要考慮的問題是肄方,如何同時(shí)應(yīng)對(duì)一千萬個(gè)連接冰垄?
參考:
《10K 問題的解決:一個(gè)系統(tǒng)管理員如何管理 2000x 臺(tái)服務(wù)器》
2. Nginx簡介
相對(duì)于大家熟知的ApplicationServe服務(wù)器Tomcat,作為HttpServer的Nginx是一款自由的权她,開源的播演,高性能Http服務(wù)器和反向代理服務(wù)器冀瓦。也是一個(gè)IMAP,POP3写烤,SMTP代理服務(wù)器。Nginx本身就可以類似Tomcat一樣托管網(wǎng)站拾徙,進(jìn)行Http服務(wù)處理洲炊,也可以作為代理服務(wù)器使用。
它不像傳統(tǒng)服務(wù)器那樣使用線程處理請(qǐng)求尼啡,而是采用事件驅(qū)動(dòng)機(jī)制————一種異步事件驅(qū)動(dòng)結(jié)構(gòu)暂衡。
我們在這里可以梳理下服務(wù)器的類型:
- Web服務(wù)器:提供Http的訪問,例如Nginx崖瞭,Apache狂巢,IIS等。雖然Tomcat也能夠?qū)崿F(xiàn)书聚,但并不是TOmcat的主要功能唧领,而且性能也遠(yuǎn)遠(yuǎn)不如專門的web服務(wù)器。
- 應(yīng)用程序服務(wù)器:能夠用于應(yīng)用程序的運(yùn)行雌续。
- 代理服務(wù)器:代理服務(wù)器通常是客戶端訪問的一種行為斩个,在整個(gè)客戶端訪問服務(wù)器的過程中有著重要的作用。
- 反向代理
- 后臺(tái)服務(wù)器
- CDN緩存服務(wù)器:屬于緩存服務(wù)器驯杜,而且是反向代理的應(yīng)用受啥,在網(wǎng)站部署的時(shí)候,是一種解決遠(yuǎn)距離訪問的策略鸽心。
參考:
《Nginx初探》
3. 正向代理和反向代理.
3.1 正向代理
正向代理類似一個(gè)跳板機(jī)滚局,用于代替用于訪問外部資源,再把訪問結(jié)果返回給用戶顽频。
對(duì)于服務(wù)器而言藤肢,只會(huì)接到代理服務(wù)器的Request請(qǐng)求,它并不知道這是真正用戶的請(qǐng)求冲九,也并不知道這是代理的訪問谤草,代理在這里扮演的是客戶端的角色。
對(duì)于客戶端而言莺奸,必須設(shè)置正向代理服務(wù)器丑孩,要知道正向代理服務(wù)器的IP地址和代理程序的端口,對(duì)它而言代理扮演的是服務(wù)器的角色灭贷,它是作用于客戶端的温学。
3.2 反向代理
反向代理與正想代理相反。對(duì)于客戶端而言代理服務(wù)器是原始服務(wù)器甚疟,而且客戶端不需要像正向代理那樣進(jìn)行任何特殊的設(shè)置仗岖√友樱客戶端向反向代理的命名空間(namespace)中的內(nèi)容發(fā)送普通請(qǐng)求,接著反向代理將判斷向何處(原始服務(wù)器)轉(zhuǎn)交請(qǐng)求轧拄,并將獲得的內(nèi)容返回給客戶端揽祥。
客戶是無法感知代理的蹲在的。它對(duì)外都是透明的檩电。它可以保證內(nèi)網(wǎng)的安全拄丰,大型網(wǎng)站通常將反向代理作為公網(wǎng)訪問地址,而Web服務(wù)器則是內(nèi)網(wǎng)俐末。同時(shí)它也能優(yōu)化網(wǎng)站的負(fù)載料按,也就是負(fù)載均衡。
參考:
《正向代理與反向代理【總結(jié)】》
《Nginx初探》
4. Nginx幾種常見的負(fù)載均衡策略
Nginx可以根據(jù)客戶端IP進(jìn)行負(fù)載均衡卓箫。在upstream設(shè)置ip_hash载矿,就可以在C類地址段中的客戶端選擇同一個(gè)后端服務(wù)器,除服此服務(wù)器宕機(jī)烹卒。
Nginx目前支持5中分配方式
- 輪詢(默認(rèn)方式)
每個(gè)請(qǐng)求按照時(shí)間順序注意分配到不同的后端服務(wù)器闷盔,如果后端服務(wù)器宕機(jī),則自動(dòng)剔除甫题。 - 指定權(quán)重
指定輪詢幾率馁筐,weight和訪問比率成正比∽狗牵可以用于后端服務(wù)器性能不一的情況敏沉。 - IP綁定ip_hash
每個(gè)請(qǐng)求按照訪問ip的hash結(jié)果分配,這樣每個(gè)方可固定訪問到一個(gè)后端服務(wù)器炎码,這樣可以解決session問題盟迟。 - fair(第三方)
按照后端服務(wù)器的響應(yīng)時(shí)間來分配請(qǐng)求,響應(yīng)時(shí)間短的優(yōu)先分配潦闲。 - url_hash(第三方)
按照訪問url的hash結(jié)果來分配請(qǐng)求攒菠,使每一個(gè)url定向到同一個(gè)后端服務(wù)器。后端服務(wù)器如果為緩存時(shí)比較有效歉闰。
參考:
《nginx負(fù)載均衡的5種策略(轉(zhuǎn)載)》
5. Nginx服務(wù)器上的Master和Worker進(jìn)程分別是什么
Nginx是采用多進(jìn)程的方式來工作的辖众。當(dāng)然Nginx也是支持多線程的方式的。只是我們主流的方式還是多進(jìn)程的方式和敬,也是Nginx的默認(rèn)方式凹炸。
Nginx啟動(dòng)后,會(huì)有一個(gè)master進(jìn)程和多個(gè)worker進(jìn)程昼弟。
master進(jìn)程用來管理worker進(jìn)程啤它,它接收來自外界的信號(hào),向各worker進(jìn)程發(fā)送信號(hào),監(jiān)控worker進(jìn)程的運(yùn)行狀態(tài)变骡。當(dāng)worker進(jìn)程在異常情況下退出后离赫,會(huì)自動(dòng)重新啟動(dòng)新的worker進(jìn)程。
worker進(jìn)程會(huì)處理基本的網(wǎng)絡(luò)事件塌碌。多個(gè)worker進(jìn)程之間是對(duì)等的渊胸,它們同等競爭來自客戶端的請(qǐng)求,各進(jìn)程之間是獨(dú)立的誊爹。一個(gè)請(qǐng)求只能在一個(gè)worker進(jìn)程中處理蹬刷,而一個(gè)worker進(jìn)程不可能處理其他進(jìn)程的請(qǐng)求。
worker進(jìn)程的個(gè)數(shù)是可以設(shè)置的频丘。一般會(huì)設(shè)置為與機(jī)器CPU核數(shù)一致,這是因?yàn)镹ginx的進(jìn)程模型和處理模型泡态。
參考:
《Nginx初探》
6. 使用“反向代理服務(wù)器”的優(yōu)點(diǎn)是什么?
6.1 負(fù)載均衡
在集群環(huán)境下搂漠,Nginx可以支持負(fù)載均衡,使網(wǎng)站獲得更好的性能和穩(wěn)定性某弦。他有多種負(fù)載均衡策略桐汤,可以根據(jù)具體業(yè)務(wù)環(huán)境和硬件配置進(jìn)行較為靈活的改變,從而實(shí)現(xiàn)分流與負(fù)載均衡靶壮。
6.2 作為一個(gè)屏障來在一定程度上保護(hù)網(wǎng)站的安全