1、定义一个虚拟资源池
Syntax: upstream name { ... }
Default: —
Context: http
2、定义资源池中服务器的地址和其状态
Syntax: server address [parameters];
Default: —
Context: upstream
address此地址一般指定为域名或者IP地址,后可接端口。parameters可选参数如下:
◇ backup:热备服务器,当其他所有服务器不能访问时,自动启用。
◇ down:当前的server不可用。
◇ weight=number:加权轮询,设置服务器的权重,其值越大分配到的访问越多,默认为1。
◇ max_conns=number
▪ 限制同时活动连接的最大数量,默认值为零,表示没有限制。注意每一个请求都算活动连接,如果网页完全出来需要10个请求,那么此处配置2,只会有两个请求成功,其余请求返回502。
◇ fail_timeout=time:
▪ 定义和服务器的通信失败尝试重连的时间范围,如果在这个时间范围内失败超过次数,则接下来这个时间段里服务器被当作不可用。
◇ max_fails=number:
▪ 定义在被fail_timeout参数定义的时间内和服务器通信失败最大可尝试的次数。默认值为1,适用于下面;配置为0,表示不限制失败可尝试次数。
▪ 通俗点说,当没有配置fail_timeout时,如果此值设置为2,那么默认在10秒内连接失败两次,则随后10秒服务器不可用(即便服务在不可用的时间段里恢复了正常),10秒后才会去尝试连接服务器是否可用,如果不可用,那么只会允许失败一次,然后继续10秒时间不可用。
▪ 如果配置了fail_timeout=30,此值设置为2,那么在30秒内连接失败两次,则随后30秒服务器不可用(即便服务在不可用的时间段里恢复了正常),30秒后才会去尝试连接服务器是否可用,如果不可用,那么只会允许失败一次,然后继续30秒时间不可用。
▪ 值得注意的是在上面30秒内,如果失败一次,服务恢复正常,在离上次失败还没有30秒间隔再出现一次失败,也会算做30秒内失败两次,导致随后30秒服务器算做不可用。
3、 负载均衡调度算法
调度算法 | 含义 |
---|---|
轮询 | 每个请求按照时间顺序轮流分配到不同的后端服务器(默认)。 |
weight | 加权轮询,设置服务器的权重,其值越大分配到的访问越多,weight值和访问率成正比,默认为1。 |
ip_hash | 每个请求按照访问ip的hash结果分配,使得来自同一IP的客户端固定访问一个后端服务器。 |
least_conn | 优先分配请求给活动连接数最少的服务器。 |
url_hash | 每个请求按照访问url的hash结果来分配,使得相同的url固定访问到一个后端服务器。主要应用于缓存场景,以提高缓存命中率。nginx原生不支持,第三方。 |
fair | 公平地按照后端服务器的响应时间分配请求,响应时间越短的后端服务器优先分配请求。nginx原生不支持,第三方。 |
4、指定当出现哪些情况时,请求应该被传递到另一个服务器
在运行过程中,后端节点难免会因为某些原因,不能正确响应用户请求,而是返回状态码,例如网络连接超时,后端服务器超时或者过载等。当出现这些情况,那我们要如何避免返回状态码,而是将请求转移到另一个节点,以提高用户的体验感。
要知道按照nginx本身机制,只有服务器服务宕机了连接失败,负载均衡才会将这台节点上的请求转移到其它节点。如果服务器服务运行正常,那么该返回什么状态码就会返回什么状态码。所以对此我们可以配置下面配置来解决这个问题。
Syntax: proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | http_429 | non_idempotent | off ...;
Default: proxy_next_upstream error timeout;
Context: http, server, location
error:连接错误
timeout:连接超时
http_*:状态码
示例:
[root@lb01 ~]# vim /etc/nginx/conf.d/proxy_wordpress.conf
upstream wordpress {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name wordpress.cp.com;
location / {
proxy_pass http://wordpress;
include proxy_params;
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
}
}
5、示例
upstream backend { //定义一个名为backup的虚拟资源池
server backend1.example.com weight=5; //设置服务器轮询权重为5
server backend2.example.com:8080 max_fails=3 fail_timeout=5s; //代理服务器和此服务器在5秒内连接失败3次,随后5秒服务器算做不可用
server 192.0.2.1 max_fails=3; //代理服务器和此服务器在10秒内连接失败3次,随后10秒服务器算做不可用
server backup3.example.com down; //当前的server不可用
server backup4.example.com backup; //备用server
}
//总体来说,当有7个请求,其中5个分配给backend1.example.com;backend2.example.com:8080分配一个,且当代理服务器和此服务器在5秒内连接失败3次,随后五秒此服务器算做不可用;192.0.2.1服务器分配一个,且当代理服务器和此服务器在10秒内连接失败3次,随后10秒此服务器算做不可用。backup3.example.com服务器不参与负载均衡,backup4.example.com服务器做为热备服务器,当其他所有服务器不能访问时,自动启用。
server {
location / {
proxy_pass http://backend; //将用户请求代理转发到backend资源池
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
//当某台节点出现连接错误、连接超时、500、502、503和504这些情况时,将这台节点上的请求转移到其它节点。
}
}