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

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.xdnf.cn/news/19318.html

相关文章:

  • 基于 YOLOv11n 的无人机航拍小目标检测算法学习
  • 鸿蒙搭配前端开发:应用端与WEB端交互
  • Go学习1:常量、变量的命名
  • 2025.8.31基于UDP的网络聊天室项目
  • LangChain Prompt管理核心:PromptTemplate与ChatPromptTemplate全解析
  • JVM学习总结
  • shell脚本(略)
  • KMP 算法相关练习题
  • 7.0elementplus布局容器详解
  • WebSocket的基本使用方法
  • 让你的App与众不同打造独特品牌展示平台
  • C语言学习笔记(自取)
  • 从新能源汽车看产品逻辑与认知系统
  • QML Chart组件之图例
  • 根据Excel数据表快速创建Word表格(标签)
  • 后向投影合成孔径辐射源定位方法(一)
  • 基于计算机视觉的海底图像增强系统:技术详述与实现
  • VMWare Tools (Linux)安装教程
  • 性能优化三剑客:`memo`, `useCallback`, `useMemo` 详解
  • Java异常处理:掌握优雅捕获错误的艺术
  • 远程管理协议telnet、ssh
  • 智能制造——解读装备制造业智能工厂解决方案【附全文阅读】
  • 【IO学习】IO基础和标准IO函数
  • 拉长视频时长的两种方法
  • SCARA 机器人工具标定方法
  • VMware虚拟机网盘下载与安装指南(附安装包)
  • Ubuntu24.04(Jazzy)从零开始实现环境配置和Gmapping建图
  • Redis的Java客户端
  • MyBatis-动态sql
  • 【自记】 Python 中函数参数前加 *(单星号)的解包可迭代对象写法说明