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