当前位置: 首页 > news >正文

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
http://www.dtcms.com/a/359839.html

相关文章:

  • Redis 7.0 高性能缓存架构设计与优化
  • Spring Data JPA 派生查询方法命名速查表
  • 【51单片机】【protues仿真】基于51单片机智能晾衣架系统
  • git中使用SSH的配置
  • 从零开始搭建使用 TDengine:新用户快速上手指南
  • STAR法则
  • Encoder编码器
  • kafka服务端架构总览
  • sublime MAC系统快捷键及常见问题
  • 深入理解Nginx反向代理及其应用
  • 【机器学习学习笔记】numpy基础
  • Library cache lock常见案例分析(一)
  • TensorFlow 面试题及详细答案 120道(81-90)-- 其他框架/工具
  • 【重学MySQL】九十三、MySQL字符集与比较规则完全解析
  • 标定分享3--lidar与rtk/ins标定外参工程实现分享
  • SciPy
  • 【MLLM】具有长期记忆的多模态智能体框架M3-Agent
  • Uniapp 项目创建与目录结构解析
  • LangChain实战(七):Text Embedding Models与Vector Stores
  • 嵌入式ARM程序高级调试技能:19.qumu arm elf无法生成coredump
  • 829作业
  • DAY17-新世纪DL(DeepLearning/深度学习)战士:Q(机器学习策略)2
  • Claude Code干翻Cursor后,轮到AI浏览器了
  • 组件通信终极指南:从Props Drilling到Context API
  • MPI-NCCL-TEST 训练自检,基础通信和可用的机器
  • NM:微生物组数据分析的规划与描述
  • GDPU操作系统实验:生产者消费者问题
  • Matplotlib:让数据在Python中跳舞的魔法画笔![特殊字符]
  • 5.【C++进阶】红黑树
  • C++从入门到实战(二十)详细讲解C++List的使用及模拟实现