面試題一Nginx
-
什麼是Nginx?
Nginx是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。
-
爲什麼使用Nginx?和Tomcat有什麼區別?
nginx常用做靜態內容服務和代理服務器,直接外來請求轉發給後面的應用服務器(tomcat,Diango等),tomcat更多用來做一個應用容器,讓Java Web App泡在裏面的東西。嚴格意思上來講,Apache和Nginx應該叫做HTTP Server(靜態服務器),而Tomcat是一個Applicants Server(動態服務器),是一個Servlet/JSO應用的容器。
Apache是同步多進程模型,一個連接對應一個進程,而Nginx是一步的,多個連接(萬級別)可以對應一個進程。
Nginx輕量級,抗併發,處理靜態文件好,能夠支撐5萬併發連接,並且CPU、內存等資源消耗卻非常低,運行穩定。
-
Nginx的優缺點?
優點:
-
更快
一方面在正常情況下,單次請求會得到更快的響應;另一方面,在高峯期(數以萬計的併發請求),Nginx可以比其他Web服務器更快地響應請求。
-
代理靈活,部署簡單
可以通過端口代理和域名代理實現反向代理Nginx,安裝和配置比較簡單
-
高可靠性
用於反向代理,宕機的概率微乎其微
-
低內存消耗
一般情況下,10 000個非活躍的HTTP Keep-Alive連接在Nginx中僅消耗2.5MB的內存,這是Nginx支持高併發連接的基礎。
-
單機支持10萬以上的併發連接
-
熱部署
-
最自由的BSD許可協議
master管理進程與worker工作進程的分離設計,使得Nginx能夠提供熱部署功能,即可以在7×24小時不間斷服務的前提下,升級Nginx的可執行文件。當然,它也支持不停止服務就更新配置項、更換日誌文件等功能。
缺點:
- nginx處理動態請求是雞肋,一般動態請求要apache去做,nginx只適合靜態和反向
- Nginx僅能支持http、https和Email協議,這樣就在適用範圍上面小些
-
-
什麼是反向代理和負載均衡?
使用Nginx實現反向代理,Nginx只做請求的轉發,後臺有多個Http服務器提供服務,Nginx的功能就是把請求轉發給後面的服務器,決定把請求轉發給誰
負載均衡就是將負載較爲平均分配到各個服務器
-
Nginx負載均衡有幾種方式?
nginx默認支持的策略:
輪詢(默認使用策略):
根據Nginx配置文件中的順序,將請求按順序輪流地分配到後端服務器上
upstream balance { server 114.215.83.4:8080; server 114.215.23.9:8080; }
least_conn(最小連接數):
Web請求會被轉發到連接數最少的服務器上,儘可能地提高後端服務的利用效率,將負載合理地分流到每一臺服務器。
upstream balance { least_conn; server 114.215.83.4:8080; server 114.215.23.9:8080; }
weight(指定權重)
權重越高的服務器被分配請求的概率越大,常用於後端服務器性能不均的情況下。
upstream balance { server 114.215.83.4:8080 weight=8; server 114.215.23.9:8080 weight=2; }
ip_hash(ip哈希)
前述負載均衡策略中,同一客戶端連續的Web請求可能會被分發到不同的後端服務器進行處理,因此導致會話Session失效,ip_hash將同一客戶端連續的Web請求都會被分發到同一服務器進行處理。
upstream balance { ip_hash; server 114.215.83.4:8080; server 114.215.23.9:8080; }
nginx需要第三方支持的策略:
fair :
按照服務器響應時間的長短來進行分發的,服務器響應時間越短的,優先分發。
upstream backserver { server server1; server server2; fair; }
url_hash(url哈希):
按訪問url的hash結果來分配請求,使每個url定向到同一個後端服務器,後端服務器爲緩存時比較有效。
upstream backserver { server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; }
-
爲什麼不使用多線程?
Apache: 創建多個進程或線程,而每個進程或線程都會爲其分配cpu和內存(線程要比進程小的多,所以worker支持比perfork高的併發),併發過大會榨乾服務器資源。
Nginx: 採用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進程的工作進程的數量)(epoll),不會爲每個請求分配cpu和內存資源,節省了大量資源,同時也減少了大量的CPU的上下文切換。所以才使得Nginx支持更高的併發。
-
Nginx是如何處理一個請求的呢?
首先,nginx在啓動時,會解析配置文件,得到需要監聽的端口與ip地址,然後在nginx的master進程裏面先初始化好這個監控的socket,再進行listen然後再fork出多個子進程出來, 子進程會競爭accept新的連接。此時,客戶端就可以向nginx發起連接了。當客戶端與nginx進行三次握手,與nginx建立好一個連接後,此時,某一個子進程會accept成功,然後創建nginx對連接的封裝,即ngx_connection_t結構體接着,根據事件調用相應的事件處理模塊,如http模塊與客戶端進行數據的交換,最後,nginx或客戶端來主動關掉連接