面試題一Nginx

面試題一Nginx

  1. 什麼是Nginx?

    Nginx是一個高性能的 HTTP 和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。因它的穩定性、豐富的功能集、示例配置文件和低系統資源的消耗而聞名。

  2. 爲什麼使用Nginx?和Tomcat有什麼區別?

    nginx常用做靜態內容服務和代理服務器,直接外來請求轉發給後面的應用服務器(tomcat,Diango等),tomcat更多用來做一個應用容器,讓Java Web App泡在裏面的東西。嚴格意思上來講,Apache和Nginx應該叫做HTTP Server(靜態服務器),而Tomcat是一個Applicants Server(動態服務器),是一個Servlet/JSO應用的容器。

    Apache是同步多進程模型,一個連接對應一個進程,而Nginx是一步的,多個連接(萬級別)可以對應一個進程。

    Nginx輕量級,抗併發,處理靜態文件好,能夠支撐5萬併發連接,並且CPU、內存等資源消耗卻非常低,運行穩定。

  3. 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協議,這樣就在適用範圍上面小些
  4. 什麼是反向代理和負載均衡?

    使用Nginx實現反向代理,Nginx只做請求的轉發,後臺有多個Http服務器提供服務,Nginx的功能就是把請求轉發給後面的服務器,決定把請求轉發給誰

    負載均衡就是將負載較爲平均分配到各個服務器
    在這裏插入圖片描述

  5. 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; 
    } 
    
    
  6. 爲什麼不使用多線程?

    Apache: 創建多個進程或線程,而每個進程或線程都會爲其分配cpu和內存(線程要比進程小的多,所以worker支持比perfork高的併發),併發過大會榨乾服務器資源。

    Nginx: 採用單線程來異步非阻塞處理請求(管理員可以配置Nginx主進程的工作進程的數量)(epoll),不會爲每個請求分配cpu和內存資源,節省了大量資源,同時也減少了大量的CPU的上下文切換。所以才使得Nginx支持更高的併發。

  7. Nginx是如何處理一個請求的呢?
    首先,nginx在啓動時,會解析配置文件,得到需要監聽的端口與ip地址,然後在nginx的master進程裏面先初始化好這個監控的socket,再進行listen然後再fork出多個子進程出來, 子進程會競爭accept新的連接。

    此時,客戶端就可以向nginx發起連接了。當客戶端與nginx進行三次握手,與nginx建立好一個連接後,此時,某一個子進程會accept成功,然後創建nginx對連接的封裝,即ngx_connection_t結構體接着,根據事件調用相應的事件處理模塊,如http模塊與客戶端進行數據的交換,最後,nginx或客戶端來主動關掉連接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章