Nginx高可用负载均衡
一、前言
以前我们使用tomcat部署web项目
有了nginx之后
本来我们只用tomcat即可部署项目,那么为什么要加上nginx呢,甚至还多了一个反向代理层?
二、什么是Nginx?
1.介绍
- 一个高性能的HTTP和反向代理web服务器
- 特点是占有内存少,并发能力强,Nginx官方测试能支撑5万并发
- 专为性能优化而开发,cpu、内存等资源消耗低,性能稳定
2.名词解释
Web服务器:例如Nginx,Apache等。Nginx 是一个 HTTP 服务可以独立提供 HTTP 服务。可以做网页静态服务器,不可以解析动态资源。
应用服务器:例如tomcat、jetty、weblogic等。既能解析动态资源也可解析静态资源,但解析静态资源的能力不如Web服务器
三、Nginx能做什么?
1.反向代理
1.1正向代理
小明想访问google查阅资料,但是由于被防火墙拒绝,因此无法访问。所以他只能通过代理网站www.abc.com 代理访问。
在客户端(浏览器)配置代理服务器,通过代理服务器进行互联网访问
1.2反向代理
小明想去hrbasjy.com浏览资讯,该网站的项目部署在tomcat中,对方无法感知到tomcat服务器的ip,只知道搜索网址hrbasjy.com。因此是请求到达nginx后又请求转发到tomcat服务器中。
把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端
此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器IP地址
2.负载均衡
一台nginx服务器代理三台tomcat,因此需要负载均衡机制,将请求均匀的打到三台tomcat上,防止某一台tomcat由于并发压力过大而宕机。
负载均衡策略
-
轮询(默认)
-
权重(weight)
-
ip_hash(IP绑定)
-
fair(第三方扩展)
-
url_hash(第三方扩展)
3.动静分离
常用于前后端分离,Nginx提供的动静分离是指把动态请求和静态请求分离开,合适的服务器处理相应的请求,使整个服务器系统的性能、效率更高。
Nginx可以根据配置对不同的请求做不同转发,这是动态分离的基础。静态请求对应的静态资源可以直接放在Nginx上做缓冲,更好的做法是放在相应的缓冲服务器上。动态请求由相应的后端服务器处理。
三、为什么使用Nginx?
市场上除了nginx之外还有其他的web服务器,代表的有Apache和Nginx。
Apache和Nginx的部分功能相比较
- 异步能力:apache中也有异步模块支持异步功能,不过是阻塞性异步,而nginx是非阻塞性异步。
- 抗并发:nginx因为软件体积小,消耗主机资源少,抗并发能力是apache的3倍以上。
- 重量等级:apache配置相对nginx复杂,自身不支持动态页面。
- 漏洞缺陷:apache相对nginx的bug会少很多。
因此Nginx由于这些优势渐渐取代了Apache
Nginx和F5的区别
Nginx工作原理
Nginx采用的是反向代理技术,代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。反向代理负载均衡技术是把将来自internet上的连接请求以反向代理的方式动态地转发给内部网络上的多台服务器进行处理,从而达到负载均衡的目的。
F5负载均衡器
直接在服务器和外部网络间安装负载均衡设备,这种设备我们通常称之为负载均衡器。由于专门的设备完成专门的任务,独立于操作系统,整体性能得到大量提高,加上多样化的负载均衡策略,智能化的流量管理,可达到最佳的负载均衡需求。 一般而言,硬件负载均衡在功能、性能上优于软件方式,不过成本昂贵,比如最常见的就是F5负载均衡器。
Nginx与F5的对比实际上是软件和硬件的对比
F5
-
优点:能够直接通过智能交换机实现,处理能力更强,而且与系统无关,负载性能强更适用于一大堆设备、大访问量、简单应用
-
缺点:成本高,除设备价格高昂,而且配置冗余.很难想象后面服务器做一个集群,但最关键的负载均衡设备却是单点配置;无法有效掌握服务器及应用状态.
硬件负载均衡,一般都不管实际系统与应用的状态,而只是从网络层来判断,所以有时候系统处理能力已经不行了,但网络可能还来 得及反应(这种情况非常典型,比如应用服务器后面内存已经占用很多,但还没有彻底不行,如果网络传输量不大就未必在网络层能反映出来)
nginx
- 优点:基于系统与应用的负载均衡,能够更好地根据系统与应用的状况来分配负载。这对于复杂应用是很重要的,性价比高,实际上如果几台服务器,用F5之类的硬件产品显得有些浪费,而用软件就要合算得多,因为服务器同时还可以跑应用做集群等。
- 缺点:负载能力受服务器本身性能的影响,性能越好,负载能力越大。
综述:对我们管理系统应用环境来说,由于负载均衡器本身不需要对数据进行处理,性能瓶颈更多的是在于后台服务器,通常采用软负载均衡器已非常够用且其商业友好的软件源码授权使得我们可以非常灵活的设计,无逢的和我们管理系统平台相结合。
四、如何使用Nginx?
1.安装Nginx
操作系统:Linux CentOS7
1.1.准备工作
-
clone虚拟机
-
修改hostname
#修改主机名称 hostnamectl set-hostname 主机名 hostnamectl set-hostname nginx-master #修改成功,登出后重新登录 logout
-
修改ip地址
vi /etc/sysconfig/network-scripts/ifcfg-ens33
修改成功后重启网卡
#重启网卡 systemctl restart network #查看ip地址 ip addr
1.2.安装Nginx
1.2.1.安装方式
- yum源安装:https://docs.nginx.com/nginx/admin-guide/installing-nginx/installing-nginx-open-source/
- 下载安装包:https://nginx.org/en/download.html
1.2.2.下载nginx
我们采用下载安装包的形式,这里我们采用最新稳定版本nginx-1.18
1.2.3.上传并解压nginx
#创建soft文件夹
mkdir soft
#进入soft文件夹
cd soft
#解压nginx的压缩包到/usr/local下
tar -zxvf nginx-1.18.0.tar.gz -C /usr/local
#修改nginx文件夹名称
mv /usr/local/nginx-1.18.0/ /usr/local/nginx
1.2.4.编译与安装nginx
configure
- –prefix 指定安装路径
- –with-http_stub_status_module 允许查看nginx状态的模块
- –with-http_ssl_module 支持https的模块
#进入nginx的安装目录
cd /usr/local/nginx
#执行编译
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
注意:
缺包报错 ./configure: error: C compiler cc is not found
使用YUM安装缺少的包
yum -y install gcc pcre-devel openssl openssl-devel
编译安装
make && make install
测试是否安装成功
#查看版本号
./usr/local/nginx/sbin/nginx -v
2.配置Nginx
修改nginx下的conf目录中的nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
2.1.配置反向代理
-
反向代理图解
-
配置 nginx.conf
server{}定义一个虚拟主机
server { listen 80; #nginx 监听的端口为80 server_name nginx-master; #nginx所在服务器的主机名 #反向代理的配置 / 代表拦截所有请求 location / { root html; proxy_pass http://192.168.98.1:8080; #这里是代理走向的目标tomcat服务器 } }
创建日志文件夹
mkdir /usr/local/nginx/logs
配置完成启动nginx
./usr/local/nginx/sbin/nginx
-
测试
在本地启动创建一个springboot的demo项目,并启动
打开cmd,输入指令ipconfig查看本机ip
因此本机的ip为192.168.98.1 ,所以用nginx代理我们的demo项目需要添加配置
proxy_pass http://192.168.98.1:8080;
我们现在可以通过nginx代理我们在本地启动的tomcat项目
2.2.配置负载均衡
-
配置nginx.conf
http{ #upstream 代理服务的集群配置 后面的tomcats可以任意指定,但注意server的proxy_pass的配置 upstream tomcats{ server 192.168.98.1:8080; #默认负载均衡策略是轮询,也可以添加权重 server 192.168.98.1:8081; #如 server 192.168.98.1:8080 weight=1; server 192.168.98.1:8082; } server { listen 80; server_name nginx-master; location / { root html; proxy_pass http://tomcats; } }
修改完成后,重启nginx
#查看nginx主进程端口 ps -ef|grep nginx #停止nginx服务 kill -QUIT nginx主进程端口 #启动nginx ./usr/local/nginx/sbin/nginx
-
测试
编写测试类BanlanceController
@RestController @RequestMapping("/") public class BanlanceController { @Value("${server.port}") private String port; @RequestMapping("/test") public String demo(){ return "hello world,I am in "+port; } }
配置配置文件application.properties
server.port=8081
分别修改端口为8080、8081、8082启动三个项目
在浏览器输入http://192.168.98.100/test,会发现页面中的端口号轮询呈现,代表配置成功
五、如何实现Nginx高可用?
HA(High Available), 高可用性集群,是保证业务连续性的有效解决方案,一般有两个或两个以上的节点,且分为活动节点及备用节点。
若按照上图规划集群,存在以下问题
keepalive是一款可以实现高可靠的软件,通常部署在2台服务器上,分为一主一备。Keepalived可以对本机上的进程进行检测,一旦Master检测出某个进程出现问题,将自己切换成Backup状态,然后通知另外一个节点切换成Master状态。
-
系统入口不唯一
解决:在两台nginx服务器上安装keepalived, keepalived可以在主节点提供虚拟ip(vip)
-
nginx集群如何实现故障转移
keepalived有健康检查机制,可以监控nginx的进程是否存活,来判断是否更换主节点
按照上图搭建集群,
nginx集群规划
节点 | ip |
---|---|
nginx-master | 192.168.98.100 |
nginx-back | 192.168.98.110 |
tomcat集群
节点 | ip |
---|---|
tomcat01 | 192.168.98.1:8080 |
tomcat02 | 192.168.98.1:8081 |
tomcat02 | 192.168.98.1:8082 |
1.Keepalived安装
选择好对应版本,这里我们采用最新版
将下载好的压缩包上传至nginx-master中的/root/soft中
解压
tar -zxvf keepalived-2.0.20.tar.gz -C /usr/local/
修改文件夹名为keepalived
mv /usr/local/keepalived-2.0.20/ /usr/local/keepalived
进入keepalived目录 编译keepalived
#进入keepalived目录
cd /usr/local/keepalived
#开始configure
./configure --prefix=/usr/local/keepalived
##编译并安装
make && make install
2.添加keepalived到系统服务
拷贝执行文件(安装好的软件下面,有启动脚本,拷贝到系统下)
cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
创建文件夹 keepalived,将配置文件复制进入etc中,服务启动后会默认加载etc/keepalived中的配置文件
mkdir /etc/keepalived
cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived
3.克隆虚拟机nginx-master,创建新节点nginx-back
4.keepalived配置
4.1.主节点(nginx-master)配置
! Configuration File for keepalived
global_defs {
}
vrrp_instance VI_1 { ### 实例名称,VIP_1即实例名
state MASTER ### 标记该节点是主节点(master)
interface ens33 ### 配置vip绑定的网卡,ens33是网卡名,按照实际情况修改成你自己(网卡名查询:ip addr)。vip指的是虚拟ip地址
virtual_router_id 51 ### 取1-255之间的值,主备节点的值需要设置成一样的,成为一个组
priority 150 ### 权重,该数值最大的节点即为主节点
advert_int 1 ### 主备节点之间通讯的时间间隔(单位:秒),用于判断主节点是否存活
authentication {
auth_type PASS### 认证方式
auth_pass 1111### 认证密码
}
virtual_ipaddress {
### vip地址,随意指定但注意要与两台机器处于同一网段
192.168.98.120/24 dev ens33 label ens33:1
}
}
4.2.备用节点(nginx-back)配置
! Configuration File for keepalived
global_defs {
}
vrrp_instance VI_1 { ### 实例名称,VIP_1即实例名
state BACKUP ### 标记该节点是主节点(master)
interface ens33 ### 配置vip绑定的网卡,ens33是网卡名,按照实际情况修改成你自己(网卡名查询:ip addr)。vip指的是虚拟ip地址
virtual_router_id 51 ### 取1-255之间的值,主备节点的值需要设置成一样的,成为一个组
priority 100 ### 权重,该数值最大的节点即为主节点
advert_int 1 ### 主备节点之间通讯的时间间隔(单位:秒),用于判断主节点是否存活
authentication {
auth_type PASS### 认证方式
auth_pass 1111### 认证密码
}
virtual_ipaddress {
### vip地址,随意指定但注意要与两台机器处于同一网段
192.168.98.120/24 dev ens33 label ens33:1
}
}
4.3启动keepalived
启动 keepalived:systemctl start keepalived
重启 keepalived:systemctl restart keepalived
停止 keepalived:systemctl stop keepalived
#启动两个节点的keepalived
systemctl start keepalived
#查看ip
ip addr
4.4测试
启动nginx-master和nginx-back上的nginx
在本地浏览器访问vip (虚拟ip) 192.168.98.120 即可进入主节点,和访问真实ip效果一致
6.配置keepalived心跳检查
keepalived的心跳检查机制:用户可自定义shell脚本去监测系统中的某一进程,返回存活状态给keeplived。
ps:这里的进程不代表nginx,可以监测任何系统上的软件
nginx-master
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL_01
}
#心跳检查
vrrp_script chk_nginx {
script "/usr/local/nginx/check_nginx.sh" #执行的脚本位置
interval 2 #每隔多少s去检查nginx进程
weight -2 #惩罚机制如果nginx宕机一次降低权重2
}
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 150
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.98.110/24 dev ens33 label ens33:1
}
#在实例中引用上述脚本
track_script {
chk_nginx
}
}
创建脚本/usr/local/nginx/check_nginx.sh
vim /usr/local/nginx/check_nginx.sh
健康检查脚本check_nginx.sh
#!/bin/bash
#如果查询nginx的进程运行不正常直接关闭keepalived服务,从而让vip漂移
if [ `ps -C nginx --no-header |wc -l` -eq 0 ];then
systemctl stop keepalived
fi
赋予脚本可执行权限
chmod 777 /usr/local/nginx/check_nginx.sh
nginx-back,新增配置同上
测试
修改配置后重启两个节点的keepalived
systemctl restart keepalived
访问vip
停掉nginx-master节点的nginx,模拟nginx宕机
结果还是可以正常访问
但是主节点的ip中已经没有了vip,并且keepalived也被关闭,vip漂移到备节点上
等到重新启动主节点的nginx和keepalived后vip又会回到主节点
六、总结
在项目中我们可以使用nginx来做我们系统的反向代理、负载均衡服务器,在生产环境中,要注意搭建高可用集群,至少两个节点即 主备结构,这里我们使用keepalived+nginx的形式搭建高可用集群。
如果出现高并发场景我们还可以对nginx横向扩容,增加更多的nginx服务器做到理论上的无限扩容。