1.為什么要用Nginx?
跨平臺(tái)、配置簡(jiǎn)單、方向代理、高并發(fā)連接:處理2-3萬(wàn)并發(fā)連接數(shù),官方監(jiān)測(cè)能支持5萬(wàn)并發(fā),內(nèi)存消耗?。洪_啟10個(gè)nginx才占150M內(nèi)存 ,nginx處理靜態(tài)文件好,耗費(fèi)內(nèi)存少,
而且Nginx內(nèi)置的健康檢查功能:如果有一個(gè)服務(wù)器宕機(jī),會(huì)做一個(gè)健康檢查,再發(fā)送的請(qǐng)求就不會(huì)發(fā)送到宕機(jī)的服務(wù)器了。重新將請(qǐng)求提交到其他的節(jié)點(diǎn)上。
2.為什么Nginx性能這么高?
nginx之所以可以實(shí)現(xiàn)高并發(fā),與它采用的epoll模型有很大的關(guān)系。epoll模型采用異步非阻塞的事件處理機(jī)制。這種機(jī)制可讓nginx進(jìn)程同時(shí)監(jiān)控多個(gè)事件。
它是采用一個(gè)master進(jìn)程和多個(gè)worker進(jìn)程的工作模式。
1、master進(jìn)程主要負(fù)責(zé)收集、分發(fā)請(qǐng)求。當(dāng)一個(gè)請(qǐng)求過(guò)來(lái)時(shí),master拉起一個(gè)worker進(jìn)程負(fù)責(zé)處理這個(gè)請(qǐng)求。;
2、master進(jìn)程也要負(fù)責(zé)監(jiān)控worker的狀態(tài),保證高可靠性;
3、worker進(jìn)程議案設(shè)置為和CPU核心數(shù)一致或者其二倍。nginx的worker進(jìn)程和Apache的不一樣。apache的進(jìn)程在同一時(shí)間只能處理一個(gè)請(qǐng)求,所以它會(huì)開啟很多個(gè)進(jìn)程,幾百甚至幾千個(gè)。而nginx的worker進(jìn)程在同一時(shí)間可以處理的請(qǐng)求數(shù)只受內(nèi)存限制,因此可以處理更多請(qǐng)求。
3.Nginx怎么處理請(qǐng)求的?
nginx接收一個(gè)請(qǐng)求后,首先由listen和server_name指令匹配server模塊,再匹配server模塊里的location,location就是實(shí)際地址
4.location的作用是什么?
location指令的作用是根據(jù)用戶請(qǐng)求的URI來(lái)執(zhí)行不同的應(yīng)用,也就是根據(jù)用戶請(qǐng)求的網(wǎng)站URL進(jìn)行匹配,匹配成功即進(jìn)行相關(guān)的操作。
5.Nginx的負(fù)載均衡算法都有哪些
nginx 的 upstream目前支持 4 種方式的分配
sticky:通過(guò)nginx-sticky模塊,來(lái)實(shí)現(xiàn)cookie黏貼的方式將來(lái)自同一個(gè)客戶端的請(qǐng)求發(fā)送到同一個(gè)后端服務(wù)器上處理,這樣一定程度上可以解決多個(gè)后端服務(wù)器的session會(huì)話同步的問(wèn)題;
round-robin(RR):輪詢,每個(gè)請(qǐng)求按時(shí)間順序依次分配到不同的后端服務(wù)器,如果后端某臺(tái)服務(wù)器死機(jī),自動(dòng)剔除故障系統(tǒng),使用戶訪問(wèn)不受影響;
weight:輪詢權(quán)重,weight的值越大分配到的訪問(wèn)概率就越高,主要用于后端每臺(tái)服務(wù)器性能不均衡的情況下,或者僅僅為在主從的情況下設(shè)置不同的權(quán)重,達(dá)到合理有效的利用主機(jī)資源。
least_conn:請(qǐng)求被發(fā)送到當(dāng)前活躍連接最少的realserver上,會(huì)考慮到weight的值;
ip_hash:每個(gè)請(qǐng)求按照IP的哈希結(jié)果分配,使來(lái)自同一個(gè)IP的訪客固定訪問(wèn)后端服務(wù)器,可以有效的解決動(dòng)態(tài)網(wǎng)頁(yè)存在的session共享問(wèn)題。
fair:比weight、ip_hash更加智能的負(fù)載均衡算法,fair算法可以根據(jù)頁(yè)面的大小和加載時(shí)間長(zhǎng)短智能地進(jìn)行負(fù)載均衡,也就是根據(jù)后端服務(wù)器的響應(yīng)時(shí)間來(lái)分配請(qǐng)求,相應(yīng)時(shí)間短的優(yōu)先分配。nginx本身不支持fair,如果需要使用這種調(diào)度算法,則必須安裝upstream_fair模塊。
url_hash:按訪問(wèn)的URL的哈希結(jié)果來(lái)分配請(qǐng)求,使每個(gè)URL定向到后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。同樣,nginx本身不支持url_hash,如果需要這種調(diào)度算法,則必須安裝nginx的hash軟件包。
6.靜態(tài)http服務(wù)器配置

7.反向代理配置
客戶端本來(lái)可以直接通過(guò)HTTP協(xié)議訪問(wèn)某網(wǎng)站應(yīng)用服務(wù)器,網(wǎng)站管理員可以在中間加上一個(gè)Nginx,客戶端請(qǐng)求Nginx,Nginx請(qǐng)求應(yīng)用服務(wù)器,然后將結(jié)果返回給客戶端,此時(shí)Nginx就是反向代理服務(wù)器。

8.負(fù)載均衡配置

9.FastCGI,Nginx本身不支持PHP等語(yǔ)言,但是它可以通過(guò)FastCGI來(lái)將請(qǐng)求扔給某些語(yǔ)言或框架處理(php,python等)。配置類似proxy_pass

10.

11.為了避免服務(wù)器崩潰,大家會(huì)通過(guò)負(fù)載均衡的方式來(lái)分擔(dān)服務(wù)器壓力。將對(duì)臺(tái)服務(wù)器組成一個(gè)集群,當(dāng)用戶訪問(wèn)時(shí),先訪問(wèn)到一個(gè)轉(zhuǎn)發(fā)服務(wù)器,再由轉(zhuǎn)發(fā)服務(wù)器將訪問(wèn)分發(fā)到壓力更小的服務(wù)器。
Nginx負(fù)載均衡實(shí)現(xiàn)的策略有以下五種:
(1) 輪詢(默認(rèn))
每個(gè)請(qǐng)求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端某個(gè)服務(wù)器宕機(jī),能自動(dòng)剔除故障系統(tǒng)。
upstream backserver {
server 192.168.0.12;
server 192.168.0.13;
}
(2) 權(quán)重 weight
weight的值越大分配到的訪問(wèn)概率越高,主要用于后端每臺(tái)服務(wù)器性能不均衡的情況下。其次是為在主從的情況下設(shè)置不同的權(quán)值,達(dá)到合理有效的地利用主機(jī)資源。
upstream backserver {
server 192.168.0.12 weight=2;
server 192.168.0.13 weight=8;
},權(quán)重越高,在被訪問(wèn)的概率越大,如上例,分別是20%,80%。
(3) ip_hash( IP綁定)
每個(gè)請(qǐng)求按訪問(wèn)IP的哈希結(jié)果分配,使來(lái)自同一個(gè)IP的訪客固定訪問(wèn)一臺(tái)后端服務(wù)器,并且可以有效解決動(dòng)態(tài)網(wǎng)頁(yè)存在的session共享問(wèn)題
upstream backserver {
ip_hash;
server 192.168.0.12:88;
server 192.168.0.13:80;
}
(4) fair(第三方插件)
必須安裝upstream_fair模塊。對(duì)比 weight、ip_hash更加智能的負(fù)載均衡算法,fair算法可以根據(jù)頁(yè)面大小和加載時(shí)間長(zhǎng)短智能地進(jìn)行負(fù)載均衡,響應(yīng)時(shí)間短的優(yōu)先分配。
upstream backserver {
server server1;
server server2;
fair;
}
哪個(gè)服務(wù)器的響應(yīng)速度快,就將請(qǐng)求分配到那個(gè)服務(wù)器上。
(5) url_hash(第三方插件)
必須安裝Nginx的hash軟件包
按訪問(wèn)url的hash結(jié)果來(lái)分配請(qǐng)求,使每個(gè)url定向到同一個(gè)后端服務(wù)器,可以進(jìn)一步提高后端緩存服務(wù)器的效率。
upstream backserver {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
12.限流怎么做的,算法是什么,(限制請(qǐng)求速度)
Nginx限流就是限制用戶請(qǐng)求速度,防止服務(wù)器受不了
限流有3種
正常限制訪問(wèn)頻率(正常流量)
突發(fā)限制訪問(wèn)頻率(突發(fā)流量)
限制并發(fā)連接數(shù)
Nginx的限流都是基于漏桶流算法,底下會(huì)說(shuō)道什么是桶銅流
實(shí)現(xiàn)三種限流算法
限制一個(gè)用戶發(fā)送的請(qǐng)求,我Nginx多久接收一個(gè)請(qǐng)求。
Nginx中使用ngx_http_limit_req_module模塊來(lái)限制的訪問(wèn)頻率,限制的原理實(shí)質(zhì)是基于漏桶算法原理來(lái)實(shí)現(xiàn)的。在nginx.conf配置文件中可以使用limit_req_zone命令及l(fā)imit_req命令限制單個(gè)IP的請(qǐng)求處理頻率。

2.突發(fā)限制訪問(wèn)頻率(突發(fā)流量):
限制一個(gè)用戶發(fā)送的請(qǐng)求,我Nginx多久接收一個(gè)。
上面的配置一定程度可以限制訪問(wèn)頻率,但是也存在著一個(gè)問(wèn)題:如果突發(fā)流量超出請(qǐng)求被拒絕處理,無(wú)法處理活動(dòng)時(shí)候的突發(fā)流量,這時(shí)候應(yīng)該如何進(jìn)一步處理呢?Nginx提供burst參數(shù)結(jié)合nodelay參數(shù)可以解決流量突發(fā)的問(wèn)題,可以設(shè)置能處理的超過(guò)設(shè)置的請(qǐng)求數(shù)外能額外處理的請(qǐng)求數(shù)。我們可以將之前的例子添加burst參數(shù)以及nodelay參數(shù):

13.location指令的作用是根據(jù)用戶請(qǐng)求的URI來(lái)執(zhí)行不同的應(yīng)用,也就是根據(jù)用戶請(qǐng)求的網(wǎng)站URL進(jìn)行匹配,匹配成功即進(jìn)行相關(guān)的操作。

14.為什么要做動(dòng)靜分離?
Nginx是當(dāng)下最熱的Web容器,網(wǎng)站優(yōu)化的重要點(diǎn)在于靜態(tài)化網(wǎng)站,網(wǎng)站靜態(tài)化的關(guān)鍵點(diǎn)則是是動(dòng)靜分離,動(dòng)靜分離是讓動(dòng)態(tài)網(wǎng)站里的動(dòng)態(tài)網(wǎng)頁(yè)根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來(lái),動(dòng)靜資源做好了拆分以后,我們則根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作。
讓靜態(tài)的資源只走靜態(tài)資源服務(wù)器,動(dòng)態(tài)的走動(dòng)態(tài)的服務(wù)器
Nginx的靜態(tài)處理能力很強(qiáng),但是動(dòng)態(tài)處理能力不足,因此,在企業(yè)中常用動(dòng)靜分離技術(shù)。
對(duì)于靜態(tài)資源比如圖片,js,css等文件,我們則在反向代理服務(wù)器nginx中進(jìn)行緩存。這樣瀏覽器在請(qǐng)求一個(gè)靜態(tài)資源時(shí),代理服務(wù)器nginx就可以直接處理,無(wú)需將請(qǐng)求轉(zhuǎn)發(fā)給后端服務(wù)器tomcat。
若用戶請(qǐng)求的動(dòng)態(tài)文件,比如servlet,jsp則轉(zhuǎn)發(fā)給Tomcat服務(wù)器處理,從而實(shí)現(xiàn)動(dòng)靜分離。這也是反向代理服務(wù)器的一個(gè)重要的作用
15.nginx和apache的區(qū)別,輕量級(jí),同樣起web 服務(wù),比apache 占用更少的內(nèi)存及資源
抗并發(fā),nginx 處理請(qǐng)求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能
高度模塊化的設(shè)計(jì),編寫模塊相對(duì)簡(jiǎn)單最核心的區(qū)別在于apache是同步多進(jìn)程模型,一個(gè)連接對(duì)應(yīng)一個(gè)進(jìn)程;nginx是異步的,多個(gè)連接(萬(wàn)級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程
16.nginx和Apache的區(qū)別?
兩者最核心的區(qū)別在于apache是同步多進(jìn)程模型,一個(gè)request對(duì)應(yīng)一個(gè)進(jìn)程,而nginx是異步的,多個(gè)連接(萬(wàn)級(jí)別)可以對(duì)應(yīng)一個(gè)進(jìn)程。
一般來(lái)說(shuō),需要性能的web服務(wù),用nginx,如果不需要性能只求穩(wěn)定,更考慮Apache,后者的各種模塊實(shí)現(xiàn)的比前者好很多,epoll網(wǎng)絡(luò)IO模型是nginx處理性能高的根本,但并不是所有情況下epoll大獲全勝的,如果本身提供靜態(tài)服務(wù)的只有幾個(gè)文件,apache的select模型或許比epoll更高性能。當(dāng)然,這只是一個(gè)假設(shè),真正還需要實(shí)測(cè)了再說(shuō)。更通用的方案是,前端nginx抗并發(fā),后端apache集群,配合起來(lái)會(huì)更好
17.nginx負(fù)載均衡調(diào)度狀態(tài)
在nginx upstream模塊中,可以設(shè)定每臺(tái)后端服務(wù)器在負(fù)載均衡調(diào)度中的狀態(tài)。
常用的狀態(tài)有:
down:表示當(dāng)前的server暫時(shí)不參與負(fù)載均衡;
backup:預(yù)留的備份機(jī)器。當(dāng)其他所有的非backup機(jī)器出現(xiàn)故障或者繁忙的時(shí)候,才會(huì)請(qǐng)求backup機(jī)器,因此這臺(tái)機(jī)器的訪問(wèn)壓力最低;
max_fails:允許請(qǐng)求失敗的次數(shù),默認(rèn)為1,當(dāng)超過(guò)最大次數(shù)時(shí),返回proxy_next_upstraem模塊定義的錯(cuò)誤;
fail_timeout:請(qǐng)求失敗超時(shí)時(shí)間,在經(jīng)歷了max_fails次失敗后,暫停服務(wù)的時(shí)間。max_fails和fail_timeout可以一起使用。
18.設(shè)置 nginx GZIP
編輯nginx配置文件 nginx.conf 找到如下代碼并更改如下:
看了下nginx的官方文檔,其中nginx如何處理一個(gè)請(qǐng)求講解的很好,現(xiàn)在貼出來(lái)分享下。Nginx首先選定由哪一個(gè)虛擬主機(jī)來(lái)處理請(qǐng)求。讓我們從一個(gè)簡(jiǎn)單的配置(其中全部3個(gè)虛擬主機(jī)都在端口*:80上監(jiān)聽)開始:

在這個(gè)配置中,nginx僅僅檢查請(qǐng)求的“Host”頭以決定該請(qǐng)求應(yīng)由哪個(gè)虛擬主機(jī)來(lái)處理。如果Host頭沒(méi)有匹配任意一個(gè)虛擬主機(jī),或者請(qǐng)求中根本沒(méi)有包含Host頭,那nginx會(huì)將請(qǐng)求分發(fā)到定義在此端口上的默認(rèn)虛擬主機(jī)。在以上配置中,第一個(gè)被列出的虛擬主機(jī)即nginx的默認(rèn)虛擬主機(jī)——這是nginx的默認(rèn)行為。而且,可以顯式地設(shè)置某個(gè)主機(jī)為默認(rèn)虛擬主機(jī),即在"listen"指令中設(shè)置"default_server"參數(shù):

下面讓我們來(lái)看一個(gè)復(fù)雜點(diǎn)的配置,在這個(gè)配置里,有幾個(gè)虛擬主機(jī)在不同的地址上監(jiān)聽:
這個(gè)配置中,nginx首先測(cè)試請(qǐng)求的IP地址和端口是否匹配某個(gè)server配置塊中的listen指令配置。接著nginx繼續(xù)測(cè)試請(qǐng)求的Host頭是否匹配這個(gè)server塊中的某個(gè)server_name的值。如果主機(jī)名沒(méi)有找到,nginx將把這個(gè)請(qǐng)求交給默認(rèn)虛擬主機(jī)處理。例如,一個(gè)從192.168.1.1:80端口收到的訪問(wèn)www.example.com的請(qǐng)求將被監(jiān)聽192.168.1.1:80端口的默認(rèn)虛擬主機(jī)處理,本例中就是第一個(gè)服務(wù)器,因?yàn)檫@個(gè)端口上沒(méi)有定義名為www.example.com的虛擬主機(jī)。
