负载均衡
负载均衡基本使用
1 配置上游服务器
upstream myserver { #是server外层
  server  ip1:8080;
  server  ip1:8080;       
}
 
2 配置代理
server {
 location  / {         
    proxy_pass  http://myserver;#请求转向myserver 定义的服务器列表  注意这个http不能丢       
    
    proxy_redirect off;
    proxy_set_header X-Real-IP $remote_addr;
    #后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
 
负载均衡的策略
轮询
1 轮询
 默认的权重都是1,则访问顺序为ABABAB
upstream myserver { 
  server  ip1:8080;
  server  ip1:8080;       
}
 
2 加权轮询 则访问顺序为ABBABB
upstream myserver { 
    server  ip1 weight=1;
    server  ip2 weight=2;
}
 
3 热备
 当我们第一台服务器能够正常提供服务的时候,服务器2是不会参与服务的,当我们的服务1 有问题了则会切换至服务器2
upstream myserver { 
  server  ip1:8080;
  server  ip2:8080; backup;  #热备     
}
 
4 复杂轮询
upstream myserver { 
  server ip1:8080 weight=2 max_fails=1 fail_timeout=10; #这里的fail_timeout有两层意思,第一层意思是在10s内允许的失败菜蔬为1 第二层意思是 当10内失败过一次服务器暂停服务10s后继续服务。
  server ip2:8080 weight=1 max_fails=3 fail_timeout=20;  
  server ip3:8080 backup; #热备 
  server ip4:8080 down;
}
upstream myserver { 
  server ip1:8080 max_fails=1 fail_timeout=10;
  server ip1:8080 max_fails=1 fail_timeout=10;  
}
 
down:表示当前的server暂时不参与负载均衡,该状态一般会对需要停机维护的服务器进行设置。backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻。max_fails:表示在fail_timeout时间内最多允许的失败次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误。fail_timeout:经历了max_fails次失败后,暂停服务的时间,默认为10秒。max_fails可以和fail_timeout一起使用。weight:默认为1。weight越大,负载的权重就越大。
IP HASH
nginx会让相同的客户端ip请求相同的服务器。如果是有状态的服务则应该采用ip_hash 比如登录功能,在第一台服务器记录了登录的状态,第二次邀请求同一台服务器才能读取到这个登录态。当然了会有其它的方式来解决这些问题,这里不做讨论。
 1 普通hash
upstream myserver { 
  ip_hash ;
  server  ip1:8080 ;
  server  ip2:8080 ;
}
 
2 复杂hash
upstream myserver { 
  ip_hash ;
  server ip1:8080 weight=2 max_fails=3 fail_timeout=20;
  server ip2:8080 weight=1 max_fails=3 fail_timeout=20;
}
 
对于该策略需要注意以下几点:
- 在 nginx1.3.1 版本之前,该策略中不能指定 weight 属性。
 - 该策略不能与 backup 同时使用。
 - 此策略适合有状态服务,比如 session。
 - 当有服务器宕机,必须手动指定 down 属性,否则请求仍是会落到该服务器。
 
3 least_conn
 把请求转发给连接数最少的服务器。
upstream myserver { 
  least_conn ;
  server ip1:8080 weight=2 max_fails=3 fail_timeout=20;
  server ip2 weight=1 max_fails=3 fail_timeout=20;  
  server ip3:8080 backup; #热备 
  server ip4:8080 down;    
}
 
动静分离
upstream static.liyong.com{ #两台静态资源服务器,两台静态资源要一致
    server ip1:80;
    server ip2:80;
}
upstream dynamic.liyong.com{ #两台动态资源服务器
    server ip3:8081;
    server ip4:8082;
}
server {
    listen 80;
    server_name localhost;
    
    location ~* .*(css|js|html|images).+ {
        proxy_pass http://static.liyong.com;
    }
    location / {
        proxy_pass http://dynamic.liyong.com;
    }
}
 
静态资源服务器:
location / { #可以只用一个/拦截所有的请求根据目录来分类 也可以再分类
     root statics;
 }
 
虚拟主机
一个server就是一个虚拟主机
server {
    listen 80;
    server_name www.68.com;
    location / {
            proxy_pass http://www.68.com;
    }
}
server {
    listen 80;
    server_name bj.68.com;
    location / {
            proxy_pass http://bj.68.com;
    }
}
server {
    listen 80;
    server_name sh.68.com;
    location / {
            proxy_pass http://sh.68.com;
    }
}
 
每个虚拟主机负载均衡
upstream  www.68.com {
	127.0.0.1:9081 weight=1;
	127.0.0.1:9082 weight=2;
}
upstream  bj.68.com {
	127.0.0.1:9083 weight=1;
	127.0.0.1:9084 weight=2;
}
upstream  bj.68.com {
	127.0.0.1:9085 weight=1;
	127.0.0.1:9086 weight=2;
}
 
这样就实现了访问不同域名,就负载到不同的服务器,分地区也相当于分流
http://sh.68.com/path
 
 
 http://bj.68.com/path
 
 
参考资料 极客时间 nginx











](https://img-blog.csdnimg.cn/img_convert/cfb68c87c97daaecc89dda2a9d3cfcc9.png)







