nginx负载均衡:
http {
upstream web_pools(自定义) {
ip_hash; hash算法(不能与backup同用)
server 10.0.0.1:80 weight=5(权重);
server 10.0.0.2:80 weight=5;
server 10..0.3:80 backup(); 热备
}
server {
listen 80;
server_name www.xxx.com;
location / {
root html;
index index.php;
proxy_pass http://web_pools;
}
}
}
LVS类似负载均衡相当于转发,反向代理相当于中介
2、upstream模块
支持proxy_pass,fastcgi_pass,memcached_pass
默认算法wrr权重轮询
weight 权重,越大接受的请求越多
max_fails=2 最大尝试是失败的次数,默认1,0表示禁止失败尝试;企业场景:建议2-3次;
backup:热备配置;
fail_timeout=20 失败超时时间,默认10s
down 标志着服务器永远不可用
3、调度算法
1)rr轮询
1:1
2)wrr权重轮询
rr+weight
3)ip_hash
同一个客户端ip将会分配到同一台服务器,该调度算法可以解决动态网页session共享问题;
4)fair
安装后端服务器RS的响应时间来分配请求,响应时间短的优先分配
5)url_hash
根据访问的url的hash结果来分配请求,让每个url定向到同一个后端服务器
proxy_pass:
指向upstream标签
模块:
1)proxy_set_header Host $Host;
携带用户的header,例如主机名;
当后端web服务器上也配置有多个虚拟主机时,需要使用该header来区分反向代理到哪个主机名;
location / {
proxy_pass http://xxx;
proxy_set_header Host $Host;
}
2)proxy_set_header X-Forwarded-For $remote_addr;
如果后端web服务器上的程序需要获取客户端IP,从该header头获取;
#后端如果是httpd需要修改日志格式logformat开头%h为
\"%{X-Forwarded-For}i\"
# 虚拟主机标签中修改默认的log日志
<VirtualHost *:80>
CustomLog logs/access.log
#后端如果是nginx不用修改,只需在代理上添加proxy_set_header X-Forwarded-For $remote_addr;
3)proxy_connect_timeout;
后端服务器连接的超时时间
4)proxy_send_timeout;
后端服务器的数据回传时间,即在规定时间之内后端服务器必须传完所有的数据,否则,nginx将断开这个连接;
5)proxy_read_timeout;
设置nginx从代理的后端服务器获取信息的时间,表示连接建立成功后,nginx等待后端服务器的相应时间;
6)proxy_buffer_size;
设置缓冲区大小;
7)proxy_buffers;
设置缓冲区的数量和大小;
8)proxy_busy_buffers_size;
设置系统繁忙时的proxy_buffers大小;
9)proxy_temp_file_write_size;
设置proxy缓存临时文件的大小;
2、nginx实现动静分离
1)根据扩展名
location ~.*.(gif|jpg|jpeg|png|bmp|swf|css|js)$ {
proxy_pass http://static_pool;
include proxy.conf;
}
2)根据目录
一个图片库
一个动态库
负载均衡器服务器上修改配置文件:
upstream static_pool {
server 172.16.0.9:80 weight=5;
}
location /image/ {
proxy_pass http://static_pool;
include proxy.conf;
}
3)根据浏览器分离访问后端服务器
应用场景:某些页面不支持IE访问
upstream static_pool {
server 172.16.0.9:80 weight=5;
}
upstream dynamic_pool {
server 172.16.0.10:80 weight=5;
}
server {
listen 80;
server_name www.xxx.com;
location / {
if ($http_user_agent ~* "MSIE")
{
proxy_pass http://dynamic_pool;
}
if ($http_user_agent ~* "Firefox")
{
proxy_pass http://dynamic_pool;
}
proxy_pass http://dynamic_pool;
include proxy.conf;
}
}
3)根据安卓和苹果分离
location / {
if ($http_user_agent ~* "android")
{
proxy_pass http://static_pool;
}
if ($http_user_agent ~* "iphone")
{
proxy_pass http://dynamic_pool;
}
proxy_pass http://dynamic_pool; # 当安卓和苹果都不是访问谁
include proxy.conf;
}
Keepalived高可用
1)失败接管,宕机接管
2)lvs cluster nodes healthchecks功能
Keepalived.conf里配置就可以实现LVS功能
Keepalived可以对LVS下面的集群节点做健康检查
故障转移原理:
通过VRRP协议来实现的;
在director正常工作时,主director节点会不断的向备节点广播心跳消息,
keepalived 实现服务器级别的接管
不会接管nginx服务
# 利用脚本监控nginx,当nginx服务停止,自动停止keepalived服务
[root@mfs /server/scripts/monitoring]# cat mon-keepalived.sh
#!/bin/bash
#name: monitoring keepalived status.
#
nginx_pid_file_path="/usr/local/nginx/logs/nginx.pid"
nginxd="/usr/local/nginx/sbin/nginx"
keep_pid_file_path="/var/run/keepalived.pid"
keep(){
if [ -f $nginx_pid_file_path -a -s $nginx_pid_file_path ]
then
:
else
nginx=`/usr/sbin/lsof -i :80|wc -l`
if [ $nginx -le 0 ];then
systemctl stop keepalived &>/dev/null
fi
fi
}
nginx(){
nginx1=`/usr/sbin/lsof -i :80|wc -l`
if [ $nginx1 -gt 0 ];then
systemctl start keepalived &>/dev/null
fi
}
main(){
keep
nginx
}
main
keepalived裂脑问题
1)添加心跳线
2)fence、stonith自动管理电源
自动切断电源
3)做好监控
裂脑监控脚本:
可以ping通主节点,但从节点也有vip;