面試官:關於負載均衡你瞭解多少 | Nginx面試題 | Nginx架構

面試官:關於負載均衡你瞭解多少,知道哪些常用框架?

問題分析:

工作中小編也會經常接觸到 Nginx,比如美團的 Oceanus 框架,是一款 HTTP 服務治理框架,這個框架就是基於 Nginx和 ngx_lua 擴展的,主要提供服務註冊與發現、動態負載均衡功能,日常的開發學習中,如果你想弄懂公司的 Oceanus ,Nginx 知識肯定是必不可少的,我想這也是我在面試中被問及 Nginx 相關知識的原因。

  1. Nginx,使用最多最常見的,很多公司自己的負載均衡框架都是基於 Nginx 開發的。

  2. LVS

  3. HAProxy

  4. F5,硬件負載均衡,價格昂貴。

無論使用哪種方案,目的都是要解決同樣的問題,掌握其中一個框架的原理後,再看其它幾個一定不會覺得喫力,接下來就通過 Nginx 實例來學習。

NGINX-logo-rgb-large

NGINX-logo-rgb-large

1.Nginx 簡介

Nginx(發音同engine x)是異步框架的網頁服器,也可以用作反向代理負載平衡器HTTP緩存。該軟件由伊戈爾·賽索耶夫創建並於2004年首次公開發布。[6] 2011年成立同名公司以提供支持。[7]2019年3月11日,Nginx公司被F5 Networks以6.7億美元收購[8]

Nginx 官網:http://nginx.org/

下載列表:http://nginx.org/en/download.html

————維基百科

注意,http://nginx.org/ 區別於 http://nginx.com 前者是開源免費的,後者是企業版收費的,商業版支持帶外健康檢查。

選擇 Nginx 的理由

  1. 軟件成熟,2002年誕生到2019年,經過多年的沉澱和各大互聯網公司的實踐改進,Nginx 已經非常成熟,網上教程豐富,易於開發者維護。

  2. 高性能Web服務器,單機能夠支持高達 50,000 個併發連接數的響應。

  3. 異步的、非阻塞,使用了epoll和kqueue模型,壓縮請求和相應數據大小,節省寬帶。

  4. 優秀的反向代理服務器,隱藏 Server 地址,提高安全性。

  5. 支持 Http 緩存

只需要安裝 Nginx 配置好配置文件,就可以是實現 Https 訪問。

worker_processes 1;
events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on;

keepalive_timeout 65;

server {
    listen 443;
    server_name wangzha.tech www.wangzha.tech;
    ssl on;
    root html;
    index index.html index.htm;
    ssl_certificate   /www/server/nginx/conf/1631800_www.wangzha.tech.pem;
    ssl_certificate_key  /www/server/nginx/conf/1631800_www.wangzha.tech.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_pass          http://47.99.146.163:80;
        proxy_set_header    X-Real-IP $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    Host $http_host;
    }
}
  server {
      listen 80;
      server_name www.wangzha.tech;   
  }
}

2.Nginx 整體架構設計

nginx架構圖

nginx架構圖

Nginx架構圖 圖片來自 http://www.aosabook.org/en/nginx.html

主從模式

Nginx 啓動後會創建多個進程,一個 Master 進程和多個 Worker 進程,Master 進程主要負責讀取配置文件,管理維護多個 Worker 進程,像是一個大內總管,Master 自身不處理用戶請求,用戶訪問的 web service 都是通過多個 Worker 進程處理,Worker 纔是真正幹活的,這種 Master Worker的主從設計理念在 。Worker 的數量可以通過配置文件隨時調整,非常靈活。

Master 主要職責:

  1. 讀取 Nginx 配置文件,配置實時生效。

  2. 監控 worker 進程運行狀態,管理 worker 的創建與啓動,當 worker 進程出現異常情況,Master 會自動重新啓動 worker 進程。

  3. 接收用戶請求,將請求分發給 worker 處理。

而 worker 進程事從 Master 進程 fork 過來的,worker 進程只負責處理請求,從讀取請求,解析請求,處理請求,讀取到服務器返回的 response 數據後,再將數據轉發給客戶端。每個請求只會被一個 worker 進程處理。

異步非阻塞 I/O

I/O 分兩種,網絡 I/O,讀取 socket,另一種是磁盤 I/O,讀取磁盤數據。我們知道計算機的 CPU 執行代碼的速度極快,然而一旦遇到IO 操作,如讀寫文件、發送網絡數據時,就需要等待IO操作完成。這樣做CPU大部分都是在等待,等待蝸牛般速度的磁盤 IO 操作,這極大的浪費了 CPU 的性能,很顯然,這種設計是不合理的,如果一個進程想要執行一個 read() 或 write() 同步調用,那麼進程必須等到硬件完成 I/O 操作後才能進行下一步操作,這叫做同步調用。

Nginx 爲了提供併發能力,避開了這種同步阻塞的設計,採用異步,非阻塞,使用 epoll 多路複用模型,這是 Nginx 支持高併發的靈魂所在,如果讀者對 同步/異步 I/O 爲什麼會提高程序的響應速度不是很理解,推薦看 IBM 這篇文章:https://www.ibm.com/developerworks/cn/linux/l-async/ ,IO屬於基礎篇,在 Nginx 篇不做過多闡述了。

模塊化設計

關於模塊化設計可以簡單的理解一個功能就是一個模塊,類似於設計模式裏六大原則之一“單一職責原則”,這種設計的好處就是“高內聚,低耦合”,Nginx 採用模塊化設計繼承了這個特點,且用戶可以根據自己的需要選擇性安裝,具有高度的靈活性。

Nginx 共有五大類型的模塊:

  1. 核心模塊:提供最基本的核心服務,如進程管理,權限控制等。

  2. 事件模塊:Nginx 支持事件驅動的核心模塊。

  3. 標準 HTTP 模塊:提供 http 相關功能,如代理,轉發,壓縮,加密,負載均衡。

  4. Mail 服務模塊:提供基本的郵件發送服務,郵件服務模塊是 Nginx 的特色。

  5. 第三方模塊:支持豐富的第三方自定義模塊,

關於上述模塊如何配置使用不必全部記下來,工作中現學現賣就可以,活學活用,記住這些模塊的功能,用的時候再去查找文檔。

如知道了 Nginx 提供了郵件服務,百度 Google 一下“Nginx 如何配置郵件服務” 就會得到下面的配置:

mail {
	server_name mail.myweb.name;
	auth_http mail.postfix.cn:80/auth.php; #配置了HTTP認證地址
	imap_capabilities IMAP4rev1 UIDPLUS IDLE LITERAL+ QUOTA;
	pop3_auth plain apop cram-md5;
	pop3_capabilities LAST TOP USER PIPELINING UIDL;
	smtp_auth  login plain cram-md5;
	smtp_capabilities "SIZE 10485760" ENHANCESTATUSCODES 8BITMIME DSN;
	xclient off;
	server{
		listen 25;
		protocol smtp;
	}
	server{
		listen 110;
		protocol pop3;
		proxy_pass_error_message on;
	}
	server {
		listen 143;
		protocol imap;
	}
}

3.總結

本節主要介紹了 Nginx 的特性和架構模型,在大公司,如果你是一名開發人員,你可能不會直接接觸 Nginx 配置,會有專門的運維人員去做這件事,但是這不代表你可以不會,Nginx 的很多設計思想值得每個優秀的開發者學習,使用太廣泛,如果做二次開發,Nginx 可以說架構師必須掌握的基礎知識,面試經常會問 Nginx 如何實現高併發?你需要知道異步,非阻塞,epoll,需要知道 Master Worker 模型,Nginx常見的優化配置?爲什麼 Nginx 不使用多線程?

參考資料

  1. http://www.aosabook.org/en/nginx.html

  2. 《Nginx高性能web服務器詳解》

聯繫我

VX搜索【轉行程序員】回覆”加羣“,我會拉你進技術羣。講真的,在這個羣,哪怕您不說話,光看聊天記錄也是一種成長。阿里/騰訊/百度資深工程師、Google技術大神、IBM工程師、還有我王炸、各路大牛都在,有任何不明白的都進羣提問。

最後,覺得王炸到文章不錯就來個三連吧:關注 轉發 點贊

 

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