Nginx-负载均衡upstream
upstream
是在http
块下面的指令,跟server
块是同级的。
基本语法
upstream
的基本语法如下,一个upstream
块需要设置一个名称,这个名称可以在server
块里面的location
块中当作proxy
主机 (域名/ip) 使用,在upstream
块中可以设置多个服务器地址。
声明一个名称为node
的upstream
css
upstream node {
server 127.0.0.1:9001;
server 127.0.0.1:9002;
server 127.0.0.1:9003;
}
在location
中当作proxy
主机 (域名/ip) 使用 :
arduino
location / {
proxy_pass http://node;
}
1.默认状态是按照轮询的方式去做负载均衡的
就像上面的配置中,配置了三个服务器的地址,如果你向 localhost 发起了90 次请求。那么这90 次请求都会代理到名称为node
的upstream
设置的这三个服务器,并且请求的次数会平均分配给这三个服务器。也就是说每个服务器被请求的次数为30次。
示例:
127.0.0.1:9001
js
const express = require('express')
const app = express()
var num = 1
app.get('/api/test', (req, res) => {
console.log(req.ip)
res.send({
code: 200,
message: '访问成功!'
})
console.log('Nginx 9003 负载均衡 28', num)
num++
})
app.listen(9001, () => {
console.log('服务成功运行!')
})
127.0.0.1:9002
js
const express = require('express')
const app = express()
var num = 1
app.get('/api/test', (req, res) => {
console.log(req.ip)
res.send({
code: 200,
message: '访问成功!'
})
console.log('Nginx 9003 负载均衡 28', num)
num++
})
app.listen(9002, () => {
console.log('服务成功运行!')
})
127.0.0.1:9003
js
const express = require('express')
const app = express()
var num = 1
app.get('/api/test', (req, res) => {
console.log(req.ip)
res.send({
code: 200,
message: '访问成功!'
})
console.log('Nginx 9003 负载均衡 28', num)
num++
})
app.listen(9003, () => {
console.log('服务成功运行!')
})
然后使用postman 向服务器发送请求:
我们总共请求了90次,可以看到上面设置的三个服务器地址都被请求了30次,这就是负载均衡的默认轮询的方式。
这里补充一下:
http://101.200.242.117/api/test
这个地址是node服务器的接口的地址,当请求路径中出现/
,就会被代理分发到名称为node
的upstream
中设置的服务器地址。
使用postman
对接口进行压测(一键发送多次请求):
2.权重weight
upstream
中的 server
设置的权重越大的,接收的请求次数越多,设置的越小的接收的请求次数就越少。
ini
upstream node {
server 127.0.0.1:9001 weight=3;
server 127.0.0.1:9002 weight=2;
server 127.0.0.1:9003 weight=1;
}
效果:
我的理解是,我们依次为三个服务器地址分配了权重:3、2、1 ,那么总的权重就是6 ,然后我们总共的请求数量是90
次,那么就是把总的请求数量90
分成了6
份,那么一份就是15
,所以,权重为3
的服务器被请求了45
次,权重为2
的服务器被请求了30
次,权重为1
的服务器被请求了15
次。
3.fail_timeout、 backup
fail_timeout
:故障等待超时时间(等待多少秒后未请求成功)。
backup
:备用服务器修饰符,可以为一个upstream设置一个backup的server,在生产server全部都出问题之后,可以自动切换到备用server上,为回复服务争取时间。
ini
upstream node {
server 127.0.0.1:9001 fail_timeout=60;
server 127.0.0.1:9002 fail_timeout=30;
server 127.0.0.1:9003 backup;
}
上述配置表达的意思是:当请求第一个server
127.0.0.1:9001 的服务器的时间超过60
秒,就切换备用服务器(使用backup
修饰的服务器),当请求第二个server
127.0.0.1:9001 的服务器的时间超过30
秒,就切换备用服务器(使用backup
修饰的服务器)。
演示:
由于我们的所有请求都没有超时,所以没有请求备用服务器
。