负载均衡
负载均衡基本使用
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