Nginx四层负载均衡和七层负载均衡实践 | 青训营笔记

332 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记

实验环境

实验所用的是centos7 准备了四个虚拟机

主机名ip角色
nginx192.168.204.101负载均衡节点
node1192.168.204.102后端服务1
node2192.168.204.103后端服务2
server1不重要 同一网段即可客户端

node1

node1.png

node2

node2.png

四层负载均衡

所谓四层负载均衡,是通过传输层协议(TCP/IP)来实现的。也就是通过报文中的目标地址和端口,再根据负载均衡器(nginx)设置的负载均衡算法,决定最终真实的目标服务器。

实验思路

先对node1和node2进行简单的网站搭建(一个能显示自己是哪个节点的html),然后对nginx进行四层负载均衡的配置并监听80端口,然后客户端访问nginx节点的80端口,观察负载均衡的效果是否实现。

nginx配置

[root@nginx ~]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

stream {
        upstream servers{
                #默认是轮询模式,这里设置为最短连接,请求会被转发到连接数最少的服务器上。
		least_conn; 
                server 192.168.204.102:80;
                server 192.168.204.103:80;
	}
        server{
                listen 8080;
                proxy_pass servers;
        }
}

效果

[root@nginx ~]# for i in {1..10};do curl 192.168.204.101:8080;done
<p1>node2</p1>
<p1>node1</p1>
<p1>node2</p1>
<p1>node1</p1>
<p1>node2</p1>
<p1>node1</p1>
<p1>node2</p1>
<p1>node1</p1>
<p1>node2</p1>
<p1>node1</p1>

七层负载均衡

七层即应用层,就是基于 URL 等应用层信息的负载均衡。比如通过URL的匹配规则去进行负载均衡。

实验思路

在服务器上先去手动解析两个域名,都去指向nginx,然后nginx节点接受的请求中就会有不同的URL了,然后根据匹配规则负载均衡到node1和node2。

客户端解析域名

[root@server1 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.204.101 node1.zyf.com node2.zyf.com

配置nginx

[root@nginx ~]# cat /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
	upstream node1{
		server 192.168.204.102;
	}
	server {
		listen 80;
		server_name node1.zyf.com;
        	location / {
			proxy_pass http://node1;
		}
	}
	upstream node2{
                server 192.168.204.103;
        }
        server {
                listen 80;
                server_name node2.zyf.com;
                location / {
                        proxy_pass http://node2;
                }
        }
}

效果

[root@server1 ~]# curl node1.zyf.com
<p1>node1</p1>
[root@server1 ~]# curl node2.zyf.com
<p1>node2</p1>

总结

四层负载均衡是建立在ip层的,进行负载均衡的时候需要占用端口,当服务变多的时候,端口和服务之间的关系就会越来越复杂,造成了运维成本的提高。

七层负载均衡是根据一些应用层上的信息,避免了端口的问题,但是层数越高对数据的封装越多,负载均衡时对数据处理的成本就增加了。

没有最好的策略,根据业务场景选择合适的就行。