天天看點

三廢的日常——Nginx實作負載均衡

作者:BOS三賤客

第二天。。小廢給大廢買了杯奶茶。。

大廢:這才差不多,講了這麼多早就應該給我奶茶了,吧唧吧唧。。

大廢:那今天就來講講Nginx是如何實作負載均衡吧。

二廢:這個我知道,我看過Nginx的配置,nginx通過upstream下的配置,對配置的伺服器進行負載均衡,具體配置如下*。

http {
  listen 80;
  server_name localhost;
  
  upstream webservers {  
    ip_hash;  
    server 192.168.0.1:8080;  
    server 192.168.0.2:8080; 
  }
...
}           

其中,listen是通路nginx的端口,server_name是通路路徑,這裡預設是 localhost,端口預設是80。server是兩台應用伺服器,由Nginx通過負載均衡政策來選擇通路應用伺服器,做到了應用負載。

三廢的日常——Nginx實作負載均衡

大廢:二廢看來昨天偷偷做功課了呀。這樣的架構設計看起來是可以支撐業務的快速增長,但所有的通路都會直接請求伺服器,這顯然是不太安全,是以一般也會在軟負載均衡後面,增加一個網關。這樣所有流量經過Server時都要先去網關進行鑒權,除了鑒權外,網關還可以起到協定轉換、流量控制等功能。

三廢的日常——Nginx實作負載均衡

小廢:我看書上介紹Nginx還可以對靜态資源進行處理,這是怎麼做到的呀

大廢:沒錯,如果應用伺服器有一些靜态資源,後端伺服器每次都要從磁盤加載檔案會比較影響性能,而Nginx的proxy cache功能能夠提升對靜态資源的處理能力。

location /static/images/ {
  root /home/www/;
  charset utf-8;
}           

注:實際上靜态資源在伺服器上的位置為:/home/www/static/images/hello.png

這樣配置後,如此通路便可以通路到對應的靜态資源 http://localhost:8080/static/images/hello.png 此時Nginx作為了一台靜态資源伺服器。

location /static/images/ {
  alias /home/www;
  charset utf-8;
}           

注:這樣通路的伺服器上的位置為:/home/www/hello.png

小廢:這樣是不是就做到了動靜分離。那Nginx如何保證高可用呢?

大廢:由于Nginx在上面整個架構中作為流量的入口,如果Nginx不能正常工作或伺服器當機,将導緻整個服務不可用。是以可以通過keepalived的機制來保證Nginx雙活。

大廢:架構一定要根據實際業務來設計,脫離業務的設計是沒有意義的,對于業務量不大的系統,用Nginx作為負載均衡是完全夠用的。當然,對于大型網際網路企業則需要調整一些設計,比如靜态資源應該部署在CDN上, CDN 會自動選擇離使用者最近的節點傳回給使用者,同時,流量很大時可以選擇DNS負載均衡解析域名,大概如下圖。

三廢的日常——Nginx實作負載均衡

總結:

輪詢政策配置:

在配置檔案upstream中,ip_hash是指定負載均衡器按照基于用戶端IP的配置設定方式,這個方法確定了相同的用戶端的請求一直發送到相同的伺服器,可以解決session不能跨伺服器的問題。同時,還有以下其他幾種輪詢政策,依次介紹如下。

  1. 輪詢,預設政策,不需要加任何配置,是upstream子產品預設的負載均衡政策,會将每個請求順序分發到不同的後端伺服器上。
  2. 權重(weight):指定輪詢的通路權重,用于後端伺服器性能不均時的政策。
  3. upstream webservers {

    server 192.168.0.1:8080 weight=7;

    server 192.168.0.2:8080 weight=3;

    }

  4. ip_hash(依據ip配置設定):指定負載均衡器按照基于用戶端IP的配置設定方式,這個方法確定了相同的用戶端的請求一直發送到相同的伺服器,可以解決session不能跨伺服器的問題。
  5. least_conn(最少連接配接):将請求轉發給連接配接數較少的伺服器。
upstream webservers {  
  least_conn;  
  server 192.168.0.1:8080 weight=7;  
  server 192.168.0.2:8080 weight=3;
}           

6. fair:按照伺服器端的響應時間來配置設定請求,響應時間短的優先配置設定。

upstream webservers {  
  fair;  
  server 192.168.0.1:8080 weight=7;  
  server 192.168.0.2:8080 weight=3;
}           

繼續閱讀