Nginx系列:負載均衡
及閱讀文本大概需要3分鐘。
0x01:負載均衡
? ? ? Nginx的負載均衡使用upstream定義服務(wù)器組,后面跟著組名,組名后面是大括號包起來的服務(wù)器列表,每個服務(wù)器使用server開頭,后面跟定義的服務(wù)器名字、服務(wù)器ip:port、參數(shù);一個基本的upstream模塊如下:
upstream?[服務(wù)器組名稱]{
server?[IP地址]:[端口號];
server?[IP地址]:[端口號];
....
}
在upstream模塊定義完成后,要讓指定的訪問反向代理到服務(wù)器列表,格式如下:
location?~?.*$?{
index?index.jsp?index.html;
proxy_pass?http://[服務(wù)器組名稱];
}
0x02:SpringBoot項目準備
在進行Nginx負載均衡配置前,先搭建一個簡單的后端應(yīng)用項目:nginx-upstream
pom.xml文文件
<project?xmlns="http://maven.apache.org/POM/4.0.0"?xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0?http://maven.apache.org/xsd/maven-4.0.0.xsd">
????<modelVersion>4.0.0modelVersion>
????<groupId>com.sentinelgroupId>
????<artifactId>nginx-upstreamartifactId>
????<version>0.0.1-SNAPSHOTversion>
????<packaging>jarpackaging>
????<parent>
????????<groupId>org.springframework.bootgroupId>
????????<artifactId>spring-boot-starter-parentartifactId>
????????<version>2.1.3.RELEASEversion>
????????<relativePath/>?
????parent>
????<name>nginx-upstreamname>
????<url>http://maven.apache.orgurl>
????<properties>
????????<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
????????<java.version>1.8java.version>
????properties>
????<dependencies>
????????<dependency>
????????????<groupId>org.springframework.bootgroupId>
????????????<artifactId>spring-boot-starter-webartifactId>
????????dependency>
????dependencies>
????<dependencyManagement>
????????<dependencies>
????????????<dependency>
????????????????<groupId>org.springframework.cloudgroupId>
????????????????<artifactId>spring-cloud-dependenciesartifactId>
????????????????<version>Greenwich.SR3version>
????????????????<type>pomtype>
????????????????<scope>importscope>
????????????dependency>
????????dependencies>
????dependencyManagement>
project>
控制器controller
application.yml配置文件
server:
??port:?8866
#??port:?8867
spring:
??application:
????name:?nginx-upstream
SpringBoot啟動類
package?com.olive;
import?org.springframework.boot.SpringApplication;
import?org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public?class?Application?{
????public?static?void?main(String[]?args)?{
????????SpringApplication.run(Application.class,?args);
????}
}
因為只有一臺電腦,為了演示Nginx負載均衡,后文會通過修改application.yml配置文件的端口和控制器controller的返回值來標識不同的應(yīng)用服務(wù)器。
驗證項目是否搭建成功
http://127.0.0.1:8866/getUser

http://127.0.0.1:8867/getUser

0x03:配置負載均衡
以下命令均在root用戶下操作
進入Nginx的配置文件目錄
cd?/usr/local/nginx/conf/
增加upstream模塊配置
upstream?myserver?{
?????server?192.168.56.1:8866;
?????server?192.168.56.1:8867;
}注意在http模塊添加upstream

upstream可以有多個,名稱不同即可。
配置location轉(zhuǎn)發(fā)規(guī)則
location?/?{???#首頁負載之后端服務(wù)器
?????proxy_pass??http://myserver;??#通過upstrean定義的服務(wù)器組名調(diào)用后端服務(wù)器
?????proxy_set_header?X-Real-IP?$remote_addr;??#傳遞客戶端的ip地址
}
配置完成后可以使用如下命令啟動Nginx
/usr/local/nginx/sbin/nginx?-c???\
/usr/local/nginx/conf/nginx.conf
0x04:驗證
使用命令ifconfig查下CentOS系統(tǒng)的ip地址

從上圖可以看出CentOS和Windows的ip地址分別為
192.168.56.9??#CentOS
192.168.56.1? #Windows
訪問http://192.168.56.9/getUser

返回出現(xiàn)的結(jié)果是隨意的,有可能訪問192.168.56.1:8866,可有可能192.168.56.1:8867。
0x05: 知識擴展
這樣就完成了最基本的負載均衡,但是這并不能滿足實際需求。目前Nginx的upstream模塊支持6種方式的負載均衡策略(算法):輪詢(默認方式)、weight(權(quán)重方式)、ip_hash(依據(jù)ip分配方式)、least_conn(最少連接方式)、fair(第三方提供的響應(yīng)時間方式)、url_hash(第三方通過的依據(jù)URL分配方式)。
1)輪詢
最基本的配置方法,是upstream模塊默認的負載均衡策略。每個請求會按時間順序平均分配到不同的后端服務(wù)器。有如下參數(shù):
fail_timeout: 與max_fails結(jié)合使用
max_fails: 在fail_timeout參數(shù)設(shè)置的時間內(nèi)最大失敗次數(shù)。如果在這個時間內(nèi),所有該服務(wù)器的請求都失敗了,那么認為該服務(wù)器停機
fail_time: 服務(wù)器被認為停機的時長,默認10s(被認為停機的服務(wù)器嘗試間隔?)
backup: 標記該服務(wù)器為備用服務(wù)器。當主服務(wù)器停止時,請求會被發(fā)送到它這里
down: 標記服務(wù)器永久停機
注意:
down標記的服務(wù)器會自動剔除;
缺省就是輪詢;
此策略適合服務(wù)器配置無狀態(tài)且短平塊的服務(wù)使用
2)weight
? ? 權(quán)重方式,在輪詢策略的基礎(chǔ)上指定輪詢的幾率。也可以認為是在輪詢的基礎(chǔ)上新增了一個weight的參數(shù),此參數(shù)指定輪詢的幾率,值為number。upstream模塊配置模板如下:
upstream?[服務(wù)器組名稱]{
server?[IP地址]:[端口號]?weight=2;
server?[IP地址]:[端口號];
....
}
? ? ? ?在該例子中,沒有weight參數(shù)的服務(wù)器默認為1,weight的數(shù)值與訪問比例成正比,所有weight值的總和為一個循環(huán)單位,服務(wù)器自身的weight值為循環(huán)單位內(nèi)的輪詢次數(shù)。
注意:
權(quán)重越高分配到的請求越多;
此策略可以和least_conn策略、iphash策略結(jié)合使用;
此策略比較適合服務(wù)器硬件配置差距較大的情況。
3)ip_hash
依據(jù)ip分配方式,指定負載均衡器按照基于客戶端IP的分配方式,這個方法確保了相同的客戶端請求一致發(fā)送到相同的服務(wù)器,以保證session會話。這樣每個訪客都固定訪問一個后端服務(wù)器,可以解決session不能跨服務(wù)器的問題。upstream模塊配置模板如下:
upstream?[服務(wù)器組名稱]{
ip_hash;
server?[IP地址]:[端口號]?weight=2;
server?[IP地址]:[端口號];
....
}注意:
nginx1.3.1之前的版本不能在ip_hash中使用權(quán)重(weight);
ip_hash不能與backup同時使用;
此策略適合有狀態(tài)服務(wù)的程序,比如session;
當有服務(wù)器需要剔除,必須手動down掉。
4)least_conn
最少連接方式,把請求發(fā)給鏈接數(shù)最少的后端服務(wù)器。輪詢是把請求平均分配給各個后端,使它們的負載大致相同。但是,有些請求占用的時間很長,會導(dǎo)致其所在的后端負載較高。這種情況下,least_conn這種方式就可以達到更好的負載均衡效果。upstream模塊配置模板如下:
upstream?[服務(wù)器組名稱]{
least_conn;
server?[IP地址]:[端口號]?weight=2;
server?[IP地址]:[端口號];
....
}注意:
此策略適合請求處理時間長短不一造成的服務(wù)器過載情況;
5)fair
響應(yīng)時間方式,按照服務(wù)器端的響應(yīng)時間來分配請求,響應(yīng)時間短的優(yōu)先分配。upstream模塊配置模板如下:
upstream?[服務(wù)器組名稱]{
server?[IP地址]:[端口號]?weight=2;
server?[IP地址]:[端口號];
....
fair;
}
注意:
需要安裝第三方插件';
6)url_hash
url分配方式,按訪問url的hash結(jié)果來分配請求,使每個url定向到同一個后端服務(wù)器,要配合緩存命中來使用。同一個資源多次請求可能會到達不同的服務(wù)器上,導(dǎo)致不必要的多次下載,緩存命中率不高,以及一些資源時間的浪費。而使用url_hash,可以使得同一個url(也就是同一個資源請求)會到達同一臺服務(wù)器,一旦緩存住了資源,再次收到請求,就可以在緩存中讀取。upstream模塊配置模板如下:
upstream?[服務(wù)器組名稱]{
hash?$request_uri;
server?[IP地址]:[端口號]?weight=2;
server?[IP地址]:[端口號];
....
}
注意:
需要安裝第三方插件;
uri,是i,不是小寫的L。
這兩位小伙伴把郵寄地址及書名發(fā)一下:

☆
往期精彩
☆
02?Nacos源碼編譯
關(guān)注我
每天進步一點點
