负载均衡是由多台服务器以对称的方式组合成一个服务器集合,其中每台都可以单独对外提供服务,地位等价,
通过某种负载分担技术将外部发来的请求均匀分配到对称结构中的某一台服务器,以解决高并发问题
反向代理是指:由代理服务器接收来自internet的请求,转发给nginx服务器,并把nginx服务器上得到的结果
返回给internet
常见的web负载均衡的方法:
1)通过在web上提供不同的入口,让用户手动选择,比如软件下载时,会有华北下载,华南下载等
2)dns轮询方式:大多域名注册商都支持对同一主机名添加多条A记录,这就是DNS轮询,dns服务器将按照A记录的
顺序随机的分配到不同的ip,完成简单的负载均衡
3)可以使用dig命令查看域名解析的情况,eg:dig www.baidu.com
虽然dns轮询比较简单,但是有两个明显的缺点:
1)可靠性低,假设一个服务器故障,所有转发到该服务器的请求都不会被响应了,即使从dns中去掉该服务器,由于
电信,网通等宽带接入商会将众多的dns放到缓存以节省访问时间,会导致新的dns记录好几个小时都不能生效,所以,
可靠性比较低
2)负载分配不均衡
dns服务器采用的是简单的轮询,不能区分服务器的差异和当前的运行状态,不能及时的为性能较好的服务器分配更多
的请求,性能较差的服务器也会堆积大量未完成的请求
4)osi负载均衡
1)硬件四、七层也就是传输层和应用层的负载均衡交换机
2)软件四层负载均衡服务器,eg LVS(Linux Virtual Server) ,它采用基于ip的负载均衡和基于内容请求分发
技术,调度器有很好的吞吐量,将请求均衡的转移到不同的服务器上执行,且调度器可以自动屏蔽掉服务器的故障,
组成高性能,高可用的虚拟服务器,整个服务器集群对客户是透明的,且无需修改客户端和服务端代码
3)软件七层负载均衡
大多基于http反向代理,代表产品有nginx L7SW HAProxy,nginx的反向代理可以很好的支持虚拟主机,且可配置
性强,可以按轮询,IP哈希,URL哈希,权重等多种方式对后端服务器进行负载均衡,同时支持对后台服务器的健
康检查
5)多线多地区智能DNS解析和混合负载均衡方式
nginx的负载均衡:
upstream用来设置一组用来均衡的服务器,可以在server里fastcgi_pass和proxy_pass指令中使用,默认均衡方式为轮询
服务器的名称可以是一个域名,一个ip或者是unix socket
在server里可通过fastcgi_pass和proxy_pass指令进行设置反向代理的upstream集群,eg
upstream php_server_pool{
server 192.168.1.1:80 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.1.2:80 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.1.3:80 weight=2 max_fails=2 fail_timeout=30s;
}
upstream message_server_pool{
server 192.168.1.12:3245;
server 192.168.1.13:3245 down;
}
upstream bbs_server_pool{
server 192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s;
}
#第一个虚拟主机反向代理php_server_pool这组服务器
server{
#监听的ip和端口
listen 80;
#主机名称
server_name nj.cc;
#访问日志的存放路径
access_log logs/server1.access.log combined;
location /{
#如果后端的服务器返回的是502 504 超时等错误,自动将请求转发到upstream负载均衡池的
#另一个server,实现故障转移
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://php_server_poll;
proxy_set_header Host www.nj.cc;
proxy_set_header X-Forward-For $remote_addr;
}
}
#第二个虚拟主机反向代理php_server_pool这组服务器
server{
#监听的ip和端口
listen 80;
#主机名称
server_name nj.cc;
#访问日志的存放路径
access_log logs/server1.access.log combined;
#访问http://nj.cc/message/...,反向代理到message_server_pool这台服务器
location /message/{
#如果后端的服务器返回的是502 504 超时等错误,自动将请求转发到upstream负载均衡池的
#另一个server,实现故障转移
proxy_pass http://php_server_poll;
proxy_set_header Host $host;
}
location /{
proxy_pass http://php_server_poll;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
}
}
#第三个虚拟主机反向代理php_server_pool这组服务器
server{
listen 80;
server_name nj.cc;
access_log off;
location /{
proxy_pass http://php_server_poll;
proxy_set_header Host $host;
proxy_set_header X-Forward-For $remote_addr;
}
}
注意:使用反向代理后用后端web如php用$_SERVER['remote_addr']获取到的是nginx负载均衡的服务器ip,不是请求
过来的真实客户端ip,在nginx中添加X-Forward-For使php可以通过 $_SERVER['HTTP_X_FORWARD_FOR']来获取到
用户真实的ip
nginx负载均衡的upstream模块:
upstream是nginx负载均衡的主要模块,简单配置实例如下:
upstream beackend{
server backend1.com weight=3;
server backend2.com:8080;
server unix:/tmp/backend3;
}
server{
location /{
proxy_pass http://backend;
}
}
ip_hash指令:
默认值none,对后端的多台服务器做负载均衡时,ip_hash可以将某一个客户端的ip请求通过hash算法定位到同一台后端服务器上
这样,可以保证通过某ip登录后,访问的其它url依然是同一台服务器,防止session是存在A服务器上,后来的url却均衡到B或C
服务器导致session不存在的情况发生,比如,由于session不存在,提示用户未登录等,但是可能会造成某一些服务器的请求多,另一些请求少,设置的权重会失效,所以,最好还是用session共享的方式来解决,不建议用nginx的ip_hash来替代
服务器摘除最好使用down,eg:
upstream backend{
ip_hash ;
server nj1.com;
server nj2.com;
server nj3.com down;
server nj4.com;
}
如果直接注释server3 可能会导致原来均衡到server1的请求跑到2,导致原有session失效
server指令:
server name [parame]
默认值none,后边可以跟weight服务器权重,默认1
max_fails=num在指定的时间fail_timeout内对后端服务器请求失败的次数检查,超过该值标记为请求失败
fail_timeout=time,经历max_fail次失败后暂停的时间
down标记服务器离线
backup进在非backup服务器全部宕机或者繁忙时才可用