Nginx常见面试题及详细答案
本文參考 嗨客網 Java 隨筆
前言
本章節記錄了一些常見的 Nginx 面試題及詳細答案,目錄如下:
文章目錄
- 前言
- Nginx優缺點
- Nginx與Apache對比
- 優點
- 缺點
- Nginx與Apache選擇
- Apache
- Nginx
- Nginx使用場景
- 正向代理與反向代理
- 反向代理好處
- Nginx有哪些特點
- Nginx的特點
- Nginx三大功能
- Nginx master與worker進程
- Nginx IO模型
- Nginx多進程
- Nginx驚群
- Nginx處理HTTP請求過程
- Nginx是如何實現高并發的
- Nginx動靜分離
- Nginx開啟gzip壓縮
- Nginx動態添加模塊
- Nginx解決跨域問題
- Nginx 502錯誤原因和解決方法
- Nginx負載均衡
- Nginx rewrite全局變量
- Nginx限制瀏覽器和爬蟲
- Nginx限制爬蟲
- Nginx限制瀏覽器訪問
- Nginx限制IP訪問
- Nginx限制IP訪問頻率
- C10K問題
- 漏桶算法和令牌桶算
- 更多
?
Nginx優缺點
Nginx (engine x) 是一個高性能的 HTTP 和反向代理服務,也是一個 IMAP/POP3/SMTP 服務。Nginx 是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的 Rambler.ru 站點(俄文:Рамблер)開發的,第一個公開版本 0.1.0 發布于 2004 年10 月 4 日。
其將源代碼以類 BSD 許可證的形式發布,因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。2011 年 6 月 1 日,nginx 1.0.4 發布。
Nginx 是一款輕量級的 Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,并在一個 BSD-like 協議下發行。其特點是占有內存少,并發能力強,事實上 nginx 的并發能力確實在同類型的網頁服務器中表現較好,中國大陸使用 nginx 網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
詳細說明:鏈接
?
Nginx與Apache對比
優點
在高并發下 nginx 能保持低資源低消耗高性能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現進程數飆升,從而拒絕服務的現象。
缺點
?
Nginx與Apache選擇
Apache
● apache 的 rewrite 比 nginx 強大,在 rewrite 頻繁的情況下,用 apache
● apache 發展到現在,模塊超多,基本想到的都可以找到
● apache 更為成熟,少 bug ,nginx 的 bug 相對較多
● apache 超穩定
● apache 對 PHP 支持比較簡單,nginx 需要配合其他后端用
● apache 在處理動態請求有優勢,nginx 在這方面是雞肋,一般動態請求要 apache 去做,nginx 適合靜態和反向。
● apache 仍然是目前的主流,擁有豐富的特性,成熟的技術和開發社區
?
Nginx
● 輕量級,采用 C 語言 進行編寫,同樣的 web 服務,會占用更少的內存及資源
● 抗并發,nginx 以 epoll and kqueue 作為開發模型,處理請求是異步非阻塞的,負載能力比 apache 高很多,而 apache 則是阻塞型的。在高并發下 nginx 能保持低資源低消耗高性能 ,而 apache 在 PHP 處理慢或者前端壓力很大的情況下,很容易出現進程數飆升,從而拒絕服務的現象。
● nginx 處理靜態文件好,靜態處理性能比 apache 高三倍以上
● nginx 的設計高度模塊化,編寫模塊相對簡單
● nginx 配置簡潔,正則配置讓很多事情變得簡單,而且改完配置能使用 -t 測試配置有沒有問題,apache 配置復雜 ,重啟的時候發現配置出錯了,會很崩潰
● nginx 作為負載均衡服務器,支持 7 層負載均衡
● nginx 本身就是一個反向代理服務器,而且可以作為非常優秀的郵件代理服務器
● 啟動特別容易, 并且幾乎可以做到 7*24 不間斷運行,即使運行數個月也不需要重新啟動,還能夠不間斷服務的情況下進行軟件版本的升級
● 社區活躍,各種高性能模塊出品迅速
?
Nginx使用場景
Nginx 的常用使用場景包括 HTTP 服務器、靜態服務器、反向代理、負載均衡、動靜分離、統一訪問入口、解決瀏覽器跨域問題和行為分析等。
詳細說明:鏈接
?
正向代理與反向代理
代理其實就是一個中介,A 和 B 本來可以直連,中間插入一個 C,C 就是中介。剛開始的時候,代理多數是幫助內網 client 訪問外網 server 用的。
后來出現了反向代理,“反向” 這個詞在這兒的意思其實是指方向相反,即代理將來自外網客戶端的請求轉發到內網服務器,從外到內。
詳細說明:鏈接
?
反向代理好處
詳細說明:鏈接
?
Nginx有哪些特點
Nginx的特點
-
熱部署
-
可以高并發連接
-
低的內存消耗
-
處理響應請求很快
-
具有很高的可靠性
Nginx三大功能
- 反向代理
- 負載均衡
- 動靜分離
詳細說明:鏈接
?
Nginx master與worker進程
詳細說明:鏈接
?
Nginx IO模型
Nginx 支持多種并發模型,并發模型的具體實現根據系統平臺而有所不同。在支持多種并發模型的平臺上,Nginx 自動選擇最高效的模型。但我們也可以使用 use 指令在配置文件中顯式地定義某個并發模型。
詳細說明:鏈接
?
Nginx多進程
Nginx 是通過基于異步及非阻塞的事件驅動模型和多進程機制實現高性能的。
詳細說明:鏈接
?
Nginx驚群
驚群效應(thundering herd)是指多進程(多線程)在同時阻塞等待同一個事件的時候(休眠狀態),如果等待的這個事件發生,那么他就會喚醒等待的所有進程(或者線程),但是最終卻只能有一個進程(線程)獲得這個時間的 “控制權”,對該事件進行處理,而其他進程(線程)獲取 “控制權” 失敗,只能重新進入休眠狀態,這種現象和性能浪費就叫做驚群效應。
詳細說明:鏈接
?
Nginx處理HTTP請求過程
Nginx 處理 HTTP 請求的過程大概可以分為 11 個階段,如下:
以上這七個步驟從整體上介紹了一下處理流程,下面還會再說一下實際的處理過程。
詳細說明:鏈接
?
Nginx是如何實現高并發的
如果一個 server 采用一個進程(或者線程)負責一個 request 的方式,那么進程數就是并發數。那么顯而易見的,就是會有很多進程在等待中。等什么?最多的應該是等待網絡傳輸。其缺點胖友應該也感覺到了,此處不述。
而 Nginx 的異步非阻塞工作方式正是利用了這點等待的時間。在需要等待的時候,這些進程就空閑出來待命了。因此表現為少數幾個進程就解決了大量的并發問題。
Nginx 是如何利用的呢,簡單來說:同樣的 4 個進程,如果采用一個進程負責一個 request 的方式,那么,同時進來 4 個 request 之后,每個進程就負責其中一個,直至會話關閉。期間,如果有第 5 個 request 進來了。就無法及時反應了,因為 4 個進程都沒干完活呢,因此,一般有個調度進程,每當新進來了一個 request ,就新開個進程來處理。
詳細說明:鏈接
?
Nginx動靜分離
動靜分離是讓動態網站里的動態網頁根據一定規則把不變的資源和經常變的資源區分開來,動靜資源做好了拆分以后,我們就可以根據靜態資源的特點將其做緩存操作,這就是網站靜態化處理的核心思路,實際上,何謂動?何謂靜呢?拿我們 Java 來說 jsp、servlet 等就是動,因為他們離開我們的 web 服務器的支持就會無法正常工作。而 js、css 等文件就是靜了。因為離開 web 服務器他一樣能正常的工作。
詳細說明:鏈接
?
Nginx開啟gzip壓縮
Nginx 開啟 Gzip 壓縮功能, 可以使網站的 css、js 、xml、html 文件在傳輸時進行壓縮,提高訪問速度, 進而優化 Nginx 性能。
網站加載的速度取決于瀏覽器必須下載的所有文件的大小。減少要傳輸的文件的大小可以使網站不僅加載更快,而且對于那些寬帶是按量計費的人來說也更友好。
gzip 是一種流行的數據壓縮程序。您可以使用 gzip 壓縮 Nginx 實時文件。這些文件在檢索時由支持它的瀏覽器解壓縮,好處是 web 服務器和瀏覽器之間傳輸的數據量更小,速度更快。
gzip 不一定適用于所有文件的壓縮。例如,文本文件壓縮得非常好,通常會縮小兩倍以上。另一方面,諸如 JPEG或 PNG 文件之類的圖像已經按其性質進行壓縮,使用 gzip 壓縮很難有好的壓縮效果或者甚至沒有效果。壓縮文件會占用服務器資源,因此最好只壓縮那些壓縮效果好的文件。
詳細說明:鏈接
?
Nginx動態添加模塊
很多時候,我們根據當時的項目情況和業務需求安裝完 Nginx 后,后續隨著業務的發展,往往會給安裝好的 Nginx 添加其他的功能模塊。在為 Nginx 添加功能模塊時,要求 Nginx 不停機。
這就涉及到如何為已安裝的 Nginx 動態添加模塊的問題。本文,就和小伙伴們一起探討如何為已安裝的 Nginx 動態添加模塊的問題。
詳細說明:鏈接
?
Nginx解決跨域問題
跨域是前端開發中經常會遇到的問題,前端調用后臺服務時,通常會遇到 No ‘Access-Control-Allow-Origin’ header is present on the requested resource 的錯誤,這是因為瀏覽器的同源策略拒絕了我們的請求。
所謂同源是指,域名,協議,端口相同,瀏覽器執行一個腳本時同源的腳本才會被執行。如果非同源,那么在請求數據時,瀏覽器會在控制臺中報一個異常,提示拒絕訪問。這個問題我們通常會使用 CORS(跨源資源共享)或者 JSONP 去解決,這兩種方法也是使用較多的方法。
詳細說明:鏈接
?
Nginx 502錯誤原因和解決方法
不管你是做運維還是做開發,哪怕你是游客,時不時會遇到 502 Bad Gateway 或 504 Gateway Time-out。出現這頁面,把服務重啟下,再實在不行重啟下服務器,問題就解決了,特殊情況請繼續閱讀。
詳細說明:鏈接
?
Nginx負載均衡
在服務器集群中,Nginx 起到一個代理服務器的角色(即反向代理),為了避免單獨一個服務器壓力過大,將來自用戶的請求轉發給不同的服務器。
詳細說明:鏈接
?
Nginx rewrite全局變量
Nginx rewrite 常用的全局變量如下:
| $args | 存放了請求 url 中的請求指令。比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的arg1=value1&arg2=value2 |
| $content_length | 存放請求頭中的 Content-length 字段 |
| $content_type | 存放了請求頭中的 Content-type 字段 |
| $document_root | 存放了針對當前請求的根路徑 |
| $document_uri | 請求中的 uri,不包含請求指令 ,比如比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 /server/source |
| $host | 存放了請求 url 中的主機字段,比如 http://www.myweb.name/server/source?arg1=value1&arg2=value2 中的 www.myweb.name。如果請求中的主機部分字段不可用或者為空,則存放 nginx 配置中該 server 塊中 server_name 指令的配置值 |
| $http_user_agent | 存放客戶端的代理 |
| $http_cookie | cookie |
| $limit_rate | nginx 配置中 limit_rate 指令的配置值 |
| $remote_addr | 客戶端的地址 |
| $remote_port | 客戶端與服務器端建立連接的端口號 |
| $remote_user | 變量中存放了客戶端的用戶名 |
| $request_body_file | 存放了發給后端服務器的本地文件資源的名稱 |
| $request_method | 存放了客戶端的請求方式,如 get,post 等 |
| $request_filename | 存放當前請求的資源文件的路徑名 |
| $requset_uri | 當前請求的 uri,并且帶有指令 |
| $query_string | $args含義相同 |
| $scheme | 客戶端請求使用的協議,如 http, https, ftp 等 |
| $server_protocol | 客戶端請求協議的版本,如 ”HTTP/1.0”, ”HTTP/1.1” |
| $server_addr | 服務器的地址 |
| $server_name | 客戶端請求到達的服務器的名稱 |
| $server_port | 客戶端請求到達的服務器的端口號 |
| $uri | 同 $document_uri |
詳細說明:鏈接
?
Nginx限制瀏覽器和爬蟲
Nginx限制爬蟲
修改 nginx.conf,禁止網絡爬蟲的 ua,返回 403,具體配置如下:
server{listen 80;server_name 127.0.0.1; # 添加如下內容即可防止爬蟲if ($http_user_agent ~* "qihoobot|Baiduspider|Googlebot|Googlebot-Mobile|Googlebot-Image|Mediapartners-Google|Adsbot-Google|Feedfetcher-Google|Yahoo! Slurp|Yahoo! Slurp China|YoudaoBot|Sosospider|Sogou spider|Sogou web spider|MSNBot|ia_archiver|Tomato Bot") {return 403;} }Nginx限制瀏覽器訪問
限制瀏覽器訪問:
if ($http_user_agent ~* "Firefox|MSIE") {return 403; }詳細說明:鏈接
?
Nginx限制IP訪問
有時候我們需要針對屏蔽某些惡意的 IP 訪問我們的網站,或者限制僅僅某些白名單 IP 才能訪問我們的網站。這時候我們就可以在 Nginx 中通過簡單的配置來達到目的。
詳細說明:鏈接
?
Nginx限制IP訪問頻率
詳細說明:鏈接
?
C10K問題
所謂 c10k 問題,指的是服務器如何支持 10k 個并發連接,也就是 concurrent 10000 connection(這也是 c10k 這個名字的由來)。
由于硬件成本的大幅度降低和硬件技術的進步,如果一臺服務器能夠同時服務更多的客戶端,那么也就意味著服務每一個客戶端的成本大幅度降低。從這個角度來看,c10k 問題顯得非常有意義。
詳細說明:鏈接
?
漏桶算法和令牌桶算
每一個對外提供的 API 接口都是需要做流量控制的,不然會導致系統直接崩潰。很簡單的例子,和保險絲的原理一樣,如果用電符合超載就會燒斷保險絲斷掉電源以達到保護的作用。API 限流的意義也是如此,如果 API 上的流量請求超過核定的數值我們就得對請求進行引流或者直接拒絕等操作。
既然要限流,就得提到限流算法了,一般有漏桶算法和令牌桶算法兩種限流算法。
詳細說明:鏈接
?
更多
原文大綱: 鏈接
更多文章,可以關注下方公眾號:
總結
以上是生活随笔為你收集整理的Nginx常见面试题及详细答案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python如何自定义函数_python
- 下一篇: linux版本的redis bin,Li