第二天。。小廢給大廢買了杯奶茶。。
大廢:這才差不多,講了這麼多早就應該給我奶茶了,吧唧吧唧。。
大廢:那今天就來講講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通過負載均衡政策來選擇通路應用伺服器,做到了應用負載。
大廢:二廢看來昨天偷偷做功課了呀。這樣的架構設計看起來是可以支撐業務的快速增長,但所有的通路都會直接請求伺服器,這顯然是不太安全,是以一般也會在軟負載均衡後面,增加一個網關。這樣所有流量經過Server時都要先去網關進行鑒權,除了鑒權外,網關還可以起到協定轉換、流量控制等功能。
小廢:我看書上介紹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負載均衡解析域名,大概如下圖。
總結:
輪詢政策配置:
在配置檔案upstream中,ip_hash是指定負載均衡器按照基于用戶端IP的配置設定方式,這個方法確定了相同的用戶端的請求一直發送到相同的伺服器,可以解決session不能跨伺服器的問題。同時,還有以下其他幾種輪詢政策,依次介紹如下。
- 輪詢,預設政策,不需要加任何配置,是upstream子產品預設的負載均衡政策,會将每個請求順序分發到不同的後端伺服器上。
- 權重(weight):指定輪詢的通路權重,用于後端伺服器性能不均時的政策。
-
upstream webservers {
server 192.168.0.1:8080 weight=7;
server 192.168.0.2:8080 weight=3;
}
- ip_hash(依據ip配置設定):指定負載均衡器按照基于用戶端IP的配置設定方式,這個方法確定了相同的用戶端的請求一直發送到相同的伺服器,可以解決session不能跨伺服器的問題。
- 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;
}