nginx知识问答
1、請解釋一下什么是Nginx?
答:Nginx是一個(gè)web服務(wù)器和反向代理服務(wù)器,用于HTTP、HTTPS、SMTP、POP3和IMAP協(xié)議。
2、請列舉Nginx的一些特性?
答:Nginx服務(wù)器的特性包括:?
? 1)反向代理/L7負(fù)載均衡器?
? 2)嵌入式Perl解釋器?
? 3)動態(tài)二進(jìn)制升級?
? 4)可用于重新編寫URL,具有非常好的PCRE支持
3、nginx和apache的區(qū)別?
? 1)輕量級,同樣起web 服務(wù),比apache 占用更少的內(nèi)存及資源
?2)抗并發(fā),nginx 處理請求是異步非阻塞的,而apache 則是阻塞型的,在高并發(fā)下nginx 能保持低資源低消耗高性能
? 3)高度模塊化的設(shè)計(jì),編寫模塊相對簡單?
? 4)最核心的區(qū)別在于apache是同步多進(jìn)程模型,一個(gè)連接對應(yīng)一個(gè)進(jìn)程;nginx是異步的,多個(gè)連接(萬級別)可以對應(yīng)一個(gè)進(jìn)程
4.nginx是如何實(shí)現(xiàn)高并發(fā)的
答:一個(gè)主進(jìn)程,多個(gè)工作進(jìn)程,每個(gè)工作進(jìn)程可以處理多個(gè)請求,每進(jìn)來一個(gè)request,會有一個(gè)worker進(jìn)程去處理。但不是全程的處理,處理到可能發(fā)生阻塞的地方,比如向上游(后端)服務(wù)器轉(zhuǎn)發(fā)request,并等待請求返回。那么,這個(gè)處理的worker繼續(xù)處理其他請求,而一旦上游服務(wù)器返回了,就會觸發(fā)這個(gè)事件,worker才會來接手,這個(gè)request才會接著往下走。由于web server的工作性質(zhì)決定了每個(gè)request的大部份生命都是在網(wǎng)絡(luò)傳輸中,實(shí)際上花費(fèi)在server機(jī)器上的時(shí)間片不多。這是幾個(gè)進(jìn)程就解決高并發(fā)的秘密所在。即@skoo所說的webserver剛好屬于網(wǎng)絡(luò)io密集型應(yīng)用,不算是計(jì)算密集型。
5、請解釋Nginx如何處理HTTP請求。
答:Nginx使用反應(yīng)器模式。主事件循環(huán)等待操作系統(tǒng)發(fā)出準(zhǔn)備事件的信號,這樣數(shù)據(jù)就可以從套接字讀取,在該實(shí)例中讀取到緩沖區(qū)并進(jìn)行處理。單個(gè)線程可以提供數(shù)萬個(gè)并發(fā)連接。
6、在Nginx中,如何使用未定義的服務(wù)器名稱來阻止處理請求?
答:只需將請求刪除的服務(wù)器就可以定義為:?
Server {
???? listen 80; server_name “ “ ;
????return 444;
}
這里,服務(wù)器名被保留為一個(gè)空字符串,它將在沒有“主機(jī)”頭字段的情況下匹配請求,而一個(gè)特殊的Nginx的非標(biāo)準(zhǔn)代碼444被返回,從而終止連接。
7、 使用“反向代理服務(wù)器”的優(yōu)點(diǎn)是什么?
答:反向代理服務(wù)器可以隱藏源服務(wù)器的存在和特征。它充當(dāng)互聯(lián)網(wǎng)云和web服務(wù)器之間的中間層。這對于安全方面來說是很好的,特別是當(dāng)您使用web托管服務(wù)時(shí)。
8、請列舉Nginx服務(wù)器的最佳用途。
答:Nginx服務(wù)器的最佳用法是在網(wǎng)絡(luò)上部署動態(tài)HTTP內(nèi)容,使用SCGI、WSGI應(yīng)用程序服務(wù)器、用于腳本的FastCGI處理程序。它還可以作為負(fù)載均衡器。
9、請解釋Nginx服務(wù)器上的Master和Worker進(jìn)程分別是什么?
答:?
? Master進(jìn)程:讀取及評估配置和維持?
? Worker進(jìn)程:處理請求
10、請解釋你如何通過不同于80的端口開啟Nginx?
答:為了通過一個(gè)不同的端口開啟Nginx,你必須進(jìn)入/etc/Nginx/sites-enabled/,如果這是默認(rèn)文件,那么你必須打開名為“default”的文件。編輯文件,并放置在你想要的端口:
Like server {
listen 81;
}
11、請解釋是否有可能將Nginx的錯(cuò)誤替換為502錯(cuò)誤、503?
答: 502 =錯(cuò)誤網(wǎng)關(guān) 503 =服務(wù)器超載 有可能,但是您可以確保fastcgi_intercept_errors被設(shè)置為ON,并使用錯(cuò)誤頁面指令。?
Location / { fastcgi_pass 127.0.01:9001; fastcgi_intercept_errors on; error_page 502 =503/error_page.html; #… }
12、在Nginx中,解釋如何在URL中保留雙斜線?
答:要在URL中保留雙斜線,就必須使用merge_slashes_off;?
? 語法:merge_slashes [on/off]?
? 默認(rèn)值: merge_slashes on?
? 環(huán)境: http,server
13、請解釋ngx_http_upstream_module的作用是什么?
答:ngx_http_upstream_module用于定義可通過fastcgi傳遞、proxy傳遞、uwsgi傳遞、memcached傳遞和scgi傳遞指令來引用的服務(wù)器組。
14、請解釋什么是C10K問題?
答:C10K問題是指無法同時(shí)處理大量客戶端(10,000)的網(wǎng)絡(luò)套接字。
15、請陳述stub_status和sub_filter指令的作用是什么?
答:?1)Stub_status指令:該指令用于了解Nginx當(dāng)前狀態(tài)的當(dāng)前狀態(tài),如當(dāng)前的活動連接,接受和處理當(dāng)前讀/寫/等待連接的總數(shù)? ?2)Sub_filter指令:它用于搜索和替換響應(yīng)中的內(nèi)容,并快速修復(fù)陳舊的數(shù)據(jù)
16、解釋Nginx是否支持將請求壓縮到上游?
答:您可以使用Nginx模塊gunzip將請求壓縮到上游。gunzip模塊是一個(gè)過濾器,它可以對不支持“gzip”編碼方法的客戶機(jī)或服務(wù)器使用“內(nèi)容編碼:gzip”來解壓縮響應(yīng)。
17、解釋如何在Nginx中獲得當(dāng)前的時(shí)間?
答:要獲得Nginx的當(dāng)前時(shí)間,必須使用SSI模塊、$date_gmt和$date_local的變量。Proxy_set_header THE-TIME $date_gmt;
18、用Nginx服務(wù)器解釋-s的目的是什么?
答:用于運(yùn)行Nginx -s參數(shù)的可執(zhí)行文件。
19、解釋如何在Nginx服務(wù)器上添加模塊?
答:在編譯過程中,必須選擇Nginx模塊,因?yàn)镹ginx不支持模塊的運(yùn)行時(shí)間選擇。
20、?nginx負(fù)載均衡的算法怎么實(shí)現(xiàn)的
(1)nginx 的 upstream目前支持 4 種方式的分配?
1)、輪詢(默認(rèn))?
????? 每個(gè)請求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動剔除。?
2)、weight?
????? 指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況。?
3)、ip_hash?
????? 每個(gè)請求按訪問ip的hash結(jié)果分配,這樣每個(gè)訪客固定訪問一個(gè)后端服務(wù)器,可以解決session的問題。??
? ? 4)、fair(第三方)?
????? 按后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配。??
5)、url_hash(第三方)
? ? (2)nginx內(nèi)置策略包含加權(quán)輪詢和ip hash
加權(quán)輪詢算法分為先深搜索和先廣搜索,那么nginx采用的是先深搜索算法,即將首先將請求都分給高權(quán)重的機(jī)器,直到該機(jī)器的權(quán)值降到了比其他機(jī)器低,才開始將請求分給下一個(gè)高權(quán)重的機(jī)器;
21、Nginx是如何處理一個(gè)請求的呢?
?? ?首先,nginx在啟動時(shí),會解析配置文件,得到需要監(jiān)聽的端口與ip地址,然后在nginx的master進(jìn)程里面
?? ?先初始化好這個(gè)監(jiān)控的socket,再進(jìn)行l(wèi)isten
?? ?然后再fork出多個(gè)子進(jìn)程出來, ?子進(jìn)程會競爭accept新的連接。
? ? 此時(shí),客戶端就可以向nginx發(fā)起連接了。當(dāng)客戶端與nginx進(jìn)行三次握手,與nginx建立好一個(gè)連接后
?? ?此時(shí),某一個(gè)子進(jìn)程會accept成功,然后創(chuàng)建nginx對連接的封裝,即ngx_connection_t結(jié)構(gòu)體
?? ?接著,根據(jù)事件調(diào)用相應(yīng)的事件處理模塊,如http模塊與客戶端進(jìn)行數(shù)據(jù)的交換。
? ? 最后,nginx或客戶端來主動關(guān)掉連接,到此,一個(gè)連接就壽終正寢了
22、nginx為什么不使用多線程?
Apache: 創(chuàng)建多個(gè)進(jìn)程或線程,而每個(gè)進(jìn)程或線程都會為其分配cpu和內(nèi)存(線程要比進(jìn)程小的多,所以worker支持比perfork高的并發(fā)),并發(fā)過大會榨干服務(wù)器資源。
Nginx: 采用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進(jìn)程的工作進(jìn)程的數(shù)量)(epoll),不會為每個(gè)請求分配cpu和內(nèi)存資源,節(jié)省了大量資源,同時(shí)也減少了大量的CPU的上下文切換。所以才使得Nginx支持更高的并發(fā)
23、如何解決驚群現(xiàn)象?
驚群是多個(gè)子進(jìn)程在同一時(shí)刻監(jiān)聽同一個(gè)端口引起的;
Nginx解決方法:同一個(gè)時(shí)刻只能有唯一一個(gè)worker子進(jìn)程監(jiān)聽web端口,此時(shí)新連接事件只能喚醒唯一正在監(jiān)聽端口的worker子進(jìn)程。
采用鎖,互斥量實(shí)現(xiàn)!!
轉(zhuǎn)載于:https://www.cnblogs.com/ivy-zheng/p/10992144.html
總結(jié)
- 上一篇: selenium3 + python -
- 下一篇: 开博语