背景介绍

nginx除了可以作为web服务器外,同时也是一个反向代理软件,nginx不能完全取代apache,所以很多场景下nginx作为apache的反向代理服务器。nginx运行在用户空间,代替用户向服务器发起请求,请求返回时再经由nginx服务器返回给用户。不同于LVS的NAT模型,web服务器的网关不用必须指向nginx服务器,只要2者之间可以通信就可以,由于nginx作为代理服务器,所以支持端口转换。

网络拓扑

实验拓扑结构如下:

实验系统采用CentOS6.8,nginx采用1.12.1,所有设备连接在同一个虚拟交换机上,172.16.20.0/24网段模拟公网地址,172.16.10.0/24网段模拟内网地址。nginx服务器除配置内网地址外再安装keepalived服务,并创建2个vrrp实例,为vrrp实例配置公网地址实现keepalived双主模式高可用,同时对nginx服务进行健康检测,实现nginx反向代理高可用。用户通过修改host文件模拟域名绑定多个IP地址接收用户访问。

1.png

操作步骤

1.为web1和web2服务器安装httpd服务,默认端口改为8080,分别将主页面修改为RS1 Server和RS2 Server(略)

2.修改客户端host文件,设置www.abc.com的地址为172.16.20.100和172.16.20.200(略)

3.安装nginx软件,在配置文件中设置上游服务器地址和端口,将通过80端口接收到的请求全部转发至上游服务器

2.png

4.以nginx1服务器为例,在其上安装keepalived软件,创建2个vrrp实例并设置公网IP地址,实例1为主,实例2为备用。nginx2服务器上设置刚好相反,这样2个keepalived服务在实现双主模式的同时互为冗余,此时任何一个服务器keepalived服务掉线,另一个服务器都会添加该服务器的公网IP地址。此时虽然keepalived服务实现了多个公网IP地址的高可用但又会引入一个新的问题:如果一台nginx服务器上的keepalived服务正常,nginx服务没有启动或者意外中止,这台nginx服务器依然会保留公网IP地址,而通过此公网IP进来的用户则由于nginx服务的掉线无法正常访问到后端的apche服务器。针对此问题引入了红框中的nginx服务健康检测脚本,并在实例中进行调用

3.png33.png

5.当一个进程启动时,会在指定位置生成一个pid文件,该文件会随着进程的终止而消失。检测脚本就是利用该特性,当pid文件不存在时vrrp实例的权重-20,这样当一个服务器的nginx服务停止或未启动时,另一个服务器都会添加该服务器的公网IP地址,从而避开nginx掉线的服务器

4.png

结果验证

经测试,此时任何一台代理服务器上的keepalived服务或者nginx服务掉线后,另一台服务器都会接管该服务器的公网IP地址,从而实现keepalived和nginx的高可用。

补充说明

此方案中还有一个疑问:web服务器是否实现冗余,尽管nginx服务实现了高可用,如果web服务器宕机,nginx的upstream中是否会检测到掉线的web服务器并在调度用户请求时避开掉线的web服务器。经测试可以避开掉线的服务器,但无法通过upstream本身显示上游服务器健康状态