Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)


Posted in Servers onNovember 17, 2021

前奏

我们都知道 nginx 是一款优秀的反向代理服务,用过 nginx 的也应该都知道 upstream,upstream 节点一般置于 http 节点大括号中,常规在 upstream 中配置需要被负载均衡的服务器列表。

比较多的使用做如下示意:

#user nobody nobody。
#worker_processes 2;
#pid /nginx/pid/nginx.pid;
error_log log/error.log debug;
events {
    ……
}
http {
    ……
    upstream testserver {   
      server 192.168.1.5:8080;
      server 192.168.1.6:8080;
      ……
    }

    server {
        ……
        location  / {
           ……     
           proxy_pass  http://testserver;
        } 
    }
}

从结构可以看出,这种用的比较多的配置,主要是应对 http 反向代理的。

但是如果我们想对后端服务的 TCP 进行代理,nginx 支持吗?比如 mysql、redis 等,答案是肯定的,其实 nginx 也是支持对 TCP/UDP 进行负载均衡的,下面要说到的就是 nginx 的 stream 模块,通过配置 stream 可以实现这样的需求,这里还是更多的推荐主要将 nginx 用于 http 反向代理。

正篇

Nginx 的 TCP/UDP 负载均衡是应用 Stream 代理模块(ngx_stream_proxy_module)和 Stream 上游模块(ngx_stream_upstream_module)实现的。Nginx 的 TCP 负载均衡与 LVS 都是四层负载均衡的应用,所不同的是,LVS 是被置于 Linux 内核中的,而 Nginx 是运行于用户层的,基于 Nginx 的 TCP 负载可以实现更灵活的用户访问管理和控制。

基本概念科普完了,下面来看一下具体的配置示例:

worker_processes 4;
worker_rlimit_nofile 40000;

events {
    worker_connections 8192;
}

stream {
    upstream my_servers {
        least_conn;
        # 5s内出现3次错误,该服务器将被熔断5s
        server <IP_SERVER_1>:3306 max_fails=3 fail_timeout=5s;
        server <IP_SERVER_2>:3306 max_fails=3 fail_timeout=5s;
        server <IP_SERVER_3>:3306 max_fails=3 fail_timeout=5s;
    }
    server {
        listen 3306;
        proxy_connect_timeout 5s;  # 与被代理服务器建立连接的超时时间为5s
        proxy_timeout 10s;   # 获取被代理服务器的响应最大超时时间为10s
        proxy_next_upstream on;  # 当被代理的服务器返回错误或超时时,将未返回响应的客户端连接请求传递给upstream中的下一个服务器
        proxy_next_upstream_tries 3;   # 转发尝试请求最多3次
        proxy_next_upstream_timeout 10s;    # 总尝试超时时间为10s
        proxy_socket_keepalive on;  # 开启SO_KEEPALIVE选项进行心跳检测
        
        proxy_pass my_servers;
    }
}

更多说明

  • Nginx 的 TCP/UDP 负载均衡在连接分配时也支持被动健康检测模式,如果与后端服务器建立连接失败,并在 fail_timeout 参数的时间内连续超过 max_fails 参数设置的次数,Nginx 就会将该服务器置为不可用状态,并且在 fail_timeout 参数的时间内不再给该服务器分配连接。当 fail_timeout 参数的时间结束时将尝试分配连接检测该服务器是否恢复,如果可以建立连接,则判定为恢复。
  • 参数 max_fails 是指 10s 内 Nginx 分配给当前服务器的连接失败次数累加值,每 10s 会重置为 0;
  • 参数 fail_timeout 既是失败计数的最大时间,又是服务器被置为失败状态的熔断时间,超过这个时间将再次被分配连接;
  • 参数 proxy_connect_timeout 或 proxy_timeout 为超时状态时,都会触发 proxy_next_upstream 机制;
  • 参数 proxy_next_upstream 是 Nginx 下提高连接成功率的机制,当被代理服务器返回错误或超时时,将尝试转发给下一个可用的被代理服务器;
  • 参数 proxy_next_upstream_tries 的指令值次数包括第一次转发请求的次数。
  • TCP 连接在接收到关闭连接通知前将一直保持连接,当 Nginx 与被代理服务器的两个连续成功的读或写操作的最大间隔时间超过 proxy_timeout 指令配置的时间时,连接将会被关闭。在 TCP 长连接的场景中,应适当调整 proxy_timeout 的设置,同时关注系统内核 SO_KEEPALIVE 选项的配置,可以防止过早地断开连接。

注:如果你配置 steam 模块无效,请检查一下你使用的版本是否支持 stream,如果未内置该模块,你需要在编译的时候指定参数 --with-stream 进行编译使其支持stream代理。

到此这篇关于Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)的文章就介绍到这了,更多相关Nginx stream 配置代理 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
Nginx已编译的nginx-添加新模块
Apr 01 Servers
利用Nginx代理如何解决前端跨域问题详析
Apr 02 Servers
nginx反向代理配置去除前缀案例教程
Jul 26 Servers
Nginx配置文件详解以及优化建议指南
Sep 15 Servers
Z-Order加速Hudi大规模数据集方案分析
Mar 31 Servers
CentOS下安装Jenkins的完整步骤
Apr 07 Servers
Nginx禁止ip访问或非法域名访问
Apr 07 Servers
Apache Hudi 加速传统的批处理模式
Apr 24 Servers
Nginx的gzip相关介绍
May 11 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
win10+RTX3050ti+TensorFlow+cudn+cudnn配置深度学习环境的方法
Jun 25 Servers
Apache SkyWalking 监控 MySQL Server 实战解析
Sep 23 Servers
Nginx源码编译安装过程记录
Nov 17 #Servers
Nginx 路由转发和反向代理location配置实现
Nov 11 #Servers
nginx中proxy_pass各种用法详解
Apache POI的基本使用详解
nginx实现动静分离的方法示例
Nginx内网单机反向代理的实现
Nov 07 #Servers
zabbix自定义监控nginx状态实现过程
You might like
php文件系统处理方法小结
2016/05/23 PHP
php变量与数组相互转换的方法(extract与compact)
2016/12/02 PHP
PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】
2019/06/14 PHP
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
IE事件对象(The Internet Explorer Event Object)
2012/06/27 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
jquery实现网站超链接和图片提示效果
2013/03/21 Javascript
在HTML代码中使用JavaScript代码的例子
2014/10/16 Javascript
javascript实现图片轮播效果
2016/01/20 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
移动端刮刮乐的实现方式(js+HTML5)
2017/03/23 Javascript
微信小程序 自定义Toast实例代码
2017/06/12 Javascript
vue-cli3.0配置及使用注意事项详解
2018/09/05 Javascript
详解Vue前端对axios的封装和使用
2019/04/01 Javascript
javascript面向对象三大特征之多态实例详解
2019/07/24 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
python之MSE、MAE、RMSE的使用
2020/02/24 Python
Python无头爬虫下载文件的实现
2020/04/02 Python
Python xlwings插入Excel图片的实现方法
2021/02/26 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
波兰运动鞋网上商店:Distance.pl
2020/07/30 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
EJB实例的生命周期
2016/10/28 面试题
汇科协同Java笔试题
2012/03/31 面试题
网络书店创业计划书
2014/02/07 职场文书
产品质量承诺书
2014/03/27 职场文书
抽奖活动主持词
2014/03/31 职场文书
安康杯竞赛活动总结
2014/05/05 职场文书
实习推荐信
2014/05/10 职场文书
检察院起诉意见书
2015/05/20 职场文书
七年级英语教学反思
2016/02/15 职场文书
文明医院的标语集锦!
2019/07/24 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
2022/04/29 Servers