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的默认端口
Mar 31 Servers
centos8安装nginx1.9.1的详细过程
Aug 02 Servers
Nginx使用Lua模块实现WAF的原理解析
Sep 04 Servers
Linux安装apache服务器的配置过程
Nov 27 Servers
Kubernetes部署实例并配置Deployment、网络映射、副本集
Apr 01 Servers
基于Apache Hudi在Google云构建数据湖平台的思路详解
Apr 07 Servers
Linux下使用C语言代码搭建一个简单的HTTP服务器
Apr 13 Servers
使用Nginx的访问日志统计PV与UV
May 06 Servers
Nginx 匹配方式
May 15 Servers
项目中Nginx多级代理是如何获取客户端的真实IP地址
May 30 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
Apache Kafka 分区重分配的实现原理解析
Jul 15 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 设计模式之观察者模式介绍
2012/02/22 PHP
浅谈php serialize()与unserialize()的用法
2013/06/05 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
Yii框架安装简明教程
2020/05/15 PHP
jquery 多行滚动代码(附详细解释)
2010/06/17 Javascript
JavaScript中为什么null==0为false而null大于=0为true(个人研究)
2013/09/16 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
nodejs实现获取当前url地址及url各种参数值
2015/06/25 NodeJs
jquery实现一个简单的表单验证实例
2016/03/30 Javascript
Bootstrap开发实战之第一次接触Bootstrap
2016/06/02 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
小程序云开发部署攻略(图文教程)
2018/10/30 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
WebStorm中如何将自己的代码上传到github示例详解
2020/10/28 Javascript
[05:06]TI4西雅图DOTA2前线报道 海涛密探LGD训练
2014/07/09 DOTA
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
手把手教你如何安装Pycharm(详细图文教程)
2018/11/28 Python
pandas 层次化索引的实现方法
2019/07/06 Python
python 实现手机自动拨打电话的方法(通话压力测试)
2019/08/08 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
PyCharm使用之配置SSH Interpreter的方法步骤
2019/12/26 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
浅析Python __name__ 是什么
2020/07/07 Python
一款纯css3实现简单的checkbox复选框和radio单选框
2014/11/05 HTML / CSS
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
俄罗斯在线水暖商店:Perfecto.ru
2019/10/25 全球购物
华为慧通面试题
2012/09/11 面试题
办公室文秘自我鉴定
2013/09/21 职场文书
初中英语演讲稿
2014/04/29 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
2014会计年终工作总结
2014/12/20 职场文书
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技