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

从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配置参数来启用它。如下配置:

  1. ./configure  --prefix=/usr/local/nginx --with-stream

配置反向代理

配置反向代理,以便NGINX打开资源,将来自客户端的TCP连接或UDP数据报转发到upstream组或代理服务器。

A. 配置反向代理之前,看一下ngx_stream_core_module模块中几个元素的语法:

  • stream块,在配置文件中是***块,和http块属于同一级别,语法如下:
  1. Syntax:    stream { ... }
  2. Default:    —
  3. Context:    main
  • server块,配置一个服务。在***stream{}上下文中为每个虚拟服务器定义一个或多个服务器配置块。语法如下:
  1. Syntax:    server { ... }
  2. Default:    —
  3. Context:    stream

listen指令,设置服务器将接受连接的套接字的地址和端口。可以只指定端口。地址也可以是主机名,例如:

  1. 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]];
  2. Default:    —
  3. Context:    server

示例如下:

  1. listen 127.0.0.1:12345;
  2. listen *:12345;
  3. listen 12345;     # same as *:12345
  4. listen localhost:12345;

listen指令在此默认协议是TCP协议,对于UDP流,需要指定udp参数,如下:

  1. listen 12345 udp;

B. 使用ngx_stream_proxy_module模块(默认是编译进来的)的proxy_pass指令配置代理,proxy_pass指令语法:

  1. Syntax:    proxy_pass address;
  2. Default:    —
  3. Context:    server

设置被代理服务器的地址。地址可以定义为一个域名或IP地址和一个端口号:

  1. proxy_pass localhost:12345;

或一个UNIX-domain socket路径:

  1. proxy_pass unix:/tmp/stream.socket;

C. 如果代理服务器有多个网络接口,可以配置NGINX使用特定的源IP地址去连接upstream服务器。这可能很有用,当一个代理服务器在nginx后面,并配置了接受来自特定IP网络或IP地址范围的连接。

使用ngx_stream_proxy_module模块的proxy_bind指令,其语法:

  1. Syntax:    proxy_bind address [transparent] | off;
  2. Default:    —
  3. Context:    stream, server
  4. #此指令在1.9.2版本中开始使用。

从指定的本地IP地址向被代理服务器发起外部连接。特殊值off取消从上层配置中继承的proxy_bind指令产生的影响,允许系统自动分配本地IP地址。

transparent参数(1.11.0+)允许从一个非本地IP地址发起到被代理服务器的外部连接,例如从一个客户端的真实IP地址:

  1. proxy_bind $remote_addr transparent;

为了使此参数起作用,通常需要使用超级用户权限运行nginx工作进程。 在Linux上,不需要(1.13.8+),就像指定了transparent参数一样,工作进程从主进程继承CAP_NET_RAW功能。 还需要配置核心路由表以拦截来自被代理服务器的网络流量。

示例配置如下:

  1. stream {
  2. # ...
  3. server {
  4. listen            127.0.0.1:12345;
  5. proxy_pass        backend.example.com:12345;
  6. proxy_buffer_size 16k;
  7. #proxy_bind 127.0.0.1:12345;
  8. }
  9. }

负载均衡

使用ngx_stream_upstream_module模块(默认是编译进来的)的upstream指令。指令语法:

  1. Syntax:    upstream name { ... }
  2. Default:    —
  3. Context:    stream

定义一组服务器。 服务器可以侦听不同的端口。 此外,可以混合侦听TCP和UNIX域套接字的服务器。

在***stream{}上下文中定义一个或多个upstream{}配置块,并设置upstream组的名称,例如TCP服务器的stream_backend和UDP服务器的dns_servers:

  1. stream {
  2. upstream stream_backend {
  3. server backend1.example.com:12345;
  4. server backend2.example.com:12345;
  5. server backend3.example.com:12346;
  6. }
  7. upstream dns_servers {
  8. server 192.168.136.130:53;
  9. server 192.168.136.131:53;
  10. }
  11. }

配置upstream组使用的负载均衡方法。 可以指定以下方法之一:

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

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

  1. Syntax:    least_conn;
  2. Default:    —
  3. Context:    upstream

3.最少时间-NGINX Plus选择平均延迟***且活动连接数最少的服务器。 用于计算***平均延迟的方法取决于least_time指令中包含以下哪个参数:

  1. Syntax:    least_time connect | first_byte | last_byte [inflight];
  2. Default:    —
  3. Context:    upstream

A. connect - 连接upstream服务器的时间

B. first_byte - 接收数据的***个字节的时间

C. last_byte - 从服务器接收完整响应的时间,如果指定了inflight参数(1.11.6+),则还会考虑不完整的连接。

4.哈希 - NGINX根据用户定义的key,选择服务器。

  1. Syntax:    hash key [consistent];
  2. Default:    —
  3. Context:    upstream

Hash负载平衡方法还用于配置会话持久性。 由于散列函数基于客户端IP地址,因此来自给定客户端的连接始终传递到同一服务器,除非服务器已关闭或不可用。 指定可选的consistent参数以应用ketama一致性散列方法:

  1. 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)

随机负载平衡方法应该用于多个负载均衡器将请求传递到同一组后端的分布式环境.

示例:

  1. stream {
  2. upstream stream_backend {
  3. hash   $remote_addr consistent;
  4. server backend1.example.com:12345 weight=5;
  5. server backend2.example.com:12345;
  6. server backend3.example.com:12346 max_conns=3;
  7. }
  8. upstream dns_servers {
  9. least_conn;
  10. server 192.168.136.130:53;
  11. server 192.168.136.131:53;
  12. }
  13. }

完整示例

  1. stream {
  2. upstream stream_backend {
  3. hash   $remote_addr consistent;
  4. server backend1.example.com:12345 weight=5;
  5. server backend2.example.com:12345;
  6. server backend3.example.com:12346 max_conns=3;
  7. }
  8. upstream dns_servers {
  9. least_conn;
  10. server 192.168.136.130:53;
  11. server 192.168.136.131:53;
  12. }
  13. server {
  14. listen            12345;
  15. proxy_pass        stream_backend;
  16. proxy_buffer_size 16k;
  17. #proxy_bind 127.0.0.1:12345;
  18. }
  19. server {
  20. listen            53 udp;
  21. proxy_pass        dns_servers;
  22. proxy_buffer_size 16k;
  23. }
  24. }

结束。

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

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

Nginx负载均衡之TCP/UDP流的更多相关文章

  1. Nginx负载均衡后端健康检查(支持HTTP和TCP)

    之前有一篇文章记录nginx负载均衡后端检查,链接为 https://www.cnblogs.com/minseo/p/9511456.html 但是只包含http健康检查不包含tcp下面安装ngin ...

  2. Nginx负载均衡——基础功能

    熟悉Nginx的小伙伴都知道,Nginx是一个非常好的负载均衡器.除了用的非常普遍的Http负载均衡,Nginx还可以实现Email,FastCGI的负载均衡,甚至可以支持基于Tcp/UDP协议的各种 ...

  3. Nginx负载均衡——扩展功能(NGINX Plus)

    本文主要是介绍了NGINX Plus的相关功能,横跨了NGINX Plus R5/R6/R7/R9等各个不同版本的更新. 什么是NGINX Plus? 顾名思义,就是Nginx的加强版或者扩展版.我们 ...

  4. LVS+nginx负载均衡知识点1

    lvs+nginx负载均衡 1       学习目标 掌握什么是负载均衡及负载均衡的作用和意义. 了解lvs负载均衡的三种模式. 了解lvs-DR负载均衡部署方法. 掌握nginx实现负载均衡的方法. ...

  5. lvs+nginx负载均衡

    1       学习目标 掌握什么是负载均衡及负载均衡的作用和意义. 了解lvs负载均衡的三种模式. 了解lvs-DR负载均衡部署方法. 掌握nginx实现负载均衡的方法. 掌握lvs+nginx负载 ...

  6. Load Balancing with NGINX 负载均衡算法

    Using nginx as HTTP load balancer Using nginx as HTTP load balancer http://nginx.org/en/docs/http/lo ...

  7. nginx负载均衡浅析

    熟悉Nginx的小伙伴都知道,Nginx是一个非常好的负载均衡器.除了用的非常普遍的Http负载均衡,Nginx还可以实现Email,FastCGI的负载均衡,甚至可以支持基于Tcp/UDP协议的各种 ...

  8. 对比Haproxy和Nginx负载均衡效果

    为了对比Hproxy和Nginx负载均衡的效果,分别在测试机上(以下实验都是在单机上测试的,即负载机器和后端机器都在一台机器上)做了这两个负载均衡环境,并各自抓包分析.下面说下这两种负载均衡环境下抓包 ...

  9. Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用

    上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡,若出现Nginx单机故障,则导致整个系统无法正常运行.针对系统架构设计的高可用要求,我们需要解决Nginx ...

随机推荐

  1. JavaScript.Remove

    Array.prototype.remove = function (from, to) {     var rest = this.slice((to || from) + 1 || this.le ...

  2. Jenkins设置默用户为root

    https://www.jianshu.com/p/181dfb259dc7 最近在需要在jenkins执行shell脚本,由于Jenkins之前是默认在线安装的,这样jenkins设置了默认用户je ...

  3. Arrays工具类使用与源码分析(1)

    Arrays工具类主要是方便数组操作的,学习好该类可以让我们在编程过程中轻松解决数组相关的问题,简化代码的开发. Arrays类有一个私有的构造函数,没有对外提供实例化的方法,因此无法实例化对象.因为 ...

  4. 洛谷 P1339 [USACO09OCT]热浪Heat Wave(dijkstra)

    题目链接 https://www.luogu.org/problemnew/show/P1339 最短路 解题思路 dijkstra直接过 注意: 双向边 memset ma数组要在读入之前 AC代码 ...

  5. python爬取企业登记业务

    import requests from lxml import etree import csv for i in range(10, 990, 10): url = "http://12 ...

  6. CodeChef A String Game(SG)

    A String Game   Problem code: ASTRGAME   Submit All Submissions   All submissions for this problem a ...

  7. WEB应用安全解决方案测试验证

    WEB应用安全解决方案测试报告 --- By jiang.jx at 2017-08-11 WEB应用安全解决方案.docx 链接:https://share.weiyun.com/068b05467 ...

  8. 【学习总结】Python-3-转义字符

    参考: 本教程的评论区:菜鸟教程-Python3-Python数字 转义字符: 在需要在字符中使用特殊字符时,python用反斜杠()转义字符 END

  9. Kaldi学习手记(一):Kaldi的编译安装

    下载 安装git sudo apt-get install git 下载Kaldi git clone https://github.com/kaldi-asr/kaldi.git kaldi-tru ...

  10. 基于GPU的图像处理平台

    基于GPU的图像处理平台 1.  (309)英伟达推Jetson TX1 GPU模块力推人工智能 1.1 产品概述 Jetson TX1 GPU模块,主要针对近年来蓬勃发展的人工智能市场,包括无人机. ...