ngnginx二进制包下载地址 :nginx: download
nginx功能模块帮助文档 :nginx documentation
nginx yum源配置地址: nginx: Linux packages
Nginx的特点包括 :
- 高性能 :Nginx使用异步非阻塞的事件驱动模型模型,可以同时处理大量的并发连接,而且在高负载和大流量情况下仍然能够保持良好的性能。
- 轻量级 :Nginx的代码量较少,占用的内存也较少,使其可以在资源受限的系统中运行,并且在高负载下也不易崩溃。
- 可扩展性 :Nginx支持众多的第三方模块,可以根据需要进行自定义开发,实现更多的功能。
- 高度可靠性 :Nginx是基于稳定的、成熟的事件驱动架构开发的,能够有效地避免因】代码错误或第三方库问题导致的崩溃,从而保证了服务的高可靠性。
- 热部署 :Nginx支持在不停止服务的情况下更新配置文件和软件升级,为用户提供了极大的便利。
在功能方面,Nginx具有 :
- HTTP代理与反向代理 :作为web服务器,Nginx最常用的功能之一是反向代理。它可以根据不同的正则匹配,采取不同的转发策略,并且能够对返回结果进行错误页跳转、异常判断等。如果被分发的服务器存在异常,Nginx可以将请求重新转发给另一台服务器。
- 负载均衡 :Nginx提供了多种负载均衡策略,如轮询、加权轮询和ip hash等,以优化请求的分配和处理方式,从而平均分配后端服务器的负载,提高系统的可用性和可靠性。
- Web缓存 :Nginx支持对不同的文件做不同的缓存处理。
Nginx 负载均衡模块
ngx_http_upstream_module:用于定义负载均衡策略和后端服务器组的模块。upstream
指令用于定义后端服务器组,这些服务器组会被Nginx用来进行负载均衡。
ngx_http_proxy_module:负责将客户端的请求转发到upstream
模块定义的后端服务器组。通过proxy_pass
指令,Nginx可以将请求发送到指定的服务器组,从而实现负载均衡。
1.upsteram 模块配置
第一台机器:负载均衡
# upstream 配置与http块下,和server块同级。
http {
upstream test {
server 192.168.137.30;
server 192.168.137.40;
}
server {
listen 80;
server_name 192.168.137.10;
location / {
proxy_pass http://test;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
}
其他两台机器:后台真实服务器
server{
listen 80;
server_name localhost;
location / {
root /test;
index t1.txt;
}
}
#
nginx -t
systemctl reload nginx
访问代理服务器
2.Nginx 均衡负载策略:
轮询(Round Robin):
默认的负载均衡策略。在这种策略下,每个请求会按时间顺序逐一分配到不同的后端服务器节点,确保每个节点平均处理请求。
优点:
- 简单高效:轮询策略实现起来相对简单,不需要复杂的算法支持,因此在处理请求时效率较高。
- 自动故障转移:如果某个后端服务器宕机或无法响应,Nginx能够自动检测到并将请求转发到其他健康的服务器上,这样可以提高系统的整体可用性。
- 均匀分配:在大多数情况下,轮询策略能够保证请求被均匀地分配到各个后端服务器上,从而提高了系统的吞吐量和资源的利用率。
缺点:
- 会话一致性问题:由于请求可能会被随机分配到不同的服务器上,这可能会导致同一个用户的连续请求落在不同服务器上,从而影响会话的一致性。
- 缺乏灵活性:轮询策略不会考虑后端服务器的实际处理能力,也不会根据请求的内容进行优化分配,这可能会导致某些服务器过载而其他服务器却处于空闲状态。
upstream test {
server 192.168.137.21:80;
server 192.168.137.22:80;
}
负载均衡状态配置参数:
down;
表示不在将用户的请求转发到此主机中:即下线虚拟机
backup;
预留的备份机器。当其他所有的非backup机器出现故障时,才会请求backup机器,因此这台机器的压力最轻。
max_fails
:表示允许的最大失败次数。当一个后端服务器在 fail_timeout
时间内连续失败这么多次后,Nginx 会将该服务器标记为不可用,不再向其转发请求。默认值为 1。
fail_timeout
:表示失败检查的时间间隔。在这个时间段内,如果一个后端服务器的失败次数达到了 max_fails
,那么 Nginx 会将其标记为不可用。默认值为 10s。
# down
http {
upstream test {
server 192.168.174.21 down;
server 192.168.174.22;
}
}
# backup;
http {
upstream test {
server 192.168.174.21 backup;
server 192.168.174.22;
}
}
# max_fails fail_timeout
http {
upstream test {
server 192.168.174.21 max_fails=3 fail_timeout=30s;
server 192.168.174.22 max_fails=3 fail_timeout=30s;
}
}
加权轮询(Weighted Round Robin):
根据服务器的性能为其分配权重,性能更好的服务器可以处理更多的请求。
优点:
- 性能优化:允许性能更强的服务器处理更多的请求,这样可以充分利用资源,提高整体的处理能力。
- 灵活性:可以根据实际情况调整服务器的权重,以适应不同的负载需求和服务器性能。
- 适应性:在服务器性能差异较大时,能够更好地平衡负载,避免某些服务器过载而其他服务器空闲的情况发生。
缺点:
- 压力集中:在系统启动初期,高权重的节点可能会承受较大的压力,导致机器负载突然增高,而其他机器则处于低负载状态,这可能会影响服务的平滑性。
- 复杂性:相比简单的轮询策略,加权轮询需要更多的配置和管理,增加了系统的复杂性。
- 会话一致性:尽管加权轮询考虑了服务器的性能,但仍然可能导致同一用户的请求被分配到不同服务器,影响会话一致性。
# weight:设置权重
http {
upstream test {
server 192.168.174.21 weight=2;
server 192.168.174.22 weight=1;
}
}
最少链接(Least Connections):
Nginx会将新请求分配给当前连接数最少的服务器,这样可以保证服务器间的负载更加均衡。
优点:
- 提高服务器利用率:在高负载情况下,将请求转发给当前连接数较少的后端服务器,可以更有效地利用服务器资源,避免某些服务器过载。
- 适应性强:适用于处理时间不确定或服务器性能差异较大的环境,能够根据实际情况动态调整请求分配,提高整体的处理能力和效率。
- 减少响应时间:通过将请求分配给当前连接数较少的服务器,可以减少用户的等待时间,提高服务的响应速度。
缺点:
- 可能导致空闲:在某些情况下,如果某个服务器的处理能力非常强,可能会导致其他服务器长期处于空闲状态,从而影响其性能和稳定性。
- 可能不公平:如果服务器的处理能力不同,仅仅根据连接数来分配请求可能会导致某些服务器承担更多的负载,而其他服务器则相对较少,这在一定程度上违背了负载均衡的公平性原则。
http {
upstream test{
least_conn;
server 192.168.137.21;
server 192.168.137.22;
}
}
IP Hash:
根据客户端IP地址的哈希值来选择服务器,这样可以确保同一用户的请求总是被发送到同一台服务器,有助于实现会话保持。
优点:
- 会话保持:根据客户端IP的哈希值来分配请求,确保来自同一IP的请求被发送到相同的后端服务器。这有助于维持客户端与服务器之间的会话状态,特别是对于需要保持登录状态或其他会话信息的应用来说非常重要。
- 减少响应时间:由于同一用户的请求被定向到同一台服务器,可以减少因服务器间会话恢复而产生的延迟,提高应用的响应速度。
缺点:
- 无法处理高并发:当某个客户端的请求量异常增加时,可能会导致该客户端对应的后端服务器负载过高,而其他服务器却处于相对空闲的状态。
# ip_hash; 声明IP Hash
http {
upstream test {
ip_hash;
server 192.168.174.21;
server 192.168.174.22;
}
}
URL Hash:
优点:
- 会话保持:确保相同URL的请求始终被分配到同一台后端服务器,有助于保持会话的一致性,特别适用于需要维护用户登录状态等场景。
- 提高效率:由于相同URL的请求被定向到同一服务器,这可以减少服务器间状态复制的需要,提高缓存效率,尤其适用于后端服务器使用缓存的场景。
缺点:
- 服务器动态变化敏感:如果后端服务器列表发生变化(如增加或减少服务器),可能会导致哈希结果的变化,进而影响到之前已经分配的服务器,这需要在使用中特别注意。
# hash $request_uri; 声明URL Hash
http {
upstream test {
hash $request_uri;
server 192.168.174.21;
server 192.168.174.22;
}
}
Fair:
根据后端服务器的响应时间进行动态分配请求,实现更合理的负载均衡。nginx本身不支持fair,需要独立安装upstream_fair模块
优点:
- 动态调整:Fair策略能够动态地根据服务器的实际处理能力来分配请求,这样可以更合理地利用服务器资源,提高整体的处理效率。
- 适应性强:对于那些处理能力不一或处理时间不确定的服务器集群,Fair策略能够更好地平衡负载,避免某些服务器过载而其他服务器空闲的情况发生。
缺点:
- 对突发流量敏感:由于Fair策略是根据服务器当前的响应时间来分配请求,因此对于突发流量的处理可能不够迅速,需要一段时间来调整分配策略。
- 可能引起资源分配不均:在服务器性能差异较大的情况下,Fair策略可能会导致性能较好的服务器承担更多的请求,而性能较差的服务器则可能处于较为空闲的状态。
# fair; 声明fair
http {
upstream test {
fair;
server 192.168.174.21;
server 192.168.174.21;
}
}
参考链接:GitHub - gnosek/nginx-upstream-fair: The fair load balancer module for nginx