美文网首页
负载均衡

负载均衡

作者: 酷酷的伟 | 来源:发表于2019-06-12 17:49 被阅读0次

负载均衡概念

1、实现用户访问调度处理,最终分配给不同web节点上
2、实现用户访问的压力进行分担,将网站压力分配给每一个节点

实现负载均衡的方式

硬件设备
F5 A10 Redware
开源软件
Nginx Haproxy Lvs

lvs、haproxy、nginx区别

从命名分析

负载均衡:用户请求的转发 (lvs)
反向代理:代替用户去找,找到后再发给用户 (nginx haproxy)

从功能分析

1、lvs是4层负载均衡 传输层tap/udp 端口号
最多进行端口转发
2、nginx haproxy是4层和7层负载均衡 应用层 进行http协议和uri转发

负载均衡与反向代理区别

image.png

准备环境工作

配置nginx安装源然后安装

[oot@lb01 ~]# vim /etc/yum.repos.d/nginx.repo 
▽
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

修改web01 web02配置文件

记得提前备份

[root@web01 /etc/nginx/conf.d]# cat  01-www.conf
server   {
    listen      80;
    server_name  www.oldboy.com;
    access_log  /var/log/nginx/access_www.log  main  ;
    root   /app/www;
    location / {
    index  index.html index.htm;
    }
}
[root@web01 /etc/nginx/conf.d]# cat  02-blog.conf 
server   {
    listen       80;
    server_name  blog.oldboy.com;
    access_log  /var/log/nginx/access_blog.log  main;
    root   /app/blog;
    location / {
    index index.php index.html index.htm;
    }
   location ~* \.(php|php5)$ {
       fastcgi_pass   127.0.0.1:9000;
       fastcgi_index  index.php;
       fastcgi_buffers 16 16k;
       fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
       include        fastcgi_params;
   }
}

重启nginx检查语法

web01 web02 创建站点目录与首页文件

俩边都相同

[root@web01 /etc/nginx/conf.d]# mkdir -p /app/{www,blog}
[root@web01 /etc/nginx/conf.d]# for n  in  www blog  ; do echo  $n.oldboy.com >/app/$n/index.html ;done 
[root@web01 /etc/nginx/conf.d]# tree /app/
/app/
├── blog
│   └── index.html
└── www
    └── index.html

2 directories, 2 files

[root@web02 conf.d]# tree /app
/app
├── blog
│   └── index.html
└── www
    └── index.html

2 directories, 2 files

去db01上curl一下

curl -H Host:www.oldboy.com 10.0.0.[7-8]

image


编写nginx反向代理服务配置文件(lb01)

ngx_http_upstream_module 负载均衡
ngx_http_proxy_module 反向代理

[root@lb01 ~]# vim /etc/nginx/nginx.conf 
...
     upstream  web_pools {
     server 10.0.0.7:80;
     server 10.0.0.8:80;
     }
#    include /etc/nginx/conf.d/*.conf;
     server {
     listen 80;
     server_name www.oldboy.com;
     location / {
         proxy_pass http://web_pools;
        }
}
}
[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# systemctl restart nginx

为web01 web02首页文件追加内容让容易区分

for n  in  www blog  ; do echo  `hostname` $n.oldboy.com >/app/$n/index.html ;done 

[root@web01 conf.d]# cat /app/www/index.html 
web01 www.oldboy.com

[root@web02 conf.d]# cat /app/blog/index.html 
web02 blog.oldboy.com

在lb01上curl一下

[root@lb01 ~]# curl 10.0.0.7
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.8
web02 www.oldboy.com
[root@lb01 ~]# 
[root@lb01 ~]# 
[root@lb01 ~]# curl 10.0.0.5
web02 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web02 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com

image

抓包

image.png

upstream模块参数:

server —— RS配置,可以是ip或域名
weight ——权重
max_fails ——失败次数
fail_timeout =10s ——多久后在检查一遍
backup ——如果加上backup 会在池塘中其他机器都挂掉 才会启动
down 让服务器不可用

image image image image

配置权重

weight=1;

     upstream  web_pools {
     server 10.0.0.7:80 weight=2;
     server 10.0.0.8:80 weight=1;
     }

[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web02 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web01 www.oldboy.com
[root@lb01 ~]# curl 10.0.0.5
web02 www.oldboy.com

CND加速缓存

网站加速 缓存网站静态页面 视频(切片)
用户先访问cdn
cdn缓存没有 就转到源站
cdn公司介绍:蓝汛 网宿 阿里云

image

配置文件中添加server模块的参数(lb01)

weight        权重;
max_fails     健康检查,失败次数;
fail_timeout  多久后在检查一遍

修改配置模块参数

upstream  web_pools {
server 10.0.0.7:80 weight=2 max_fails=3 fail_timeout=10s;
server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
}

测试关闭一台后,是否还能访问:

for n in {1..1000};do curl 10.0.0.5/index.html ;sleep 1;done

image.png

请求访问第二个站点blog.oldboy.com

image.png
抓包看一下情况:
image
image

修改 请求头

proxy_set_header Host $host;

     server {
     listen 80;
     server_name www.oldboy.com;
     location / {
         proxy_pass http://web_pools;
        }
     }
     server {
     listen 80;
     server_name blog.oldboy.com;
     location / {
         proxy_pass http://web_pools;
         proxy_set_header Host $host;
        }
     }
[root@lb01 ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 ~]# systemctl restart nginx

再访问就成功了
image.png

显示客户端的地址,并记录到日志中

proxy_set_header X-Forwarded-For $remote_addr;

     server {
     listen 80;
     server_name www.oldboy.com;
     location / {
         proxy_pass http://web_pools;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     }
     server {
     listen 80;
     server_name blog.oldboy.com;
     location / {
         proxy_pass http://web_pools;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     }

这里测试的是在lb01上curl的web01

image image

添加访问控制

如果某些网段访问量成千上万,特别高的话,可能是被入侵了
需要给这个网址做限制访问

server {
listen 80;
server_name www.oldboy.com;
location / {
   if ($remote_addr ~ "^192.168.22.") {   \\指定禁止访问的网段
   return 403 "别捣乱";  \\定义的是指定网段中,客户访问后返回的内容
   }
   proxy_pass http://web_pools;
   proxy_set_header Host $host;
   proxy_set_header X-Forwarded-For $remote_addr;
}

防火墙规则—iptables

iptables详细用法http://man.linuxde.net/iptables

image image

--dport 指定端口号

iptables -A INPUT -p tcp -s 192.168.22.0/24 -j DROP

-A:向规则链中添加条目;
-P:定义规则链中的默认目标;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;

指定网段,配置时不要把自己挡外面,这就要跑机房了~
image image

-F:清楚规则链中已有的条目;
-Z:清空规则链中的数据包计算器和字节计数器;
-X:删除用户自定义的链

image image

负载均衡的设备转换、动静分离

准备环境

web01上

[root@web01 ~]# echo 'this is PC website' >/app/www/lidao.html

web02上

[root@web02 ~]# echo 'this is Mobile website' >/app/www/lidao.html

lb01上curl一下

image

根据用户客户端的设备 进行转发 请求:

image.png

配置 upstream 与location

定义upstream移动端与PC端

 upstream  default {
     server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
     }
     upstream mobile {
     server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
     }

移动端的服务器池

     location / {
        if ($http_user_agent ~* "Android|IOS") {
        proxy_pass http://mobile;
        }

完整配置

[root@lb01 nginx]# vim nginx.conf 
...
     upstream  default {
     server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
     }
     upstream mobile {
     server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
     }
#    include /etc/nginx/conf.d/*.conf;
     server {
     listen 80;
     server_name www.oldboy.com;
     location / {
        if ($http_user_agent ~* "Android|IOS") {
        proxy_pass http://mobile;
        }
         proxy_pass http://default;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     }
[root@lb01 nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 nginx]# systemctl reload nginx

记得将之前环境中的其他模块一起修改或暂时注释掉,不然语法会报错

curl一下查看结果

curl -A 可以指定系统

[root@lb01 nginx]# curl 10.0.0.5/lidao.html
this is PC website
[root@lb01 nginx]# curl -A ios 10.0.0.5/lidao.html
this is Mobile website
[root@lb01 nginx]# curl -A Android 10.0.0.5/lidao.html
this is Mobile website

可以下载火狐浏览器查看

http://www.firefox.com.cn/
安装插件流程:

image image image image image

根据 URI 中的目录地址实现代理转发(动静分离)

添加一台测试web03节点—10.0.0.9
将web03的配置与web01和web02配置相同
(/app站点目录与nginx.conf配置文件)

image
image.png
image.png

准备环境

www.oldboy.com/upload/index.html
www.oldboy.com/static/index.html
www.oldboy.com/index.html

#web01:
mkdir -p /app/www/upload/index.html
echo this is upload >/app/www/index.html
[root@web01 ~]# cat /app/www/upload/index.html 
this is upload

#web02:
mkdir -p /app/www/static/index.html
echo this is static >/app/www/index.html
[root@web02 ~]# cat /app/www/static/index.html 
this is static

#web03:
mkdir -p /app/www/index.html  #之前已经有首页文件,只需修改内容
echo this is default >/app/www/index.html
[root@web03 ~]# cat /app/www/index.html 
this is default

配置 upstream 与location

定义upstream.

     upstream  upload {
     server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
     }
     upstream static {
     server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
     }
     upstream default {
     server 10.0.0.9:80 weight=1 max_fails=3 fail_timeout=10s;
     }

添加location

     server {
     listen 80;
     server_name www.oldboy.com;
     location /upload {
         proxy_pass http://upload;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     location /static {
         proxy_pass http://static;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     location /default {
         proxy_pass http://default;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     }

完整配置

image
[root@lb01 nginx]# vim nginx.conf 
....
     upstream  upload {
     server 10.0.0.7:80 weight=1 max_fails=3 fail_timeout=10s;
     }
     upstream static {
     server 10.0.0.8:80 weight=1 max_fails=3 fail_timeout=10s;
     }
     upstream default { 
     server 10.0.0.9:80 weight=1 max_fails=3 fail_timeout=10s;
     }
#    include /etc/nginx/conf.d/*.conf;
     server {
     listen 80;
     server_name www.oldboy.com;
     location /upload {
         proxy_pass http://upload;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     location /static {
         proxy_pass http://static;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     location / {
         proxy_pass http://default;
         proxy_set_header Host $host;
         proxy_set_header X-Forwarded-For $remote_addr;
        }
     }
}
[root@lb01 nginx]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@lb01 nginx]# systemctl reload nginx

浏览器测试一下

上传

image.png

静态

image.png

动态(默认)

image.png

轮询算法

image

ip_hash
只要客户端ip地址相同就会被转发到同一台机器上

image

cookie与session会话区别

会话保持
cookie
session

共同点

存放用户信息
key value类型 变量和变量内容

区别

cookie:
存放在浏览器
为保证安全性,存放简单信息、钥匙
开发设置
响应服务器给你设置

session:
存放在服务器  
存放敏感信息
存放锁头

image.png

Nginx负载均衡与反向代理相关参数

资料连接:
https://www.cnblogs.com/sky00747/p/8628866.html
https://www.cnblogs.com/syaving/p/7907447.html

image

实现Nginx负载均衡的组件主要有两个:

ngx_http_proxy_module proxy 代理模块,用于把请求后抛给服务器节点或upstream服务器池
ngx_http_upstream_module 负载均衡模块,可以实现网站的负载均衡功能及节点的健康检查

反向代理重要参数

prox_pass http://server_pools;     通过proxy_pass功能把用户的请求转向到反向代理定义的upstream服务器

proxy_set_header Host $host;     在代理向后端服务器发送的http请求头中加入host字段信息,用于后端服务器配置有多个虚拟主机,可以识别那个虚拟主机

proxy_set_header X-Forwarded-For $remot_addr;  用于接收用户真实IP,而不是代理服务器ip

在配置文件里都会加上include proxy_params或proxy.conf;
在proxy.conf里增加参数,会显得干净

[root@lb01 ~]# cat /etc/nginx/proxy_params 
proxy_set_header HOST $host;    #设置http请求header项传给后端服务器节点,可实现让代理后端服务器节点获取访问客户端用户真实IP地址
proxy_set_header X-Forwarded-For  $remote_addr;  #用于接收用户真实IP,而不是代理服务器ip

proxy_connect_timeout  30;        #表示反向代理与后端节点服务器连接的超时时间
proxy_send_timeout     60;        #代理后端服务器的数据回传时间,在规定时间之内服务器必须传完所有数据,否则断开
proxy_read_timeout     60;        # 设置nginx从代理的后端服务器获取信息时间,表示连接建立成功后,nginx等待后端服务器的响应时间

proxy_buffer_size      32k;      #设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置大小
proxy_buffering   on;            #启用或禁用来自代理服务器的响应缓冲
proxy_buffers   4   128k;        # 这是缓冲区的数量和大小,nginx从代理的后端服务器获取响应信息
proxy_busy_buffers_size   256k;  #用于设置系统很忙时可以使用的proxy_buffers大小,官方推荐proxy_buffer*2
proxy_max_temp_file_size  256k;  #当启用来自代理服务器的响应缓冲,并且整个响应不适合proxy_buffer_size和proxy_buffers指令设置的缓冲区时,响应的一部分可以保存到临时文件中。

Nginx根据URL中的目录地址实现代理转发

image.png
当用户请求www.daxian.com/upload/xx地址的时候,实现由upload上传服务器池处理请求

当用户请求www.daxian.com/static/xx地址的时候,实现由静态服务器池处理请求

除此之外,对于其他访问请求,全部交给默认动态服务器请求

相关文章

网友评论

      本文标题:负载均衡

      本文链接:https://www.haomeiwen.com/subject/eswlfctx.html