Nginx负载均衡--TCP/UDP流

栏目: 服务器 · Nginx · 发布时间: 5年前

内容简介:负载均衡是指在多个后端服务器之间有效地分配网络流量。从NGINX Plus R5[1] 版本开始可以代理和负载均衡传输控制协议(Transmission Control Protocol,TCP)通信。TCP是许多流行应用程序和服务的协议,如LDAP、MySQL和RTMP。

Nginx负载均衡--TCP/UDP流

负载均衡是指在多个后端服务器之间有效地分配网络流量。

从NGINX Plus R5[1] 版本开始可以代理和负载均衡传输控制协议(Transmission Control Protocol,TCP)通信。TCP是许多流行应用程序和服务的协议,如LDAP、 MySQL 和RTMP。

从NGINX Plus R9[2]版本开始可以代理和负载平衡UDP流量。用户数据报协议(User Datagram Protocol,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-domain socket路径:

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.Round Robin:默认情况下,NGINX使用循环算法对流进行负载平衡,将其顺序指向配置的upstream组中的服务器。因为它是默认方法,所以没有round-robin指令;只需在顶级stream{}上下文中创建upstream{}配置块,

2.最少连接(Least Connections)–nginx选择当前活动连接数较少的服务器。

Syntax:    least_conn; 
Default:    — 
Context:    upstream 

3.最少时间-NGINX Plus选择平均延迟最低且活动连接数最少的服务器。 用于计算最低平均延迟的方法取决于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: upstreamThis directive appeared in version 1.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; 
    } 
} 

结束。

[1]: https://docs.nginx.com/nginx/releases/#r5

[2]: https://docs.nginx.com/nginx/releases/#r9


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web信息架构(第3版)

Web信息架构(第3版)

Peter Morville、Louis Rosenfeld / 陈建勋 / 电子工业出版社 / 2008年8月 / 85.00

本书涵盖了信息架构基本原理和实践应用的方方面面。全书共7个部分,包括信息架构概述、信息架构的基本原理、信息架构的开发流程和方法论、信息架构实践、信息架构与组织、两个案例研究,以及参考资料清单。 本书兼具较高的理论价值和实用价值,曾被Web设计领域多本书籍重点推荐,是信息架构领域公认的经典书,不论新手还是专家都能各取所需。本书可供Web设计与开发者、Web架构师、网站管理者及信息管理相关人员参......一起来看看 《Web信息架构(第3版)》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换