文章目录
Nginx负载均衡
1. 什么是负载均衡
- 负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性。
2. 为什么要用负载均衡
-
负载均衡的作用:
1.解决并发压力,提高应用处理性能(增加吞吐量,加强网络处理能力);
2.提供故障转移,实现高可用;
3.通过添加或减少服务器数量,提供网站伸缩性(扩展性);
4.安全防护;(负载均衡设备上做一些过滤,黑白名单等处理)
-
负载均衡的架构
通过代理将流量按照一定的比例,转发到后端。
3. 负载均衡的实现
3.1 反向代理
server {
listen 80;
server_name _;
location / {
proxy_pass http://[连接池];
}
}
3.2 IP连接池
- 将后端服务打包成一个IP连接池
upstream [连接池名称] {
server [ip]:[port];
server [ip]:[port];
server [ip]:[port];
}
3.3 事例
[root@lb01 conf.d]# vim game.conf
upstream supermarie {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://supermarie;
include /etc/nginx/proxy_params;
}
}
4. 负载均衡的比例
4.1 轮询
- 默认情况下,Nginx负载均衡的轮询状态。会依次循环访问每一个服务器
upstream supermarie {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
}
4.2 权重
- Nginx中权重0-100,数字越大,权重越高。weight=[0-100]
upstream supermarie {
server 172.16.1.7:80 weight=9;
server 172.16.1.8:80 weight=5;
server 172.16.1.9:80 weight=1;
}
4.3 ip_hash
- 指定一个IP固定访问某一个端口,通过客户端请求ip进行hash,再通过hash值选择后端server
- 还有个url_hash,通过请求url进行hash,再通过hash值选择后端server
upstream supermarie {
server 172.16.1.7:80;
server 172.16.1.8:80;
server 172.16.1.9:80;
ip_hash;
}
5. 负载均衡的后端状态
状态 | 概述 |
---|---|
down | 当前的server暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过max_fails失败后, 服务暂停时间 |
5.1 down
# 暂时不分配流量, 只会启动.8和.9两台服务器
upstream supermarie {
server 172.16.1.7:80 down;
server 172.16.1.8:80;
server 172.16.1.9:80;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://supermarie;
include /etc/nginx/proxy_params;
}
}
5.2 backup
# 只有当所有的机器全部宕机,才能启动。
upstream supermarie {
server 172.16.1.7:80 backup;
server 172.16.1.8:80;
server 172.16.1.9:80;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://supermarie;
include /etc/nginx/proxy_params;
}
}
5.3 max_fails、fail_timeout
# max_fails 指定最多失败次数, fail_timeout: 指定经过max_fails次失败后, 服务暂停时间
upstream supermarie {
server 172.16.1.7:80 max_fails=3 fail_timeout=3s;
server 172.16.1.8:80 max_fails=3 fail_timeout=3s;
server 172.16.1.9:80 max_fails=3 fail_timeout=3s;
}
server {
listen 80;
server_name _;
location / {
proxy_pass http://supermarie;
proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;
include /etc/nginx/proxy_params;
}
}
5.4 proxy_next_upstream 后端错误标识
参数 | 含义 |
---|---|
error | 与服务器建立连接,向其传递请求或读取响应头时发生错误 |
timeout | 在与服务器建立连接,向其传递请求或读取响应头时发生超时 |
invalid_header | 服务器返回空的或无效的响应 |
http_500 | 服务器返回代码为500的响应 |
http_502 | 服务器返回代码为502的响应 |
http_503 | 服务器返回代码为503的响应 |
http_504 | 服务器返回代码为504的响应 |
http_4043 | 服务器返回代码为403的响应 |
http_404 | 服务器返回代码为404的响应 |
http_429 | 服务器返回代码为429的响应(1.11.13) |
non_idempotent | 通常,请求与 非幂等 方法(POST,LOCK,PATCH)不传递到请求是否已被发送到上游服务器(1.9.13)的下一个服务器; 启用此选项显式允许重试此类请求 |
off | 禁用将请求传递给下一个服务器 |
6.七层负载与四层负载
- 前文内容均是基于七层负载均衡来实现
- 所谓四层即运输层,就是基于 IP + 端口的负载均衡;
- 七层即应用层,就是基于 URL 等应用层信息的负载均衡;能实现HTTP协议
在非HTTP协议的情况下,通常采用的四层负载均衡的方式负载服务。
- 注意:四层负载均衡中不支持域名。
案例: 使用四层负载均衡实现SSH的代理,端口为1122
[root@lb01 stream]# cat ssh.conf
server {
listen 1122;
proxy_pass 172.16.1.5:22;
}