Nginx--面試基礎必會

文章原創於公衆號:程序猿周先森。本平臺不定時更新,喜歡個人文章,歡迎關注個人微信公衆號。
file前端

最近一直在更新關於Nginx的系列文章,終於將Nginx的幾個關鍵知識點講的差很少了。本篇做爲Nginx系列的結尾篇幅,主要是列舉一些面試時常常問到的Nginx知識點。其實Nginx適合提問的面試點並很少,問來問去基本都是相似的問題。接下來咱們一塊兒來看看Nginx基本的面試題。web

Nginx的做用面試

這個問題是入門級知識點,討論Nginx的用處。我以爲只要幾個重要的點都回答到位就能夠了,能夠考慮這樣的一個回答:Nginx是一個高性能web服務器和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。不只能夠實現負載均衡,還能夠作接口限流,緩存等功能。redis

使用Nginx的優點點算法

  • Nginx因爲使用了epoll和kqueue網路I/O模型,在實際生產環境可以支撐3萬左右併發鏈接。
  • Nginx內存消耗低。
  • Nginx跨平臺,並且配置相對來講難度較低。
  • Nginx內置健康檢查功能,若是負載均衡其中一個服務器宕機了,則接受到的請求會發送給其餘服務器去處理。
  • 支持Gzip壓縮,能夠添加瀏覽器本地緩存的Header頭。
  • Nginx支持熱部署,能夠在不間斷服務的狀況下平滑進行配置的更改。
  • Nginx異步接收用戶請求,減輕了Web服務器的壓力。

Nginx如何實現高併發segmentfault

這個問題出來可能懂一點Nginx的朋友們都是浮現出5個字:異步非阻塞。實際上Nginx就是異步非阻塞,使用了epoll模型並對底層代碼進行大幅度優化。以前其實有講過Nginx是採用1個master進程,多個worker進程的模式,每次接收到一個請求,master會將請求按照必定策略分發給一個worker進程去進行處理請求。worker進程數通常設置爲和CPU核心數一致,異步非阻塞模式就會使得worker線程在等待請求callback的空閒時間能夠接收處理新的請求,當接收到舊請求的callback時再回去繼續處理該請求,這樣就完成了少數幾個worker進程卻實現了高併發的問題。後端

Nginx爲什麼不使用多線程?瀏覽器

衆所周知,沒建立一個新的線程,都須要爲其分配cpu和內存。固然,建立進程也是同樣,可是因爲線程過多會致使內存消耗過多。因此Nginx採用單線程異步處理用戶請求,這樣不須要不斷地爲新的線程分配cpu和內存,減輕服務器內存消耗,因此使得Nginx性能方面更爲高效。緩存

Nginx如何處理請求?安全

Nginx啓動後,首先進行配置文件的解析,解析成功會獲得虛擬服務器的ip和端口號,在主進程master進程中建立socket,對addrreuse選項進行設置,並將socket綁定到對應的ip地址和端口並進行監聽。而後建立子進程worker進程,當客戶端和Nginx進行三次握手,則能夠建立成功與Nginx的鏈接。當有新的請求進入時,空閒的worker進程會競爭,當某一個worker進程競爭成功,則會獲得這個已經成功創建鏈接的socket,而後建立ngx_connection_t結構體,接下來設置讀寫事件處理函數並添加讀寫事件用來與客戶端進行數據交換。當請求結束Nginx或者客戶端主動關閉鏈接,此時一個請求處理完畢。

爲何要作動靜分離?

在平常開發中,前端請求靜態文件好比圖片資源是不須要通過後端服務器的,可是調用API這些類型的就須要後端進行處理請求,因此爲了提升對資源文件的響應速度,咱們應該使用動靜分離的策略去作架構。咱們能夠將靜態文件放到Nginx中,將動態資源的請求轉發到後端服務器去進行進一步的處理。

Nginx負載均衡的幾種經常使用方式?

輪詢方式:默認狀況下Nginx使用輪詢的方式實現負載均衡,每一個新的請求按照時間順序逐一分配到不一樣的後端服務器去進行處理,若是後端服務器宕機,則Nginx的健康檢查功能會將這個後端服務器剔除。可是輪詢方式是顯而易見的:可靠性低並且負載分配不平衡,因此輪詢方式更適用於圖片服務器或者靜態資源服務器。

  • weight:能夠對不一樣的後端服務器設置不一樣的權重比例,這樣能夠改變不一樣後端服務器處理請求的比例。能夠給性能更優的後端服務器配置更高的權重。
  • ip_hash:這種方式會根據請求的ip地址的hash結果分配後端服務器來處理請求,這樣每一個用戶發起的請求固定只會由同一個後端服務器處理,這樣能夠解決session問題。
  • fail:這種方式有點相似於輪詢方式,主要是根據後端服務器的響應時間來分配請求,響應時間短的後端服務器優先分配請求。
  • url_hash:這種方式是按照請求url的hash結果來將不一樣請求分配到不一樣服務器,使用這種方式每一個url的請求都會由同一個後端服務器進行處理,後端服務器爲緩存時效率會更高。

Session不一樣步如何處理?

上面其實提過了解決方案,負載均衡方式使用ip_hash方式,若是用戶已經訪問過某個後端器,則再次訪問時會將這個請求的ip地址進行哈希算法轉換,自動定位到該服務器。固然也能夠經過redis緩存用戶session,同樣能夠處理session不一樣步的問題。

Nginx經常使用優化配置

  1. 調整worker_processes指定Nginx須要建立的worker進程數量,剛纔有提到worker進程數通常設置爲和CPU核心數一致。
  2. 調整worker_connections設置Nginx最多能夠同時服務的客戶端數。結合worker_processes配置能夠得到每秒能夠服務的最大客戶端數。
  3. 啓動gzip壓縮,能夠對文件大小進行壓縮,減小了客戶端http的傳輸帶寬,能夠大幅度提升頁面的加載速度。
  4. 啓用緩存,若是請求靜態資源,啓用緩存是能夠大幅度提高性能的。關於啓用緩存能夠觀看Nginx緩存這篇文章:Nginx緩存原理及機制

Nginx正向代理

正向代理也是你們最常接觸的到的代理模式,那究竟什麼是正向代理呢?咱們都知道Google在國內是沒法正常訪問的,可是某些時候咱們因爲技術問題須要去訪問Google時,咱們會先找到一個能夠訪問Google的代理服務器,咱們將請求發送到代理服務器,代理服務器去訪問Google,而後將訪問到的數據返回給咱們,這樣的過程就是正向代理。正向代理最大的特色是客戶端須要明確知道要訪問的服務器地址,Google服務器只清楚請求來自哪一個代理服務器,而不清楚來自哪一個具體的客戶端,正向代理能夠隱藏真實客戶端的具體信息。
file

客戶端必須設置正向代理服務器,並且須要知道正向代理服務器的IP地址以及代理程序的端口。一句話來歸納就是正向代理代理的是客戶端,是一個位於客戶端和Google服務器之間的服務器,爲了從Google服務器取得數據,客戶端向代理服務器發送一個請求並指定目標(Google服務器),而後代理向原始服務器轉交請求並將得到的數據返回給客戶端。總結正向代理的幾個做用:

  • 訪問國外沒法訪問的網站作緩存,加速訪問資源
  • 對客戶端訪問受權,上網進行認證代理
  • 能夠記錄用戶訪問記錄(上網行爲管理),對外隱藏用戶信息

Nginx反向代理

多個客戶端給服務器發送的請求,Nginx服務器接收到請求之後,按照必定的規則轉發到不一樣的服務器進行業務邏輯處理,也就是咱們剛纔講到的負載均衡的策略。此時請求來源於哪一個客戶端是肯定的,可是請求由哪臺服務器處理的並不明確,Nginx扮演的就是一個反向代理角色。能夠這樣來理解,反向代理對外都是透明的,訪問者並不知道本身訪問的是一個代理。反向代理代理的是服務端,主要用於服務器集羣分佈式部署的狀況下,反向代理隱藏了服務器的信息。總結下反向代理的兩個做用:

  • 保證內網的安全,一般將反向代理做爲公網訪問地址,Web服務器是內網
  • 負載均衡,經過反向代理服務器來優化網站的負載

Nginx中正向代理與反向代理的區別
file

  1. 在正向代理中,隱藏了請求來源的客戶端信息;
  2. 在反向代理中,隱藏了請求具體處理的服務端信息;

歡迎關注個人我的公衆號:程序猿周先森
file

相關文章
相關標籤/搜索