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 作者:子木