Nginx面试题总结大全
生活随笔
收集整理的這篇文章主要介紹了
Nginx面试题总结大全
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Nginx 的整體架構(gòu)
1、什么是Nginx?
- Nginx 是一個高性能HTTP和反向代理服務(wù)器,也是一個 IMAP/POP3/SMTP 代理服務(wù)器。
- Nginx 其特點(diǎn)是占有內(nèi)存少,并發(fā)能力強(qiáng),能夠支持50000個并發(fā)連接響應(yīng)(多路復(fù)用:epoll and kqueue).它處理請求時(shí)異步非阻塞,在高并發(fā)下保持低資源低消耗高性能。
2、請列舉Nginx的一些特性
- 響應(yīng)請求快,配置簡單
- 高擴(kuò)展性,跨平臺:它完全是由多個不同功能、不同層次、不同類型且耦合度極低的模塊組成。因此,當(dāng)對某一個模塊修復(fù)Bug或進(jìn)行升級時(shí),可以專注于模塊自身。
- 高可靠性:用于反向代理,宕機(jī)的概率微乎其微
- 單機(jī)支持10萬以上的并發(fā)連接
- 熱部署:master管理進(jìn)程與worker工作進(jìn)程的分離設(shè)計(jì),使得Nginx能夠提供熱部署功能,即可以在7×24小時(shí)不間斷服務(wù)的前提下,升級Nginx的可執(zhí)行文件。當(dāng)然,它也支持不停止服務(wù)就更新配置項(xiàng)、更換日志文件等功能。
- 最自由的BSD許可協(xié)議:BSD許可協(xié)議不只是允許用戶免費(fèi)使用Nginx,它還允許用戶在自己的項(xiàng)目中直接使用或修改Nginx源碼,然后發(fā)布。
- 內(nèi)存消耗小,成本低廉、節(jié)省帶寬、穩(wěn)定性高等特點(diǎn)。
3、請列舉Nginx和Apache 之間的不同點(diǎn)
- 輕量級:同樣運(yùn)行web服務(wù),比apache占用更少的內(nèi)存及資源;
- 高并發(fā):nginx處理請求時(shí)異步非阻塞的,而apache是阻塞型的;
- 高度模塊化的設(shè)計(jì),編寫模塊相對簡單;
- 核心區(qū)別:apache是同步多進(jìn)程模型,一個連接對應(yīng)一個進(jìn)程;nginx是異步的,多個連接可以對應(yīng)一個進(jìn)程;
4、Nginx如何處理HTTP請求?
- Nginx使用反應(yīng)器模式。主事件循環(huán)等待操作系統(tǒng)發(fā)出準(zhǔn)備事件的信號,這樣數(shù)據(jù)就可以從套接字讀取,在該實(shí)例中讀取到緩沖區(qū)并進(jìn)行處理。
- 首先,nginx在啟動時(shí),會解析配置文件,得到需要監(jiān)聽的端口與ip地址,在nginx的master進(jìn)程里面初始化監(jiān)控的socket,在進(jìn)行l(wèi)isten,然后在fork多個子進(jìn)程出來,子進(jìn)程會競爭accept新的連接。
- 此時(shí)客戶端就可以向nginx發(fā)起連接,三次握手建立連接,然后創(chuàng)建nginx對連接的封裝(ngx_connection_t結(jié)構(gòu)體),接著根據(jù)事件調(diào)用相應(yīng)的事件處理模塊,處理完后,nginx或客戶端主動關(guān)閉連接。
5、nginx是如何實(shí)現(xiàn)高并發(fā)的?
-
多進(jìn)程機(jī)制
- 服務(wù)器每當(dāng)收到一個客戶端請求時(shí),就有服務(wù)器主進(jìn)程生成一個子進(jìn)程出來和客戶端建立連接并進(jìn)行交互,直到連接斷開,該子進(jìn)程就結(jié)束了。
- 優(yōu)勢:各個進(jìn)程之間相互獨(dú)立,不需要加鎖,減少了使用鎖對性能造成的影響,降低了編程的復(fù)雜度,降低開發(fā)成本;采用獨(dú)立的進(jìn)程,進(jìn)程之間不互相影響,如果一個進(jìn)程發(fā)出異常退出時(shí)沒其他進(jìn)程正常工作,master進(jìn)程則很快啟動新的worker進(jìn)程,確保服務(wù)不會中斷,從而降低風(fēng)險(xiǎn)。
- 缺點(diǎn):生成一個子進(jìn)程需要進(jìn)行內(nèi)存復(fù)制等操作,在資源和時(shí)間上會產(chǎn)生一定的開銷。當(dāng)有大量請求時(shí),會導(dǎo)致系統(tǒng)性能下降。
-
事件驅(qū)動模型:異步非阻塞機(jī)制
- 每個工作進(jìn)程使用異步非阻塞方式,可以處理多個客戶端請求;
- 當(dāng)某個工作進(jìn)程接受到客戶端請求后,調(diào)用IO進(jìn)行處理,如果不能立即得到結(jié)果,就會處理其他請求(非阻塞);客戶端在此期間也無需等待響應(yīng),就可以去處理其他事情(異步);
- 當(dāng)IO返回時(shí),就會通知此工作進(jìn)程;該進(jìn)程得到通知暫時(shí)掛起當(dāng)前事務(wù)去響應(yīng)客戶端請求。
- 采用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進(jìn)程的工作進(jìn)程的數(shù)量)(epoll),不會為每個請求分配cpu和內(nèi)存資源,節(jié)省了大量資源,同時(shí)也減少了大量的CPU的上下文切換。
-
內(nèi)存池:為了避免出現(xiàn)內(nèi)存碎片,減少向操作系統(tǒng)申請內(nèi)存的次數(shù),降低各個模塊的開發(fā)復(fù)雜度,Nginx設(shè)計(jì)了簡單的內(nèi)存池。它的作用主要是把多次向系統(tǒng)申請內(nèi)存的操作整合成一次,大大減少了CPU的消耗。
6、在Nginx中,如何使用未定義的服務(wù)器名稱來阻止處理請求?
```Server{listen 80;server_name "";return 444;} ```- 這里服務(wù)器名被保留為一個空字符串,它將在沒有“主機(jī)”頭字段的情況下匹配請求,而一個特殊的Nginx的非標(biāo)準(zhǔn)代碼444被返回,從而終止連接。
7、使用“反向代理服務(wù)器”的優(yōu)點(diǎn)是什么?
- 反向代理服務(wù)器可以隱藏源服務(wù)器的存在和特征。它充當(dāng)互聯(lián)網(wǎng)云和web服務(wù)器之間的中間層。提高了安全性,特別是使用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)程:主要負(fù)責(zé)調(diào)度工作進(jìn)程:加載配置、啟動工作進(jìn)程及非停升級。master進(jìn)程主要用來管理worker進(jìn)程,具體包括如下4個主要功能:
- 接收來自外界的信號。
- 向各worker進(jìn)程發(fā)送信號。
- 監(jiān)控woker進(jìn)程的運(yùn)行狀態(tài)。
- 當(dāng)woker進(jìn)程退出后(異常情況下),會自動重新啟動新的woker進(jìn)程。
- Worker進(jìn)程:負(fù)責(zé)處理網(wǎng)絡(luò)請求與響應(yīng)。
- 多個worker進(jìn)程之間是對等且相互獨(dú)立的,他們同等競爭來自客戶端的請求。
- 一個請求,只可能在一個worker進(jìn)程中處理,一個worker進(jìn)程,不可能處理其它進(jìn)程的請求。
- worker進(jìn)程的個數(shù)是可以設(shè)置的,一般我們會設(shè)置與機(jī)器cpu核數(shù)一致。同時(shí),nginx為了更好的利用多核特性,具有cpu綁定選項(xiàng),我們可以將某一個進(jìn)程綁定在某一個核上,這樣就不會因?yàn)檫M(jìn)程的切換帶來cache的失效。
10、請解釋代理設(shè)計(jì)中的正向代理和反向代理?
- 代理服務(wù)器一般指局域網(wǎng)內(nèi)部的機(jī)器通過代理服務(wù)器發(fā)送請求到互聯(lián)網(wǎng)上的服務(wù)器,代理服務(wù)器一般作用在客戶端(翻墻)。通過正向代理的方式,在我們的客戶端運(yùn)行一個軟件,將我們的HTTP請求轉(zhuǎn)發(fā)到其他不同的服務(wù)器端,實(shí)現(xiàn)請求的分發(fā)。
- 反向代理服務(wù)器作用在服務(wù)器端,它在服務(wù)器端接收客戶端的請求,然后將請求分發(fā)給具體的服務(wù)器進(jìn)行處理,然后再將服務(wù)器的相應(yīng)結(jié)果反饋給客戶端。
11、請解釋是否有可能將Nginx的錯誤替換為502錯誤、503?
- 502 =錯誤網(wǎng)關(guān) 503=服務(wù)器超載
- 有可能,但是您可以確保fastcgi_intercept_errors被設(shè)置為ON,并使用錯誤頁面指令。
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-046sOPU8-1595407464359)(en-resource://database/1265:1)]
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指令的作用是什么?
- Stub_status指令:該指令用于了解Nginx當(dāng)前狀態(tài),如當(dāng)前的活動連接,接受和處理當(dāng)前讀/寫/等待連接的總數(shù);
- Sub_filter指令:它用于搜索和替換響應(yīng)中的內(nèi)容,并快速修復(fù)陳舊的數(shù)據(jù);
16、解釋Nginx是否支持將請求壓縮到上游?
- 您可以使用Nginx模塊gunzip將請求壓縮到上游。gunzip模塊是一個過濾器,它可以對不支持“gzip”編碼方法的客戶機(jī)或服務(wù)器使用“內(nèi)容編碼:gzip”來解壓縮響應(yīng)。
- 上游服務(wù)器指的產(chǎn)生內(nèi)容的服務(wù)器。如nginx+tomcat tomcat是上游服務(wù)器。在nginx中有配置upstream,就是配置上游服務(wù)器集群,如應(yīng)用服務(wù)器tomcat
17、為什么要做動、靜分離?
- 動態(tài)資源、靜態(tài)資源分離是讓動態(tài)網(wǎng)站里的動態(tài)網(wǎng)頁根據(jù)一定規(guī)則把不變的資源和經(jīng)常變的資源區(qū)分開來,動靜資源做好了拆分以后,我們就可以根據(jù)靜態(tài)資源的特點(diǎn)將其做緩存操作,這就是網(wǎng)站靜態(tài)化處理的核心思路。
- 原因:動、靜分離將網(wǎng)站靜態(tài)資源(HTML,JavaScript,CSS,img等文件)與后臺應(yīng)用分開部署,提高用戶訪問靜態(tài)代碼的速度,降低對后臺應(yīng)用訪問。一般將靜態(tài)資源放到nginx中,動態(tài)資源轉(zhuǎn)發(fā)到tomcat服務(wù)器中。
18、負(fù)載均衡
- 負(fù)載均衡即是代理服務(wù)器將接收的請求均衡的分發(fā)到各服務(wù)器中,負(fù)載均衡主要解決網(wǎng)絡(luò)擁塞問題,提高服務(wù)器響應(yīng)速度,服務(wù)就近提供,達(dá)到更好的訪問質(zhì)量,減少后臺服務(wù)器大并發(fā)壓力。
- 負(fù)載均衡策略
- 輪詢(默認(rèn)):每個請求按時(shí)間順序逐一分配到不同的后端服務(wù)器,如果后端服務(wù)器down掉,能自動剔除。;
- 指定權(quán)重:指定輪詢幾率,weight和訪問比率成正比,用于后端服務(wù)器性能不均的情況;
- IP綁定ip_hash:每個請求按訪問ip的hash結(jié)果分配,這樣每個訪客固定訪問一個后端服務(wù)器,可以解決session的問題;
- fair(第三方):按后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配。;
- url_hash(第三方):按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,后端服務(wù)器為緩存時(shí)比較有效
19、Keepalived
- Nginx+keepalived實(shí)現(xiàn)負(fù)載均衡高可用
- keepalived是集群管理中保證集群高可用的一個服務(wù)軟件,用來防止單點(diǎn)故障。
- Keepalived的作用是檢測web服務(wù)器的狀態(tài),如果有一臺web服務(wù)器死機(jī),或工作出現(xiàn)故障,Keepalived將檢測到,并將有故障的web服務(wù)器從系統(tǒng)中剔除,當(dāng)web服務(wù)器工作正常后Keepalived自動將web服務(wù)器加入到服務(wù)器群中,這些工作全部自動完成,不需要人工干涉,需要人工做的只是修復(fù)故障的web服務(wù)器。
[1]https://blog.csdn.net/kris958/article/details/102173878
[2]https://blog.csdn.net/Y0Q2T57s/article/details/88084000
總結(jié)
以上是生活随笔為你收集整理的Nginx面试题总结大全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c command语言学例子,乔姆斯基语
- 下一篇: java消息顺序执行_Apache Fl