http负载均衡

环境

前端nginx:
lb01:192.168.37.11
后端web:
web01:192.168.37.13
web02:192.168.37.14

前提:是我们已经在前面的nginx主配置文件中设置了http和TCP包含的子目录:

http{                                                #HTTP流量
.
.
server{
.
.
}
    include /etc/nginx/nginx.d/vhost/*.conf;         #新建的虚拟服务器配置文件都放在这个目录下
}
stream{                                              #TCP和UDP流量
    include /etc/nginx/nginx.d/stream/*.conf;
}
实例

首先看一下http负载均衡的实例配置文件,然后我们再去分步讲解:

[root@test11 ~]# vim /etc/nginx/conf.d/vhost/backend.example.com.conf
upstream backend {                           #定义后端服务器组
    server 192.168.37.13:80;                 #80端口是默认的,可以不写,非80端口请必须更改为相应端口
    server 192.168.37.14:80;
    server 192.168.37.15 backup;             #表示当前server是备用服务器,当其它非backup服务器挂了以后该服务器才会启用
#   server 192.168.37.15 down;               #如果需要从负载平衡轮换中临时删除其中一个服务器,则可以使用该down参数对其进行标记
}

server {
    listen 80;
    server_name backend.example.com;          #在lb01上要加hosts解析,因为这个域名是自己定义的测试域名

    location / {
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header REMOTE-HOST $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://backend;            #将请求传递到服务器组
    }
    access_log /usr/share/nginx/logs/backend/access.log main;
    error_log /usr/share/nginx/logs/backend/error.log;
}
负载调度算法
  • 轮询:请求在服务器之间均匀分布,并考虑服务器权重。默认情况下使用此方法
    upstream backend {
      server 192.168.37.13;
      server 192.168.37.14;
    }
  • 最少连接:将请求发送到具有最少活动连接数的服务器,同时考虑服务器权重
    upstream backend {
      least_conn;
      server 192.168.37.13;
      server 192.168.37.14;
  • 每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。
    upstream backend {
      ip_hash;
      server 192.168.37.13;
      server 192.168.37.14;
  • 通用哈希,发送请求的服务器是从用户定义的密钥确定的,该密钥可以是文本字符串,变量或组合
    upstream backend {
      hash $request_uri consistent;
      server 192.168.37.13;
      server 192.168.37.14;
服务器权重
  • 默认情况下,NGINX使用轮询方法根据权重在组中的服务器之间分配请求。server用weight参数设置服务器的权重; 默认值为1
    upstream backend {
      server 192.168.37.13 weight = 5;              #权重越大,被请求的几率越大
      server 192.168.37.14;
    }

http健康检查

被动健康检查

对于被动健康检查,NGINX会在事件发生时对其进行监控,并尝试恢复失败的连接。如果仍然无法恢复交易,NGINX会将服务器标记为不可用,并暂时停止向其发送请求,直到它再次标记为活动状态。

  • fail_timeout - 设置服务器标记为不可用时必须进行多次失败尝试的时间,以及服务器标记为不可用的时间(默认为10秒)。
  • max_fails - 设置在fail_timeout服务器标记为不可用期间必须发生的失败尝试次数(默认为1次尝试)。
  • 在以下示例中,如果NGINX未能在30秒内向服务器发送请求或未收到响应3次,则表示服务器在30秒内不可用:
    upstream backend {
      server 192.168.37.13;
      server 192.168.37.14 max_fails = 3  fail_timeout = 30s;
    }
积极健康检查

注意,这个模块并不随NGINX源一起分发,安装此模块参考:https://www.nginx.com/resources/wiki/modules/healthcheck/#healthcheck-installation

  • 在location将requests(proxy_pass)传递给上游组的过程中,包含health_check指令:
    server {
      location / {
          proxy_pass http://backend;
          health_check;
      }
    }
  • 您可以指定另一个用于运行状况检查的端口,例如,用于监视同一主机上的许多服务的运行状况。使用指令的port参数指定新端口health_check:
    server {
      location / {
          proxy_pass   http://backend;
          health_check port=8080;
      }
    }
  • 在上游服务器组中,使用zone指令定义共享内存区域:
    upstream backend {
      zone backend 64k;
      server 192.168.37.13;
      server 192.168.37.14;
  • 可以使用health_check指令的参数覆盖活动运行状况检查的默认值:
    location / {
      proxy_pass http://backend;
      health_check interval=10 fails=3 passes=2;
    }

TCP和UDP负载均衡

实例
[root@test11 ~]# vim /etc/nginx/conf.d/stream/tcp873.example.com
upstream tcp873 {
    hash $remote_addr consistent;
    server 192.168.37.14:873;
}

server {
    listen 873;
    proxy_connect_timeout 1s;
    proxy_pass tcp873;

}

注意:对于UDP流量,还包括udp参数。由于TCP是stream上下文的默认协议,因此指令没有tcp参数listen

server {
        listen     12345;
        #TCP traffic will be forwarded to the "stream_backend" upstream group
        proxy_pass stream_backend;
    }

server {
        listen     53 udp;
        #UDP traffic will be forwarded to the "dns_servers" upstream group
        proxy_pass dns_servers;
    }
负载调度算法
  • 轮询:默认情况下,NGINX使用循环算法对流量进行负载平衡,将其顺序​​指向配置的上游组中的服务器。因为它是默认方法,所以没有round‑robin指令; 只需在顶级上下文中创建配置块,然后按照上一步中的说明添加指令。upstream {}stream {}server,参照上面http负载调度算法!
  • 最少连接:NGINX选择具有较少数量的当前活动连接的服务器,参照上面http负载调度算法!
  • 哈希 - NGINX根据用户定义的密钥选择服务器,例如,源IP地址($remote_addr),该Hash负载平衡方法也可以用来配置会话持久性。由于散列函数基于客户端IP地址,因此来自给定客户端的连接始终传递到同一服务器,除非服务器已关闭或不可用。指定可选consistent参数以应用一致性散列方法,例如上面TCP和UDP负载均衡实例!
  • 对于每个上游服务器,指定服务器特定的参数,包括最大连接数,服务器权重等,如下:
    upstream stream_backend {
      hash   $remote_addr consistent;
      server 192.168.37.13:12345 weight=5;
      server 192.168.37.14:12345 max_conns=3;
    }

TCP、UDP健康检查

被动健康检查

配置参考http被动健康检查!

主动健康检查

配置参考http主动健康检查!

文档更新时间: 2019-07-30 11:22   作者:子木