在前面我们实现了基本的HTTP反向代理,从互联网过来的请求已经可以分发到后端多台网站服务器上,但不是所有的业务都是网络类型的,此篇文章我们主要讨论的是TCP 端口的负载均衡做法,昨天也有小伙伴提到了,在HTTP反向代理中,我们并没有讨论会话保持健康检查,我们将会在这篇文章结束后,专门写一篇关于会话保持和检查检查的文章,来分析他们的做法。

    我们正式开始此篇的重点,我们要实现的是用户通过Nginx来访问一个或多个端口,这种场景还是蛮多的,例如OpenStack的控制节点等无状态的服务就需要一个统一的访问入口,例如对外的API接口、MySQL服务器等,但凡是需要对外提供一个高可用端口的场景,都用的上。

TCP 负载均衡

目标: 通过Nginx来实现后端两台服务器的负载均衡,且以轮询的方式将请求分发到不同的服务器上,此处我们就以SSH的22号端口来演示。

 

角色 机器名 IP地址
Nginx Host1 192.168.30.130
TCP 端口服务器 Host2 192.168.30.131
TCP 端口服务器 Host3

192.168.30.132

备用TCP 端口服务器 Host4 192.168.30.133


新建一个port.conf的配置文件,我们将用这些文件来实现此实验目标,但是我们要注意位置,配置文件不要新建到conf.d目录中,因为如下图所示,这个位置是包含在HTTP这个块中的,我们需要新建一个,例如port.conf.d的目录,并在nginx主配置文件中,包括此目录 

查看不能放在conf.d的原因

Nginx负载均衡之TCP端口高可用(二)_第1张图片

包含port.conf.d目录

vim /etc/nginx/nginx.conf

在此文件中的最后一行,添加如下所示的内容

include /etc/nginx/port.conf.d/*.conf;

32.png

新建配置文件

mkdir /etc/nginx/port.conf.d

vim /etc/nginx/port.conf.d/port.conf

33.png

将以下内容复制粘贴到配置文件中

stream {

    upstream sshport {

        server 192.168.30.131:22 weight=10;

        server 192.168.30.132:22 weight=10;

        server 192.168.30.133:22 backup;

    }

    server {

        listen 2000;

        proxy_pass sshport;

    }

}

配置文件效果如下

Nginx负载均衡之TCP端口高可用(二)_第2张图片

开启nginx服务器的TCP 2000端口防火墙

firewall-cmd --add-port=2000/tcp

firewall-cmd --add-port=2000/tcp --permanent

如果你的服务器开启了selinux,可能会启动失败,由于selinux不在讨论范围内,你可以使用以下命令临时关闭selinux

setenforce 0

重启Nginx服务

systemctl restart nginx.service

查看侦听

netstat -tunlp | grep 2000

35.png

高可用验证

在ssh时,指定端口为2000,我们可以看到,输入密码后,直接登录了host2,也就是说代理成功

Nginx负载均衡之TCP端口高可用(二)_第3张图片

我们来测试一下,如果host2关机会怎么样,你可以在host2上执行以下命令关机

systemctl poweroff

再次登录的时候报错SSH,这是因为host2已经关机,尝试链接host3,发现指纹不对,可以执行rm -rf /root/.ssh/known_hosts删除

Nginx负载均衡之TCP端口高可用(二)_第4张图片

此时我们可以看到,host2关机后,再次连接,就会有host3为你提供服务

Nginx负载均衡之TCP端口高可用(二)_第5张图片

      结合上一篇和本篇文章,我们已经可以简单完成HTTP类型的网站和TCP 端口的高可用配置,下一篇我们重点来讲一下在常规的负载均衡背后的技术,会话保持、健康检查、场景的负载均衡策略都会在下一篇讲到。