nginx负载均衡概念
集群
集群介绍
简而言之,集群就是指一组相互独立的计算机,利用高速通信网络组成的一个较大的计算机服务系统,每个集群节点都是运行各自服务的独立服务器。这些服务器之间可以相互通信,协同向用户提供应用程序、系统资源和数据,并以单一系统的模式加以管理。当用户请求集群系统时,集群对用户来说就是一个单一独立的服务器。
集群特点
- 高性能(Performance):集群的高性能只有在并发或总请求数量超过单台服务器的承受能力时,服务器集群才会体现出优势;
- 价格有效性(Cost-effectiveness):在达到同样性能需求条件下,采用计算机集群架构比采用同等运算能力的大型计算机具有更高的性价比;
- 可伸缩性(Scalability):当服务负载、压力增长时,针对集群系统进行简单的扩展即可满足需求,且不会降低服务质量;
- 高可用性(Availability):在集群中,即使部分硬件或软件发生故障,但整个系统的服务仍可以保证7x24h可用;
- 透明性(Transparency):多个独立计算机组成的松耦合集群系统构成的一个虚拟服务器,用户访问集群系统时就像访问一台高性能高可用的服务器一样,集群中一部分服务器的上线、下线不会中断整个系统服务,对用户都是透明的;
- 可管理性(Manageability):整个系统可能在物理上很大范围,但是管理起来就像管理一个系统一样。在理想状况下,软硬件模块的插入能做到即插即用;
- 可编程性(Programmability):在集群系统上,容易开发及修改各类应用程序。
集群分类
集群常见分类可以分为:
- 负载均衡集群(Load balancing clusters),简称LBC或者LB:负载均衡集群可以把很多用户集中的访问请求负载压力尽可能平均的分摊在计算机集群中处理。客户访问请求负载通常包括应用程序处理负载和网络流量负载,负载均衡集群的每个节点都可以承担一定的访问请求负载压力,并实现负载请求在各节点之间的动态分配,以实现负载均衡。
- 高可用性集群(High-availability(HA)clusters),简称HAC:一般指的是集群中任意一个节点失效的情况下,该节点上的所有任务会自动转移到其他正常的节点上。高可用性集群的主要目的是使集群的整体服务尽可能可用,使得服务器系统的运行速度和响应速度尽可能的快。它们经常利用在多台机器上运行的冗余节点和服务来相互追踪。常用于不易于实现负载均衡的应用,如负载均衡器、主数据库、主存储对之间。
- 高性能计算集群(High-performance(HP)clusters),简称HPC:高性能计算集群也称为并行计算,高性能计算集群对外就像是一个超级计算机,内部由数十至上万个独立服务器组成,并且在公共消息传递层上进行通信并运行并行应用程序。
负载均衡集群
负载均衡服务需求
负载均衡(Load Balance)集群提供了一种廉价、有效、透明的方式来扩展网络设备和服务器的负载、带宽和吞吐量,同时加强了网络数据处理能力,提高了网络的灵活性和可用性。在负载均衡集群中,同组集群的所有计算机节点都应该提供相同的服务。搭建负载均衡服务的需求如下:
- 将单台计算机无法承受的大规模并发访问或数据流量分担到多台结点设备分别进行处理,减少用户等待响应时间,提升用户体验;
- 单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总返回给用户,系统处理能力得到大幅提高;
- 7 x 24h服务保证,任意一个或多个有限节点设备宕机,不影响业务的正常运行。
nginx负载均衡服务
严格来说,nginx仅作为nginx proxy反向代理使用,但该反向代理功能表现的效果是负载均衡集群的效果,因此称之为nginx负载均衡。
反向代理和负载均衡的区别:
- 负载均衡软件(如LVS)实现的功能只是对请求数据包的转发/改写、传递,其中DR模式明显的特征是从负载均衡下面的节点服务器来看,收到的请求还是来自访问负载均衡器的客户端的真实用户;
- 反向代理在接受访问用户的请求后,会代理用户重新发起请求代理下的节点服务器,最后把数据返回给客户端用户,在节点服务器看来,访问节点服务器的客户端用户就是反向代理服务器,而不是真实的客户端用户。
实现nginx负载均衡主要需要两个组件模块:
- ngx_http_proxy_module:proxy代理模块,用于将请求抛给服务器节点或upstream服务器池;
- ngx_http_upstream_module:负载均衡模块,可以实现网站的负载均衡功能以及节点的健康检查。
nginx负载均衡准备
硬件准备
主机名 | 内网IP | 外网IP | 说明 |
---|
lb01 | 10.0.0.5 | 172.16.1.5 | Nginx主负载均衡器 | lb02 | 10.0.0.6 | 172.16.1.6 | Nginx辅负载均衡器 | web01 | 10.0.0.7 | 172.16.1.7 | Web01服务器 | web02 | 10.0.0.8 | 172.16.1.8 | Web02服务器 |
软件准备
- 系统:CentOS 7
- 软件:nginx/1.20.1
Web集群部署
注意:集群中每台服务器的配置一模一样
企业部署步骤:
- 先部署好一台LNMP服务器,上传代码信息;
- 访问测试;
- 批量部署多台Web服务器;
- 将Nginx配置文件进行分发;
- 将站点目录进行分发。
nginx负载均衡部署
部署过程
-
安装部署nginx软件 [root@lb01 ~]
[root@lb01 yum.repos.d]
-
编写nginx负载服务配置文件 [root@lb01 ~]
[root@lb01 nginx]
[root@lb01 nginx]
[root@lb01 nginx]
[root@lb01 conf.d]
default.conf
[root@lb01 conf.d]
[root@lb01 conf.d]
default.conf lb.conf
[root@lb01 conf.d]
upstream hello {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
server {
listen 80;
server_name blog.hello.com;
location / {
proxy_pass http://hello;
}
}
-
实现功能测试 搭建集群测试环境 [root@web01 ~]
Linux hosts解析文件 10.0.0.7 www.hello.com blog.hello.com bbs.hello.com
Windows hosts解析文件 10.0.0.5 www.hello.com bbs.hello.com blog.hello.com
Windows浏览器输入www.hello.com/test.html并刷新测试:客户端首先通过DNS解析访问10.0.0.5负载均衡服务器,而后负载均衡服务器作为客户端访问配置文件中的集群中的服务器10.0.0.7和10.0.0.8。
排错思路
-
负载均衡服务器上, 测试后端web节点服务器是否能够正常访问(负载均衡服务器到Web服务器访问阶段有无问题). [root@lb01 ~]
www 172.16.1.7
[root@lb01 ~]
www 172.16.1.8
-
负载均衡服务器上, 利用curl命令访问负载均衡服务器. [root@lb01 ~]
www 172.16.1.7
[root@lb01 ~]
www 172.16.1.8
如果负载均衡服务器有问题,检查主配置文件/etc/nginx/nginx.conf和负载均衡文件/etc/nginx/conf.d/lb.conf。 -
打开xshell连接,ping www.moox.com. -
配置文件编写不正确.
nginx负载均衡模块
ngx_http_upstream_module
实现不同调度功能
-
轮询分配请求(平均) [root@lb01 conf.d]
upstream hello {
server 10.0.0.7:80;
server 10.0.0.8:80;
}
-
权重分配请求(weight) [root@lb01 conf.d]
upstream hello {
server 10.0.0.7:80 weight=2;
server 10.0.0.8:80 weight=1;
}
-
实现热备功能(backup) 热备配置(RS节点的高可用),当前面激活的RS都失败后会自动启用热备RS,这表示该服务器作为备份服务器,若主服务器全部宕机,就会向它转发请求(注意:当负载均衡算法为ip_hash时,后端服务器再负载均衡调度中的状态不能是weight和backup)。 [root@lb01 conf.d]
upstream hello {
server 10.0.0.7:80;
server 10.0.0.8:80;
server 10.0.0.9:80 backup;
}
-
定义最大失败次数(max_fails) Nginx尝试连接后端主机失败的次数,该值配合proxy_next_upstream、fastcgi_next_upstream、memcached_next_upstream这三个参数来使用。当nginx接受后端服务器返回这三个参数定义的状态码时(如404、502、503等),会将这个请求转发给正常工作的后端服务器。max_fails的默认值为1. [root@lb01 conf.d]
upstream hello {
server 10.0.0.7:80 max_fails=5;
server 10.0.0.8:80;
}
-
定义失败之后重发的间隔时间(fail_timeout) fail_timeout=10s 在间隔时间过去后,会再给连接失败的服务器一次机会。结合max_fails=5来看,在检测5次之后都失败后,根据fail_timeout的值,等待10s再检查,而且只检查一次(在不进行nginx配置的情况下,每隔10s都只检查一次)。
实现不同调度算法
- rr 轮询调度算法;
- wrr 权重调度算法;
- ip_hash 算法(出现反复登录的情况,可通过缓存服务器解决;也可通过IP_HASH算法解决,但由于NAT转换,有可能造成负载不均的情况发生);
- least_conn 根据服务器连接数分配资源(分配给连接少的服务器).
ngx_http_proxy_module
proxy_set_header Host
访问不同的网站地址,为何显示相同的网站页面?如何解决?proxy_set_header Host
例:访问测试www.hello.com、blog.hello.com、bbs.hello.com时,得到的都是同一结果。这是因为在负载均衡服务器访问Web服务器时,将集群名称hello当作请求host,因此请求的是满足hello的第一个server。在Web服务器的nginx.conf配置文件include顺序影响先访问哪个server,conf .d目录中配置文件默认顺序也影响了先访问哪个server。
[root@lb01 ~]
bbs 172.16.1.7
[root@lb01 ~]
bbs 172.16.1.8
[root@lb01 ~]
bbs 172.16.1.7
可以通过proxy_set_header修改host信息,将负载均衡服务器的host信息替换成用户的host信息解决此问题。 再次测试即可实现访问不同的网站页面
[root@lb01 ~]
bbs 172.16.1.7
[root@lb01 ~]
www 172.16.1.8
[root@lb01 ~]
blog 172.16.1.7
proxy_set_header X-Forwarded-For
访问网站用户地址信息无法进行分析统计,如何解决? proxy_set_header X-Forwarded-For
在统计访问地址时, /var/log/nginx/access.log中第一列是web主机地址或负载均衡服务器主机地址, 最后一列是客户端主机地址,在/etc/nginx/nginx.conf的日志格式中,log_format中定义的最后一个字段"$http_x_forwarded_for"即用于记录真实的客户IP地址。 修改配置文件信息后再次测试
[root@web01 ~]
10.0.0.5 - - [16/Aug/2021:23:32:48 +0800] "GET /test.html HTTP/1.0" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" "10.0.0.1"
10.0.0.5 - - [16/Aug/2021:23:32:50 +0800] "GET /test.html HTTP/1.0" 200 15 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36" "10.0.0.1"
proxy_next_upstream
访问负载均衡出现错误页面,影响用户体验,如何解决?proxy_next_upstream
server {
listen 80;
server_name blog.hello.com;
location / {
proxy_pass http://hello;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
nginx负载均衡应用
根据用户的访问URI进行负载均衡
根据URI的信息,将页面请求动静分离,分别部署不同的集群,提高网站服务安全性。
-
架构环境规划
目录 | 集群 | 名称 |
---|
/usr/share/nginx/html/www/static | static 10.0.0.7:80 | static服务器集群 | /usr/share/nginx/html/www/upload | upload 10.0.0.8:80 | upload服务器集群 | /usr/share/nginx/html/www/ | default 10.0.0.9:80 | default服务器集群 |
Web01环境部署 [root@web01 ~]
[root@web01 ~]
Web02环境部署 [root@web02 ~]
[root@web02 ~]
Web03环境部署 [root@web03 ~]
-
编写负载均衡配置文件 编辑负载均衡服务器配置文件/etc/nginx/conf.d/lb.conf [root@lb01 conf.d]
upstream static {
server 10.0.0.7:80;
}
upstream upload {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name www.hello.com;
location / {
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
location /upload {
proxy_pass http://upload;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
location /static {
proxy_pass http://static;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
根据用户的user-agent进行负载均衡
-
架构环境规划
终端 | 网站 | 集群 | 名称 |
---|
iphone | www.hello.com | iphone_access 10.0.0.7:80 | mobile移动端集群 | 谷歌 | www.hello.com | google_access 10.0.0.8:80 | web集群 | IE | www.hello.com | default_access 10.0.0.8:80 | default端集群 |
Web01环境部署 [root@web01 ~]
Web02环境部署 [root@web02 ~]
Web03环境部署 [root@web03 ~]
-
编写负载均衡配置文件 [root@lb01 conf.d]
[root@lb01 conf.d]
upstream mobile {
server 10.0.0.7:80;
}
upstream web {
server 10.0.0.8:80;
}
upstream default {
server 10.0.0.9:80;
}
server {
listen 80;
server_name www.hello.com;
location / {
if ($http_user_agent ~* iphone) {
proxy_pass http://mobile;
}
if ($http_user_agent ~* Chrome) {
proxy_pass http://web;
}
proxy_pass http://default;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_next_upstream error timeout http_404 http_502 http_403;
}
}
|