负载均衡,顾名思义,用来应对大量请求的情况下,为了均衡服务器的压力,通过nginx 把请求平均地分发到多个服务器,以多服务器的环境,减轻请求压力。
1、主要关键配置字段 upstream
2、nginx负载均衡有六种
轮询 | 默认方式 |
---|---|
weight | 权重方式 |
ip_hash | 依据ip分配方式 |
least_conn | 最少连接方式 |
fair(第三方) | 响应时间方式 |
url_hash(第三方) | 依据URL分配方式 |
有如下参数:
fail_timeout | 与max_fails结合使用。 |
---|---|
max_fails | 设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了, |
fail_time | 服务器会被认为停机的时间长度,默认为10s。 |
backup | 标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。 |
down | 标记服务器永久停机了。 |
策略的基本配置和说明
轮询
- 在轮询中,如果服务器down掉了,会自动剔除该服务器。
- 缺省配置就是轮询策略。
- 此策略适合服务器配置相当,无状态且短平快的服务使用。
weight
- 权重越高分配到需要处理的请求越多。
- 此策略可以与least_conn和ip_hash结合使用。
- 此策略比较适合服务器的硬件配置差别比较大的情况。
ip_hash
- 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
- ip_hash不能与backup同时使用。
- 此策略适合有状态服务,比如session。
- 当有服务器需要剔除,必须手动down掉。
least_conn
- 把请求转发给连接数较少的后端服务器。
- 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
fair
- 按照服务器端的响应时间来分配请求,响应时间短的优先分配。
url_hash
- 同一个资源多次请求,可能会访问不同服务器,导致多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使同一个url(也就是同一个资源请求)访问同一台服务器,一旦缓存了资源,再此请求,直接从缓存中读取。
#轮询
upstream myserver{
server 192.168.65.101:8080 max_fails=3 fail_timeout=20s;
server 192.168.65.102:8080;
server 192.168.65.103:8080; backup #备份服务器,当其他服务器都异常时,才会使用它
}
#指定权重 ,在轮询策略的基础上指定轮询的几率。
upstream myserver {
server 192.168.65.101:8080 weight=8;
server 192.168.65.102:8080 weight=10;
}
#ip_hash,ip取模,保证每个访客固定访问一个后端服务器,可以解决session不能跨服务器的会话问题 ,在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)
upstream myserver {
ip_hash;
server 192.168.65.101:8080;
server 192.168.65.102:8080;
}
#least_conn,#把请求转发给连接数较少的后端服务器
upstream myserver{
least_conn;
server 192.168.65.101:8080 weight=10;
server 192.168.65.101:8080;
}
#fair(第三方)[第三方的负载均衡策略的实现需要安装第三方插件],按照服务器端的响应时间来分配请求,响应时间短的优先分配。
upstream myserver {
server 192.168.65.101:8080;
server 192.168.65.102:8080;
fair;
}
#url_hash(第三方) #[第三方的负载均衡策略的实现需要安装第三方插件] , 实现每个url定向到同一个后端服务器,
upstream myserver{
hash $request_uri;
server 192.168.65.101:8080;
server 192.168.65.102:8080;
}
server {
listen 80;
server_name xxx.cn;
index index.php index.html index.htm default.php default.htm default.html;
root /www/wwwroot/xxx.cn;
location / {
proxy_pass http://myserver;
}
.....