设为首页 收藏本站
查看: 1281|回复: 0

[新闻资讯] 小猿圈linux教程之Nginx负载均衡TCP/UDP流

[复制链接]
累计签到:3 天
连续签到:3 天
发表于 2019-7-5 16:48:49 | 显示全部楼层 |阅读模式
现在IT发展迅速,大多数朋友无论是什么行业或者岗位都在或多或少的学习一些体方面的知识,而linux又是最受欢迎的一种。今天小猿圈linux老师为你分享一下Nginx负载均衡TCP/UDP流,感兴趣的朋友一起看看吧。



从NGINXPlusR5[1]版本开始可以代理和负载均衡传输控制协议(TransmissionControlProtocol,TCP)通信。TCP是许多流行应用程序和服务的协议,如LDAP、MySQL和RTMP。
从NGINXPlusR9[2]版本开始可以代理和负载平衡UDP流量。用户数据报协议(UserDatagramProtocol,UDP)是许多流行的非事务性应用程序的协议,如DNS、syslog和RADIUS。
反向代理
基础条件
需要使用ngx_stream_core_module模块,该模块从版本1.9.0开始可用。这个模块在默认情况下是不构建的,需使用--with-stream配置参数来启用它。如下配置:
./configure  --prefix=/usr/local/nginx --with-stream
配置反向代理
配置反向代理,以便NGINX打开资源,将来自客户端的TCP连接或UDP数据报转发到upstream组或代理服务器。
A.配置反向代理之前,看一下ngx_stream_core_module模块中几个元素的语法:
stream块,在配置文件中是顶级块,和http块属于同一级别,语法如下:
Syntax:    stream { ... }
Default:    —
Context:    main
server块,配置一个服务。在顶级stream{}上下文中为每个虚拟服务器定义一个或多个服务器配置块。语法如下:
Syntax:    server { ... }
Default:    —
Context:    stream
listen指令,设置服务器将接受连接的套接字的地址和端口。可以只指定端口。地址也可以是主机名,例如:
Syntax:    listen address:port [ssl] [udp] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]];
Default:    —
Context:    server
示例如下:
listen 127.0.0.1:12345;
listen *:12345;
listen 12345;    # same as *:12345
listen localhost:12345;
listen指令在此默认协议是TCP协议,对于UDP流,需要指定udp参数,如下:
listen 12345 udp;
B.使用ngx_stream_proxy_module模块(默认是编译进来的)的proxy_pass指令配置代理,proxy_pass指令语法:
Syntax:    proxy_pass address;
Default:    —
Context:    server
设置被代理服务器的地址。地址可以定义为一个域名或IP地址和一个端口号:
proxy_pass localhost:12345;
或一个UNIX-domainsocket路径:
proxy_pass unix:/tmp/stream.socket;
C.如果代理服务器有多个网络接口,可以配置NGINX使用特定的源IP地址去连接upstream服务器。这可能很有用,当一个代理服务器在nginx后面,并配置了接受来自特定IP网络或IP地址范围的连接。
使用ngx_stream_proxy_module模块的proxy_bind指令,其语法:
Syntax:    proxy_bind address [transparent] | off;
Default:    —
Context:    stream, server
#此指令在1.9.2版本中开始使用。
从指定的本地IP地址向被代理服务器发起外部连接。特殊值off取消从上层配置中继承的proxy_bind指令产生的影响,允许系统自动分配本地IP地址。
transparent参数(1.11.0+)允许从一个非本地IP地址发起到被代理服务器的外部连接,例如从一个客户端的真实IP地址:
proxy_bind $remote_addr transparent;
为了使此参数起作用,通常需要使用超级用户权限运行nginx工作进程。在Linux上,不需要(1.13.8+),就像指定了transparent参数一样,工作进程从主进程继承CAP_NET_RAW功能。还需要配置核心路由表以拦截来自被代理服务器的网络流量。
示例配置如下:
stream {
    # ...
    server {
        listen            127.0.0.1:12345;
        proxy_pass        backend.example.com:12345;
        proxy_buffer_size 16k;
        #proxy_bind 127.0.0.1:12345;
    }
}
负载均衡
使用ngx_stream_upstream_module模块(默认是编译进来的)的upstream指令。指令语法:
Syntax:    upstream name { ... }
Default:    —
Context:    stream
定义一组服务器。服务器可以侦听不同的端口。此外,可以混合侦听TCP和UNIX域套接字的服务器。
在顶级stream{}上下文中定义一个或多个upstream{}配置块,并设置upstream组的名称,例如TCP服务器的stream_backend和UDP服务器的dns_servers:
stream {
    upstream stream_backend {
        server backend1.example.com:12345;
        server backend2.example.com:12345;
        server backend3.example.com:12346;
    }
    upstream dns_servers {
        server 192.168.136.130:53;
        server 192.168.136.131:53;
    }
}
配置upstream组使用的负载均衡方法。可以指定以下方法之一:
1.RoundRobin:默认情况下,NGINX使用循环算法对流进行负载平衡,将其顺序指向配置的upstream组中的服务器。因为它是默认方法,所以没有round-robin指令;只需在顶级stream{}上下文中创建upstream{}配置块,
2.最少连接(LeastConnections)–nginx选择当前活动连接数较少的服务器。
Syntax:    least_conn;
Default:    —
Context:    upstream
3.最少时间-NGINXPlus选择平均延迟最低且活动连接数最少的服务器。用于计算最低平均延迟的方法取决于least_time指令中包含以下哪个参数:
Syntax:    least_time connect | first_byte | last_byte [inflight];
Default:    —
Context:    upstream
A.connect-连接upstream服务器的时间
B.first_byte-接收数据的第一个字节的时间
C.last_byte-从服务器接收完整响应的时间,如果指定了inflight参数(1.11.6+),则还会考虑不完整的连接。
4.哈希-NGINX根据用户定义的key,选择服务器。
Syntax:    hash key [consistent];
Default:    —
Context:    upstream
Hash负载平衡方法还用于配置会话持久性。由于散列函数基于客户端IP地址,因此来自给定客户端的连接始终传递到同一服务器,除非服务器已关闭或不可用。指定可选的consistent参数以应用ketama一致性散列方法:
hash $remote_addr consistent;
5.random-每个连接将传递给随机选择的服务器。如果指定了two参数,首先,NGINX会考虑服务器权重随机选择两台服务器,然后使用指定的方法选择其中一台服务器:
Syntax:random[two[method]];Default:—Context:upstreamThisdirectiveappearedinversion1.15.1.
A.least_conn-活动连接数最少
B.least_time=connect-连接上游服务器的时间($upstream_connect_time)少了美元符号
C.least_time=first_byte-从服务器接收第一个数据字节的平均时间最短($upstream_first_byte_time)
D.least_time=last_byte-从服务器接收最后一个数据字节的平均时间最短($upstream_session_time)
随机负载平衡方法应该用于多个负载均衡器将请求传递到同一组后端的分布式环境.
示例:
stream {
    upstream stream_backend {
        hash  $remote_addr consistent;
        server backend1.example.com:12345 weight=5;
        server backend2.example.com:12345;
        server backend3.example.com:12346 max_conns=3;
    }
    upstream dns_servers {
        least_conn;
        server 192.168.136.130:53;
        server 192.168.136.131:53;
    }
}
完整示例
stream {
    upstream stream_backend {
        hash  $remote_addr consistent;
        server backend1.example.com:12345 weight=5;
        server backend2.example.com:12345;
        server backend3.example.com:12346 max_conns=3;
    }
    upstream dns_servers {
        least_conn;
        server 192.168.136.130:53;
        server 192.168.136.131:53;
    }
    server {
        listen            12345;
        proxy_pass        stream_backend;
        proxy_buffer_size 16k;
        #proxy_bind 127.0.0.1:12345;
    }
    server {
        listen            53 udp;
        proxy_pass        dns_servers;
        proxy_buffer_size 16k;
    }
}
最后想要了解更多关于Linux开发方面内容的小伙伴,请关注小猿圈官网观看,小猿圈竭力为你提供更全面更有竞争力的视频linux自学交流1群:819805410,希望对你有所帮助。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-914877-1-1.html 上篇帖子: 小猿圈Java教程之浅谈static变量能继承吗 下篇帖子: 小猿圈web前端解读JS前端知识点整理总结
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表