现在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 http://backend1.example.com:12345 weight=5;

server backend2.example.com:12345;

server http://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 http://backend1.example.com:12345 weight=5;

server backend2.example.com:12345;

server http://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开发方面内容的小伙伴,请关注小猿圈官网观看,小猿圈竭力为你提供更全面更有竞争力的视频,希望对你有所帮助。

nginx tcp代理_小猿圈linux教程之Nginx负载均衡TCP/UDP流相关推荐

  1. linux 关机命令_小猿圈Linux基础命令汇总

    科技进步的今天,互联网不断的发展,很多人学习Linux运维的时候会因为记不住一些命令从而去找一些渠道,有时候因为找不到linux的命令而烦恼,下面是小猿圈linux讲师给大家总结的linux基础命令, ...

  2. 小猿圈html5教程之canvas绘制线段方法

    HTML5现在是时下较火的编程语言之一,但是对于怎么学习很多朋友都是不了解的,不知道从何处下手,针对以上内容小猿圈web前端讲师每天会分享一个web前端知识,希望对你的前端学习有一定的帮助,今天分享的 ...

  3. linux工程师前景_小猿圈预测2019年Linux云计算发展前景

    近几年,新技术不断地更新,领域不断地扩大云计算.大数据.python持续发展,领跑在互联网行业的全面,造成市场需要更多这方面的人才,需求量加大,也造成了现在学习Linux的人群也相对较多,2019年l ...

  4. linux将字符串转小写_小猿圈总结Linux常见命令(一)

    科技发展的今天,互联网不断的发达,很多人学习Linux云计算的时候回因为记不住一些命令从而去找度娘,有时候因为因为找不到linux的命令而烦恼,下面是小猿圈linux讲师给大家总结的linux常见命令 ...

  5. 小猿圈Linux零基础自学之路

    对于不是科班出身的IT从业者,其实刚开始学习是很难的,特别是没有人带的时候,有时候一个问题可以困扰你几天甚至几周,小猿圈Linux讲师给大家讲一个linux学员的自学之路,希望对大家有所启发. 对于L ...

  6. 小猿圈Linux基础面试题,看看你能答对几道?

    最近身边的很多朋友都在学习linux,从最开始的安装软件都需要百度一天的他们,现在已经成长为了,不需要百度就可以把自己弄懵圈的了,接下来的几天小猿圈linux老师会为大家准备一些实用的linux技巧分 ...

  7. 小猿圈linux之使用VMware workstation安装Linux虚拟机

    虚拟机就是在实体机中虚拟出的系统,指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统,大家可以用户测试,分机等用途,那么小编就把VMware Workstation安装方 ...

  8. 小猿圈Linux视频教程常见问题汇总

    小猿圈Linux视频教程白老师总结了一下关于同学们在观看学习平台Linux视频教程时一些常见问题,并作出了详细的解答,下面我们一起来看一下吧! 小猿圈Linux视频教程常见问题汇总: 一.什么是中断描 ...

  9. 小猿圈Linux学习-Linux种搜索的命令

    做Linux工程师的每天都不能少的工作就是搜索文件,这是他们的日常活动,很繁琐很枯燥,所以我们就需要知道一些搜索的命令,这些命令更高效更快捷,今天小猿圈就给大家分享4个可以搜索的Linux命令.. 方 ...

  10. 小猿圈linux之运维工程师面试题(答案版)

    小编在前几篇文章中写过两篇运维工程师面试题,今天接着上次的内容继续,如果做完这套面试题,感觉还不错,可以翻一下小编前两套,小猿圈带你突破面试的难关,走上自己热爱的运维岗位. 1.常见的Linux发行版 ...

最新文章

  1. 将Centos的yum源更换为国内的阿里云源
  2. python爬虫自学网站_Python爬虫3步曲:5分钟学习用Python解析网页
  3. [论文收集] ICSOC 2008 论文
  4. Android之使用getIdentifier()获取资源Id
  5. [骗分技巧——随机化Ⅱ] [Poi2014]Couriers,CodeChef - TKCONVEX
  6. httpRuntime 问题
  7. 【Python】模块学习之ConfigParser读写配置信息
  8. bzoj4448 [Scoi2015]情报传递
  9. 基于2440的Linux开发原理,基于S3C2440和Linux的嵌入式网络驱动程序开发
  10. C++ 布隆过滤器原理及实现
  11. webpack-dev-server 设置反向代理解决跨域问题
  12. jieba分词的原理
  13. 20个必不可少的Python第三方库(存干货分享)!
  14. ai作文批改_网易有道词典再推AI作文批改新功能
  15. 细胞治疗质量控制解决方案
  16. 天津大学计算机软件技术基础试题答案,天津大学网络学院计算机软件技术基础-1试题b卷.doc...
  17. 不谋全局者不足以谋一域,不谋万世者不足以谋一时
  18. ABAP调用外部webservice 问题
  19. 后端每天更新微信用户用户头像
  20. 【Paper Reading】

热门文章

  1. tray filled with nike air max light snacks
  2. android selector 的item/不能是空节点
  3. 动态组合sql语句详解
  4. leetcode [35]搜索插入位置/Search Insert Position 优雅的暴力可能比二分查找效率更高
  5. iOS开发之来自一线开发者的Swift学习资源推荐
  6. Wondershare Recoverit for Mac(数据恢复软件)
  7. 巧用MacOS的勿扰模式,解决广告弹窗
  8. 想要轻松制作GIF图片,来看篇超全面的分析!
  9. 如果Mac在播放音乐时遇到问题,没有声音或无法调整音量,该怎么办呢?
  10. asp.net core 系列之用户认证(authentication)