抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

七つの海

今日、海を見た。もう怖くない

一般的 Web 应用是将写好的程序使用手段放在服务器上,然后在服务器上运行这些程序;这样其他计算机访问这台服务器的时候就可以使用这个应用。但是这样有一个明显的缺点就是一台主机的性能存在上限,当业务规模扩大,且业务要求提高的情况下,这种简单的部署形式就不能满足要求了。

实验环境:Ubuntu 20.04 电脑两台,处于同一局域网下。

首先,关于 Nginx 是什么和 Keepalived 是什么就不再赘述;这里仅简单说明实验操作过程:

Nginx 开启负载均衡

具体来说可以按照以下步骤进行;我的第一台主机作为常用机,其上已经运行了 apache2 的服务;那么此时如果要再使用 nginx 的负载均衡,就需要先关闭原有的 apache2 以释放 80 端口。之后设置 nginx 的转发规则就可以实现负载均衡了;

安装基本的工具

即使是像 Ubuntu 这样已经成熟的发行版,也需要安装相当多的工具才能进行服务器的搭建:

1
sudo apt install net-tools nginx vim

最主要的是第一项的 net-tools,它包含了重要的工具 ifconfig 可以用来查看 Linux 网络接口的信息;再完成了安装之后,我们可以运行下面的命令,来启动防火墙和 nginx

1
2
3
4
sudo ufw app list			# 列出所有可用的预设配置
sudo ufw allow 'Nginx Full' # 允许 Nginx 的所有 HTTP/HTTPS 链接
sudo ufw enable # 根据设置的规则启用 UFW 防火墙
sudo service nginx start

但是因为我的主机上同时还运行了 apache2 占用了 80 端口,所以需要先处理它,才能重新运行 Nginx;

关闭 Apache2(如果存在

我在尝试关闭 apache2 的时候遇到了如何关闭都无法解放端口占用的问题;后来通过修改 apache2 的监听端口+重启主机才释放了 80 端口给 nginx 使用。

修改 apache2 的监听端口1.png
修改 apache2 的监听端口2.png

根据 Ubuntu apache 默认页面,可以知道 apache2 的配置文件位于 /etc/apache2 目录下;首先需要修改 port.conf 中的端口监听信息,然后再根据文件的提示修改 sites-enabled/ 下的站点的监听信息。

做完这些重启 apache2 服务之后,就可以释放 apache2 对于端口 80 的占用了;此时运行 nginx 就可以正常启动服务了;

检查 Nginx 正常运行

使用 service 命令或者 systemctl 命令检查 nginx 的状态,可以看到如下页面:

Nginx 已经正常运行.png

此时,apache2nginx 同时运行,分别监听 8080 和 80 端口;分别访问这两个端口,可以在响应头中看到它们的响应分别来自不同的服务器:

apache2 的服务器.png
Apache2 监听的 8080 端口
nginx 的服务器.png
Nginx 监听的 80 端口

至于为什么两个页面都是 “Apache2 Ubuntu Default Page”,是因为我先安装了 apache2,所以后安装的 nginx 创建的 index.html 被改名了;所以我们需要观察响应标头来判断相应的来源。

启动两个服务器

首先,我们需要写一个简单的页面,然后再把它们假设起来;这里也使用 Nginx 感觉有点麻烦了,所以使用了 Node.js 提供的简易 HTTP 服务器工具 serve;如果没有安装,需要先安装:

1
2
sudo apt install npm
sudo npm i -g serve

之后,我们需要写一个简单的网页:

写一个网页.png

然后复制两份,分别修改端口的标记;

复制两份并且修改端口标记.png

修改完成后,使用 serve 分别将服务启动在对应的端口,终端最后如下:

启动两个简易的 HTTP.png

在浏览器分别访问两个端口,以确认可以正常访问:

两个端口都可以正常运行.png

这样,我们就将这个简单的网页部署到了“两个不同的服务器”上了,接下来需要通过 Nginx 来实现负载均衡。

配置 Nginx

实现负载均衡需要先在配置文件中指定一个 upstream,其中包含了负载的服务器集群和它们的权重;Nginx 支持你选择特定的负载均衡的算法,如果不指定就是默认的轮询的方法;我们在 /etc/nginx/conf.d/ 下创建 nginx.conf;配置文件如下:

nginx 配置文件.png

完成配置文件的编写之后,使用 sudo nginx -t 来检查配置文件是否有误或产生了冲突;如果没有意外,则重启 nginx 服务,就可以看到 80 端口会根据设置的权重自动转发到两个简易 HTTP 服务器上。

需要注意的是……

Nginx 有一个默认的服务器配置,位于 /etc/nginx/sites-enabled/ 目录下;这个服务器也是默认监听 80 端口的,会和我们已有的服务器产生冲突,所以要先移除;此外,需要将我们创建的配置文件软链接到该目录,因为这样 Nginx 会扫描两次这个文件,从而继续得出端口冲突的结论。

移除多余的默认服务器,否则服务将无法启动.png

可以看到如果不删除这个配置文件,是无法通过 Nginx 的配置文件的测试的。同时,删除的只是链接到 sites-available 目录下的配置文件的软连接,并不会丢失这个配置;可以随时通过创建软连接的方式将这个配置文件拉回来。

大功告成!

接下来,本机访问 localhost 或局域网内访问 http://192.168.3.2/(本机 IP),反复刷新,就可以看到端口标识根据配置文件中设置的权重反复横跳;

因为不好放视频,所以这里就不放了(

Keepalived 实现高可用

keepalived 的高可用基于多台 Nginx 服务器共用一个虚拟网关,当其中的一台炸了的时候,会自动从这个虚拟的地址中退出,从而保证了对于这个虚拟地址的访问总是有效的(只要有一台服务器在正常运行);因此,这要求至少将这样的 nginx 部署到多个服务器上形成 nginx 服务器集群;因此,首先我们要像上一部分所做的那样在另一个服务器上操作一遍;

安装基本软件以远程操作

比起上面的软件,还需要额外安装 SSH 服务器,以在第一台主机上访问第二台主机:

1
sudo apt install vim nginx net-tools openssh-server

安装完成后使用 ifconfig 获得第二台主机在局域网中的 IP,就可以在第一台主机上访问了:

连接 SSH 到第二台服务器.png

完成了基本软件安装后,启动 nginx,浏览器访问局域网 IP,可以看到 Nginx 欢迎页面,说明 Nginx 安装成功:

第二台服务器 Nginx 配置成功.png

因为这台主机上没有先装 apache2,所以 NginX 完成安装后就自动启动了;

配置 Nginx 的负载均衡并测试

按照上一个部分部署完负载均衡之后,发现在第一台服务器上无法访问我们部署的页面:

发现第二台服务器无法访问.png

在第二台主机上尝试直接访问 http://192.168.3.2:1919http://192.168.3.2:9191 会发现无法打开页面,再联想到安装 Nginx 之后自动配置的防火墙,判断 1919 和 9191 端口被 ufw 屏蔽;所以在第一台主机上手动开放这两个端口,第二台服务器上的负载均衡就可以正常使用了。

在第一台服务器上修改防火墙配置开放端口,成功.png

使用 ufw 开放端口可以使用 sudo ufw allow <port> 来实现。

安装 Keepalived

在两台主机上安装 keepalived 并尝试运行:

1
2
sudo apt install keepalived
sudo service keepalived start

会发现它们无法启动,因为缺少了配置文件:

无法启动keepalived,因为没有配置文件.png

因此我们需要为它们添加配置文件;

配置 Keepalived

这一步主要是为第一台主机(主机)和第二台主机(从机)分别增加 Keepalived 配置文件和对于 Nginx 服务器的监控脚本;这使得它们在可以正常工作的状态下连接了同一个虚拟网关,且在检测到 Nginx 服务器出现异常时即使退出,保持虚拟地址的访问总是可用的。

配置文件

配置文件主要需要指明本机 IP、检测脚本和虚拟网关三个部分,其他部分都可以照葫芦画瓢()本机 IP 在进行前面的操作的时候我们已经都知道了,而检测脚本是可以直接 CV 的(bushi;虚拟网关需要在对应的主机上使用 ifconfig 查看你的 IP 是由哪一个名字的接口提供的;就像下面的图片中一样——192.168.3.2 这一局域网 IP 是由 enp2s0 提供的,所以虚拟网关的接口是该接口;

编写 keepalived 配置文件,利用 ifconfig 查看网卡.png

除此之外,还需要找到一个没有被占用的局域网 IP 地址作为对外暴露的虚拟地址,以隐藏背后的 Nginx 服务器集群;在这里,我选择的是没有被使用过的 192.168.3.216;最后的主从机配置文件分别如下:

Master 的 keepalived.png
主机的配置文件

注意 virtual_ipaddress 的值实际上是 192.168.3.216 这一没有被任何主机占用的局域网 IP,并且和下面从机配置的虚拟 IP 地址保持一致。这里的截图里是错误示范(

Slave 的 keepalived.png
从机的配置文件

因为从机只有一个 USB 网卡,所以 interface 和一般的 Ubuntu 主机的默认网卡不一样。

检测脚本

用来检测 Nginx 服务器是否增长工作的脚本;我不懂,直接网上 CV 来的:

检查 Nginx 是否正常运行的脚本.png

遵循上面的配置文件,我们将这个脚本放在和配置文件同一个目录下,然后使用 chmod 赋予它可执行的权限,并运行一次——如果 Niginx 服务器当前正在正常运行,那么这个脚本会直接退出。

大功告成!

完成这些操作之后,使用 servicesystemctl 命令启动 keepalived 服务,就完成了部署:

增加权限并启动 keeplalived.png

此时,我们使用 ip a 可以观察到在我们指定的网络接口下多了额外的虚拟 IP 地址:

观察到虚拟 IP.png

现在,将主机和从机中的任意一个的 Nginx 服务中止,访问虚拟网关还是可以打开这个页面(并且包含了负载均衡);Web 应用的可用性提高了!

总结

首先,我们使用多个服务器部署了我们的 Web 应用;然后使用多台安装了 Nginx 的服务器部署负载均衡——这个集群中的每一台服务器都可以根据设定的权重将来自外部的请求分配到部署了 Web 应用的服务器上;同时,这些 Nginx 服务器通过 Keepalived,通过一个公共的虚拟网关对外部开放;当这些服务器中的任何一个机能出现了故障时,Keepalived 都会通过预先编写的脚本察觉到问题并立即使该服务器断开和虚拟网关的连接直到恢复,保证了来自外部的请求都会通过这个虚拟网关到达正常工作的服务器上,从而实现了高可用。

参考资料

历史记录丢失

评论