文章原創於公衆號:程序猿周先森。本平臺不定時更新,喜歡個人文章,歡迎關注個人微信公衆號。前端
最近一直在更新關於Nginx的系列文章,終於將Nginx的幾個關鍵知識點講的差很少了。本篇做爲Nginx系列的結尾篇幅,主要是列舉一些面試時常常問到的Nginx知識點。其實Nginx適合提問的面試點並很少,問來問去基本都是相似的問題。接下來咱們一塊兒來看看Nginx基本的面試題。web
Nginx的做用面試
這個問題是入門級知識點,討論Nginx的用處。我以爲只要幾個重要的點都回答到位就能夠了,能夠考慮這樣的一個回答:Nginx是一個高性能web服務器和反向代理服務器,也是一個IMAP/POP3/SMTP服務器。不只能夠實現負載均衡,還能夠作接口限流,緩存等功能。redis
使用Nginx的優點點算法
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的健康檢查功能會將這個後端服務器剔除。可是輪詢方式是顯而易見的:可靠性低並且負載分配不平衡,因此輪詢方式更適用於圖片服務器或者靜態資源服務器。
Session不一樣步如何處理?
上面其實提過了解決方案,負載均衡方式使用ip_hash方式,若是用戶已經訪問過某個後端器,則再次訪問時會將這個請求的ip地址進行哈希算法轉換,自動定位到該服務器。固然也能夠經過redis緩存用戶session,同樣能夠處理session不一樣步的問題。
Nginx經常使用優化配置
Nginx正向代理
正向代理也是你們最常接觸的到的代理模式,那究竟什麼是正向代理呢?咱們都知道Google在國內是沒法正常訪問的,可是某些時候咱們因爲技術問題須要去訪問Google時,咱們會先找到一個能夠訪問Google的代理服務器,咱們將請求發送到代理服務器,代理服務器去訪問Google,而後將訪問到的數據返回給咱們,這樣的過程就是正向代理。正向代理最大的特色是客戶端須要明確知道要訪問的服務器地址,Google服務器只清楚請求來自哪一個代理服務器,而不清楚來自哪一個具體的客戶端,正向代理能夠隱藏真實客戶端的具體信息。
客戶端必須設置正向代理服務器,並且須要知道正向代理服務器的IP地址以及代理程序的端口。一句話來歸納就是正向代理代理的是客戶端,是一個位於客戶端和Google服務器之間的服務器,爲了從Google服務器取得數據,客戶端向代理服務器發送一個請求並指定目標(Google服務器),而後代理向原始服務器轉交請求並將得到的數據返回給客戶端。總結正向代理的幾個做用:
Nginx反向代理
多個客戶端給服務器發送的請求,Nginx服務器接收到請求之後,按照必定的規則轉發到不一樣的服務器進行業務邏輯處理,也就是咱們剛纔講到的負載均衡的策略。此時請求來源於哪一個客戶端是肯定的,可是請求由哪臺服務器處理的並不明確,Nginx扮演的就是一個反向代理角色。能夠這樣來理解,反向代理對外都是透明的,訪問者並不知道本身訪問的是一個代理。反向代理代理的是服務端,主要用於服務器集羣分佈式部署的狀況下,反向代理隱藏了服務器的信息。總結下反向代理的兩個做用:
Nginx中正向代理與反向代理的區別
歡迎關注個人我的公衆號:程序猿周先森