nginx負(fù)載均衡
負(fù)載均衡建立在現(xiàn)有網(wǎng)絡(luò)結(jié)構(gòu)之上,提供了一種廉價(jià)有效透明的方法擴(kuò)展網(wǎng)絡(luò)設(shè)備和服務(wù)器的帶寬,增加吞吐量、加強(qiáng)網(wǎng)絡(luò)數(shù)據(jù)處理能力、提高網(wǎng)絡(luò)的靈活性和可用性。
隨著網(wǎng)站的發(fā)展,服務(wù)器壓力越來(lái)越大,我們可能首先會(huì)將數(shù)據(jù)庫(kù),靜態(tài)文件分離出去。但是隨著發(fā)展,單獨(dú)業(yè)務(wù)API的請(qǐng)求的壓力也會(huì)變得很大,這時(shí)候我們可能需要做負(fù)載均衡將一臺(tái)服務(wù)器面臨的壓力分散到多臺(tái)服務(wù)器上。
nginx 不僅可以作為強(qiáng)大的web服務(wù)器,也可以作為反向代理服務(wù)器,而且nginx還可以按照調(diào)度規(guī)則實(shí)現(xiàn)動(dòng)靜分離,還可以對(duì)后端的服務(wù)器做負(fù)載均衡。
nginx負(fù)載均衡配置
nginx的負(fù)載均衡主要是對(duì)proxy_pass和upstream的配置。
我們首先需要建立一個(gè)Spring Boot的項(xiàng)目對(duì)外提供服務(wù),來(lái)模擬我們實(shí)際的服務(wù),還可以配置其它可以提供網(wǎng)絡(luò)請(qǐng)求處理的框架來(lái)提供服務(wù),這里具體由什么來(lái)提供服務(wù)和nginx配置并不相關(guān)。
Spring Boot 項(xiàng)目建立的過(guò)程就不提了,這里只貼一下主要的代碼:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SpringBootApplication
public class NginxtestApplication {
@Value("${server.port:}")
private String port;
public static void main(String[] args) {
SpringApplication.run(NginxtestApplication.class, args);
}
@GetMapping("")
public String hello() {
System.out.println("call me " + port);
return "i am " + port;
}
}
將項(xiàng)目打包后,我們執(zhí)行下面的命令
java -jar test.jar --server.port=8001
java -jar test.jar --server.port=8002
接下來(lái)我們打開(kāi)nginx的配置文件
http {
upstream upstream_name{
server 192.168.0.28:8001;
server 192.168.0.28:8002;
}
server {
listen 8080;
server_name localhost;
location / {
proxy_pass http://upstream_name;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
我這里沒(méi)有把默認(rèn)的一些配置貼出來(lái)。
首先,在http下添加?upstream upstream_name {}
?來(lái)配置要映射的服務(wù)器。
其中的upstream_name
大家可以指定為服務(wù)的域名或者項(xiàng)目的代號(hào)。
server下的location 我們將?/
?下的全部請(qǐng)求轉(zhuǎn)發(fā)到?http://upstream_name
?,也就是我們上面配置的服務(wù)器列表中的某一臺(tái)服務(wù)器上。具體是哪臺(tái)服務(wù)器,nginx會(huì)根據(jù)配置的調(diào)度算法來(lái)確認(rèn)。
我們?cè)跒g覽器中打開(kāi)localhost:8080
。多刷新幾次就可以看到頁(yè)面上的內(nèi)容發(fā)生了變化。
?
nginx負(fù)載均衡策略
nginx的負(fù)載均衡策略有4種:
輪詢(默認(rèn))
最基本的配置方法,它是upstream的默認(rèn)策略,每個(gè)請(qǐng)求會(huì)按時(shí)間順序逐一分配到不同的后端服務(wù)器。
參數(shù)有:
參數(shù) | 描述 |
---|---|
fail_timeout | 與max_fails結(jié)合使用 |
max_fails | 設(shè)置在fail_timeout參數(shù)設(shè)置的時(shí)間內(nèi)最大失敗次數(shù),如果在這個(gè)時(shí)間內(nèi),所有針對(duì)該服務(wù)器的請(qǐng)求都失敗了,那么認(rèn)為該服務(wù)器會(huì)被認(rèn)為是停機(jī)了 |
fail_time | 服務(wù)器會(huì)被認(rèn)為停機(jī)的時(shí)間長(zhǎng)度,默認(rèn)為10s。 |
backup | 標(biāo)記該服務(wù)器為備用服務(wù)器。當(dāng)主服務(wù)器停止時(shí),請(qǐng)求會(huì)被發(fā)送到它這里。 |
down | 標(biāo)記服務(wù)器永久停機(jī)了。 |
注意:
- 在輪詢中,如果服務(wù)器down掉了,會(huì)自動(dòng)剔除該服務(wù)器。
- 缺省配置就是輪詢策略。
- 此策略適合服務(wù)器配置相當(dāng),無(wú)狀態(tài)且短平快的服務(wù)使用。
權(quán)重
在輪詢策略的基礎(chǔ)上制定淪陷的幾率。例如
upstream foo {
server localhost:8001 weight=2;
server localhost:8002;
server localhost:8003 backup;
server localhost:8004 max_fails=3 fail_timeout=20s;
}
這里例子中,weight參數(shù)用于制定輪詢的幾率,weight默認(rèn)值為1;weight的數(shù)值和被訪問(wèn)的幾率成正比。
注意:
- 權(quán)重越高分配到需要處理的請(qǐng)求越多。
- 此策略可以與least_conn和ip_hash結(jié)合使用。
- 此策略比較適合服務(wù)器的硬件配置差別比較大的情況。
ip_hash
負(fù)載均衡器按照客戶端IP地址的分配方式,可以確保相同客戶端的請(qǐng)求一直發(fā)送到相同的服務(wù)器。這樣每個(gè)訪客都固定訪問(wèn)一個(gè)后端服務(wù)器。
upstream foo {
ip_hash;
server localhost:8001 weight=2;
server localhost:8002;
server localhost:8003;
server localhost:8004 max_fails=3 fail_timeout=20s;
}
注意:
- 在nginx版本1.3.1之前,不能在ip_hash中使用權(quán)重(weight)。
- ip_hash不能與backup同時(shí)使用。
- 此策略適合有狀態(tài)服務(wù),比如session。
- 當(dāng)有服務(wù)器需要剔除,必須手動(dòng)down掉。
least_conn 最小連接
把請(qǐng)求轉(zhuǎn)發(fā)給連接數(shù)較少的后端服務(wù)器。輪詢算法是把請(qǐng)求平均的轉(zhuǎn)發(fā)給各個(gè)后端,使它們的負(fù)載大致相同;但是,有些請(qǐng)求占用的時(shí)間很長(zhǎng),會(huì)導(dǎo)致其所在的后端負(fù)載較高。這種情況下,least_conn這種方式就可以達(dá)到更好的負(fù)載均衡效果
upstream foo {
least_conn;
server localhost:8001 weight=2;
server localhost:8002;
server localhost:8003 backup;
server localhost:8004 max_fails=3 fail_timeout=20s;
}
注意:
- 此負(fù)載均衡策略適合請(qǐng)求處理時(shí)間長(zhǎng)短不一造成服務(wù)器過(guò)載的情況。
除了上面這些調(diào)度策略之后,還有一些第三方的調(diào)度策略可以集成到nginx中。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-564005.html
在實(shí)際運(yùn)用中,需要根據(jù)不同的場(chǎng)景選擇不同的策略,大多是多種策略結(jié)合使用以達(dá)到實(shí)際需求的性能。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-564005.html
到了這里,關(guān)于微服務(wù)系列文章之 nginx負(fù)載均衡的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!