Nginx 面試中最常見的 18 道題

Nginx 的併發能力在同類型網頁服務器中的表現,相對而言是比較好的,因此受到了很多企業的青睞,我國使用 Nginx 網站的知名用戶包括騰訊、淘寶、百度、京東、新浪、網易等等。Nginx 是網頁服務器運維人員必備技能之一,下面爲大家整理了一些比較常見的 Nginx 相關面試題,僅供參考:

1、請解釋一下什麼是 Nginx?

Nginx---Ngine X,是一款免費的、自由的、開源的、高性能 HTTP 服務器和反向代理服務器;也是一個 IMAP、POP3、SMTP 代理服務器;Nginx 以其高性能、穩定性、豐富的功能、簡單的配置和低資源消耗而聞名。

也就是說 Nginx 本身就可以託管網站(類似於 Tomcat 一樣),進行 Http 服務處理,也可以作爲反向代理服務器 、負載均衡器和 HTTP 緩存。

Nginx 解決了服務器的 C10K(就是在一秒之內連接客戶端的數目爲 10k 即 1 萬)問題。它的設計不像傳統的服務器那樣使用線程處理請求,而是一個更加高級的機制—事件驅動機制,是一種異步事件驅動結構。

2、請列舉 Nginx 的一些特性

3、請列舉 Nginx 和 Apache 之間的不同點

4、請解釋 Nginx 如何處理 HTTP 請求。

Nginx 是一個高性能的 Web 服務器,能夠同時處理大量的併發請求。它結合多進程機制和異步機制 ,異步機制使用的是異步非阻塞方式 ,接下來就給大家介紹一下 Nginx 的多線程機制和異步非阻塞機制 。

1、多進程機制

服務器每當收到一個客戶端時,就有 服務器主進程 ( master process )生成一個 子進程( worker process )出來和客戶端建立連接進行交互,直到連接斷開,該子進程就結束了。

使用進程的好處是各個進程之間相互獨立,不需要加鎖,減少了使用鎖對性能造成影響,同時降低編程的複雜度,降低開發成本。其次,採用獨立的進程,可以讓進程互相之間不會影響 ,如果一個進程發生異常退出時,其它進程正常工作, master 進程則很快啓動新的 worker 進程,確保服務不會中斷,從而將風險降到最低。

缺點是操作系統生成一個子進程需要進行 內存複製等操作,在資源和時間上會產生一定的開銷。當有大量請求時,會導致系統性能下降 。

2、異步非阻塞機制

每個工作進程 使用 異步非阻塞方式 ,可以處理 多個客戶端請求 。

當某個 工作進程 接收到客戶端的請求以後,調用 IO 進行處理,如果不能立即得到結果,就去 處理其他請求 (即爲 非阻塞 );而 客戶端 在此期間也 無需等待響應 ,可以去處理其他事情(即爲 異步 )。

當 IO 返回時,就會通知此 工作進程 ;該進程得到通知,暫時 掛起 當前處理的事務去 響應客戶端請求 。

5、在 Nginx 中,如何使用未定義的服務器名稱來阻止處理請求?


只需將請求刪除的服務器就可以定義爲:

這裏,服務器名被保留爲一個空字符串,它將在沒有 “主機” 頭字段的情況下匹配請求,而一個特殊的 Nginx 的非標準代碼 444 被返回,從而終止連接。

6、 使用 “反向代理服務器” 的優點是什麼?

反向代理服務器可以隱藏源服務器的存在和特徵。它充當互聯網雲和 web 服務器之間的中間層。這對於安全方面來說是很好的,特別是當您使用 web 託管服務時。

7、請列舉 Nginx 服務器的最佳用途。

Nginx 服務器的最佳用法是在網絡上部署動態 HTTP 內容,使用 SCGI、WSGI 應用程序服務器、用於腳本的 FastCGI 處理程序。它還可以作爲負載均衡器。

8、請解釋 Nginx 服務器上的 Master 和 Worker 進程分別是什麼?

一般推薦 worker 進程數與 CPU 內核數一致,這樣一來不存在大量的子進程生成和管理任務,避免了進程之間競爭 CPU 資源和進程切換的開銷。而且 Nginx 爲了更好的利用 多核特性 ,提供了 CPU 親緣性的綁定選項,我們可以將某一個進程綁定在某一個核上,這樣就不會因爲進程的切換帶來 Cache 的失效。

對於每個請求,有且只有一個工作進程 對其處理。首先,每個 worker 進程都是從 master 進程 fork 過來。在 master 進程裏面,先建立好需要 listen 的 socket(listenfd) 之後,然後再 fork 出多個 worker 進程。

所有 worker 進程的 listenfd 會在新連接到來時變得可讀 ,爲保證只有一個進程處理該連接,所有 worker 進程在註冊 listenfd 讀事件前搶佔 accept_mutex ,搶到互斥鎖的那個進程註冊 listenfd 讀事件 ,在讀事件裏調用 accept 接受該連接。

當一個 worker 進程在 accept 這個連接之後,就開始讀取請求、解析請求、處理請求,產生數據後,再返回給客戶端 ,最後才斷開連接。這樣一個完整的請求就是這樣的了。我們可以看到,一個請求,完全由 worker 進程來處理,而且只在一個 worker 進程中處理。

在 Nginx 服務器的運行過程中, 主進程和工作進程 需要進程交互。交互依賴於 Socket 實現的管道來實現。

9、請解釋代理設計中的正向代理和反向代理**?**

首先,代理服務器一般指局域網內部的機器通過代理服務器發送請求到互聯網上的服務器,代理服務器一般作用在客戶端。例如:GoAgent 翻牆軟件。我們的客戶端在進行翻牆操作的時候,我們使用的正是正向代理,通過正向代理的方式,在我們的客戶端運行一個軟件,將我們的 HTTP 請求轉發到其他不同的服務器端,實現請求的分發。

反向代理服務器作用在服務器端,它在服務器端接收客戶端的請求,然後將請求分發給具體的服務器進行處理,然後再將服務器的相應結果反饋給客戶端。Nginx 就是一個反向代理服務器軟件。

從上圖可以看出:客戶端必須設置正向代理服務器,當然前提是要知道正向代理服務器的 IP 地址,還有代理程序的端口。 
反向代理正好與正向代理相反,對於客戶端而言代理服務器就像是原始服務器,並且客戶端不需要進行任何特別的設置。客戶端向反向代理的命名空間(name-space)中的內容發送普通請求,接着反向代理將判斷向何處(原始服務器)轉交請求,並將獲得的內容返回給客戶端。

10、請解釋是否有可能將 Nginx 的錯誤替換爲 502 錯誤、503?

502 = 錯誤網關

503 = 服務器超載

有可能,但是您可以確保 fastcgi_intercept_errors 被設置爲 ON,並使用錯誤頁面指令。

11、在 Nginx 中,解釋如何在 URL 中保留雙斜線?

要在 URL 中保留雙斜線,就必須使用 merge_slashes_off;

語法: merge_slashes [on/off]

默認值: merge_slashes on

環境: http,server

12、請解釋 ngx_http_upstream_module 的作用是什麼?

ngx_http_upstream_module 用於定義可通過 fastcgi 傳遞、proxy 傳遞、uwsgi 傳遞、memcached 傳遞和 scgi 傳遞指令來引用的服務器組。

13、請解釋什麼是 C10K 問題?

C10K 問題是指無法同時處理大量客戶端 (10,000) 的網絡套接字。

14、請陳述 stub_status 和 sub_filter 指令的作用是什麼?

Stub_status 指令:該指令用於瞭解 Nginx 當前狀態的當前狀態,如當前的活動連接,接受和處理當前讀 / 寫 / 等待連接的總數;

Sub_filter 指令:它用於搜索和替換響應中的內容,並快速修復陳舊的數據;

15、解釋 Nginx 是否支持將請求壓縮到上游?

您可以使用 Nginx 模塊 gunzip 將請求壓縮到上游。gunzip 模塊是一個過濾器,它可以對不支持 “gzip” 編碼方法的客戶機或服務器使用 “內容編碼: gzip” 來解壓縮響應。

16、解釋如何在 Nginx 中獲得當前的時間?

要獲得 Nginx 的當前時間,必須使用 SSI 模塊、$date_gmt 和 $date_local 的變量。

Proxy_set_header THE-TIME $date_gmt;

17、用 Nginx 服務器解釋 - s 的目的是什麼?

用於運行 Nginx -s 參數的可執行文件。

18、解釋如何在 Nginx 服務器上添加模塊?

在編譯過程中,必須選擇 Nginx 模塊,因爲 Nginx 不支持模塊的運行時間選擇。

作者:CodeMan

來源:segmentfault.com/a/1190000010677483

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/WRNLfEU6ZoqkjpTIolMmzg