文章目录
Nginx 高级篇
一、 负载均衡
1、 负载均衡概述
负载均衡(Load Balance),它在网络现有结构之上可以提供一种廉价、有效、透明的方法来扩展网络设备和服器的带宽,并可以在一定程度上增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性等。用官网说,它充当着网络流中“交通指挥官”的角色,“站在”服务器前处理所有服务器端和客户端之间的请求,从而最大度地提高响应速率和容量利用率,同时确保任何服务器都没有超负荷工作。如果单个服务器出现故障,负载均衡方法会将流量重定向到其余的集群服务器,以保证服务的稳定性。当新的服务器添加到服务器组后,也可通过负均衡的方法使其开始自动处理客户端发来的请求。
负载均衡的作用:
- 解决服务器高并发的压力,提高应用程序的处理性能
- 提供故障转移,实现高可用
- 通过添加或减少服务器数量,增强网站的可扩展性
- 在负载均衡器上进行过滤,可以提高系统的安全性
2、 处理方式
2.1 用户手动选择
这种方式比原始,主要实现的方式就是在网站主页上面提供不同线路、不同服务连接方式,让用户来选择自己访问的具体服务器,来实现负载均衡。
如,蓝奏云
2.2 DNS 轮询
DNS:域名系统服务协议是一种分布式网络目录服务,主要有用于域名与 IP 地址的相互转换
大多数域名注册商都支持对同一个主机名添加多条 A 记录,这就是 DNS 轮询,DNS 服务器将解析请求按照 A 记录的顺序,随机分配到不同的 IP 上,这样就能完成简单的负载均衡。DNS 轮询的成本非常低,在一些不重要的服务器,被经常使用。
使用 DNS 来实现轮询,不需要投入过多的成本,虽然 DNS 轮询成本低廉,但是 DNS 负载均衡存在明显的缺点:
-
可靠性低
各大宽带接入商会将众多的 DNS 存放在缓存中,以节省访问时间,导致 DNS 不会实时更新。
Windows 刷新 DNS 的命令:
ipconfig/flushdns
-
负载均衡不均衡
其会导致某几台服务器负荷很低,而另外几台服务器负荷很高,处理请求的速度慢,配置高的服务器分配到的请求少,而配置低的服务器分配到的请求多。
2.3 四 / 七层负载均衡
OSI,开放式系统互联模型,这个是有国际标准化 ISO 指定的一个不基于具体机型、操作系统或公式的网络体系结构。该模型将网络通信的工作分为七层。
- 四层负载均衡:OSI 七层模型中的传输层,主要是基于 IP + PORT 的负载均衡
- 七层负载均衡:在音乐层,主要是基于虚拟的 URL 或主机 IP 的负载均衡
3、 七层负载均衡
Nginx 要实现七层负载均衡需要用到 proxy_pass 代理模块配置。Nginx 默认安装支持这个模块,我们不需要再做任何处理。Nginx 的负载均衡是在 Nginx 的反向代理的基础上把用户的请求根据指定的算法分发到一组【upstream 虚拟服务池】
3.1 七层负载均衡指令
3.1.1 upstream
该指令是用来定义一组服务器,它们可以是监听不同端口的服务器,并且也可以是同时监听 TCP 和 Unix Socket 的服务器。服务器可以指定不同的权重,默认为 1。
语法 | 默认值 | 位置 |
---|---|---|
upstream name {…} | - | http |
3.1.2 server
该指令是用来指定后端服务器的名称和一些参数,可以使用域名、IP、端口或者 Unix Socket。
语法 | 默认值 | 位置 |
---|---|---|
server name [paramerters] | - | upstream |
3.2 实现流程
使用示例:
server {
listen 9001;
server_name localhost;
default_type text/html;
location / {
return 200 "port=9001";
}
}
server {
listen 9002;
server_name localhost;
default_type text/html;
location / {
return 200 "port=9002";
}
}
upstream backend {
server localhost:9001;
server localhost:9002;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend; # backend 为服务组的名称
}
}
3.3 负载均衡的状态
代理服务器在负责负载均衡调度中的状态有以下几个:
状态 | 描述 |
---|---|
down | 当前 server 暂时不参与负载均衡 |
backup | 预留的备份服务器 |
max_fails | 允许请求失败的次数 |
fail_timeout | 经过 max_fails 失败后,服务暂停时间 |
max_conns | 限制最大的接收数 |
3.3.1 down
将服务器标记为永久不可用,那么该服务器将不参与负载均衡
upstream backend {
server localhost:9001 down;
server localhost:9002;
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend; # backend 为服务组的名称
}
}
该状态一般会对需要停机维护的服务器进行设置。
3.3.2 backup
将该服务器标记为备份服务器,当主服务器不可用时,将用来传递请求。
upstream backend {
server localhost:9001 backup; # 备份服务器
server localhost:9002 down;
server localhost:9003; # 主服务器
}
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://backend; # backend 为服务组的名称
}
}
此时需要将 9003 端口的访问禁止调来模拟唯一能对外提供访问的服务宕机以后,backup 的备份服务器就要开始对外提供服务,此时为了测试验证,我们需要使用防火墙来进行拦截。
这时,我们需要使用 ufw 工具来对防火墙进行控制:
sudo apt install ufw # 安装 ufw
ufw enadble # 开启防火墙
ufw deny 9003/tcp # 关闭 9003 端口
ufw allow 9001:9002/tcp # 允许开启 9001 和 9002
ufw allow http # 开放http
这里我使用的是 ubuntu 系统
3.3.3 max_conns
max_conns=number:其用来设置代理服务器同时活动链接的最大数量,默认为 0 ,表示不限制,使用该配置可以根据后端服务器处理请求的并发量来进行设置,防止后端服务器被压垮。
3.3.4 max_fails & fail_timeout
max_fails=numbe