Nginx四层负载均衡实战指南
在互联网应用中,随着用户量的增长和业务复杂度的提升,如何有效地分配流量、提高服务可用性成为了关键。Nginx不仅擅长七层HTTP协议的处理,还支持四层(传输层)的TCP/UDP协议负载均衡,为网络服务提供了强大的扩展能力。本文将详细介绍如何使用Nginx实现四层负载均衡。
什么是四层负载均衡?
四层负载均衡工作于OSI模型的传输层,它根据IP地址和端口号来决定如何转发客户端请求。相比于七层负载均衡,四层负载均衡更直接地基于网络数据包进行操作,因此具有更低的延迟和更高的性能。
实现 Nginx 四层负载均衡
Nginx在1.9.0版本开始支持tcp模式的负载均衡,在1.9.13版本开始支持udp协议的负载,udp主要用于 DNS的域名解析,其配置方式和指令和http代理类似,其基于ngx_stream_proxy_module模块实现tcp 负载,另外基于模块ngx_stream_upstream_module实现后端服务器分组转发、权重分配、状态监测、 调度算法等高级功能。
如果编译安装,需要指定 --with-stream 选项才能支持ngx_stream_proxy_module模块。
官方文档
https://nginx.org/en/docs/stream/ngx_stream_proxy_module.html
http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html
TCP协议负载均衡配置参数
stream { #定义stream相关的服务;Context:mainupstream backend { #定义后端服务器hash $remote_addr consistent; #定义调度算法,当后端服务器可用时此算法才生效,不可用时,可能调度其它可用的主机server backend1.example.com:12345 weight=5; #定义具体serverserver 127.0.0.1:12345 max_fails=3 fail_timeout=30s;server unix:/tmp/backend3;}upstream dns { #定义后端服务器server 192.168.1.20:53535; #定义具体serverserver dns.example.com:53;}server { #定义serverlisten 12345; #监听IP:PORTproxy_connect_timeout 1s; #连接超时时间proxy_timeout 3s; #转发超时时间proxy_pass backend; #转发到具体服务器组}server {listen 127.0.0.1:53 udp reuseport;proxy_timeout 20s;proxy_pass dns;}server {listen [::1]:12345;proxy_pass unix:/tmp/stream.socket;}server {listen 2222;proxy 192.168.1.20:22; # 只实现四层代理,无负载均衡功能}}
负载均衡实例 : Redis
后端服务器安装redis
#安装两台redis服务器
[root@centos8 ~]# yum -y install redis
[root@centos8 ~]# sed -i '/^bind /c bind 0.0.0.0' /etc/redis.conf
[root@centos8 ~]# systemctl enable --now redis
[root@centos8 ~]# ss -tnl | grep 6379
nginx配置
[root@centos8 ~]# vim /apps/nginx/conf/nginx.conf
include /apps/nginx/conf/tcp/tcp.conf; #注意此处的include与http模块平级
[root@centos8 ~]# mkdir /apps/nginx/conf/tcp
[root@centos8 ~]# cat /apps/nginx/conf/tcp/tcp.conf
stream {upstream redis_server {#hash $remote_addr consistent;server 192.168.1.30:6379 max_fails=3 fail_timeout=30s;server 192.168.1.40:6379 max_fails=3 fail_timeout=30s;}server {listen 192.168.1.20:6379;proxy_connect_timeout 3s;proxy_timeout 3s;proxy_pass redis_server;}}#重启nginx并访问测试
[root@centos8 ~]# systemctl restart nginx
[root@centos8 ~]# ss -tnl | grep 6379
LISTEN 0 128 192.168.1.20:6379 *:*
#测试通过nginx 负载连接redis:
[root@centos8 ~]#redis-cli -h 192.168.1.30 set name cao
OK
[root@centos8 ~]#redis-cli -h 192.168.1.30 get name(nil)
[root@centos8 ~]#redis-cli -h 192.168.1.30 get name"cao"
负载均衡实例: MySQL
后端服务器安装mysql
#先修改后端两个服务器的主机名,方便测试
[root@rocky9 ~]# hostnamectl hostname mysql-server1
[root@rocky9 ~]# hostnamectl hostname mysql-server2#安装MySQL服务
[root@mysql-server1 ~]# yum install -y mysql-server
[root@mysql-server1 ~]# systemctl enable --now mysqld.service
[root@mysql-server1 ~]# mysql -e "alter user cao@'192.168.1.%' identified with mysql_native_password by 'caoge'"
[root@mysql-server1 ~]# mysql
mysql> create user cao@'192.168.1.%' identified by 'caoge';
Query OK, 0 rows affected (0.02 sec)mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)mysql> exit
Bye
[root@mysql-server2 ~]# yum install -y mysql-server