week 16-Nginx 负载均衡

1.反向代理负载均衡服务概述

1.1 集群:一群完成相同工作的服务器,服务软件相同,配置文件信息相同

集群作用

    1. 提高服务器处理能力
    1. 价格保证
    1. 荣誉能力强

集群类型

    1. 负载均衡集群
    1. 高可用集群
    1. 高性能运算集群

1.2 负载均衡

作用

    1. 实现用户访问请求调度处理
    1. 实现访问压力负载分担

1.3 反向代理

服务器根据客户端的请求,从其关联的一组或多组后端服务器(如Web服务器)上获取资源,然后再将这些资源返回给客户端,客户端只会得知反向代理的IP地址,而不知道在代理服务器后面的服务器簇的存在

反向代理:

外网主机----> 互联网 ----> 主机 (中介)---->内网服务器
                          通过中间主机
正向代理:

网站服务器(Google)----> 内网主机(局域网) ----> 互联网 ----> 主机(中介)----  > 外网服务器 (翻墙)

2. 反向代理负载均衡配置过程

2.1 准备环境

lb01  10.0.0.5
lb02  10.0.0.6
web01 10.0.0.7
web02 10.0.0.8
web03 10.0.0.9

2.2 配置过程

第一步: Web服务器进行环境配置
配置环境

  • 版本:Nginx 1.16
rpm -qa |grep nginx
week 16-Nginx 负载均衡_第1张图片
软件版本
  • 管理服务用户设置为 www
vim /etc/nginx/nginx.conf
week 16-Nginx 负载均衡_第2张图片
管理用户设置
  • 虚拟主机配置文件相同
week 16-Nginx 负载均衡_第3张图片
web01
week 16-Nginx 负载均衡_第4张图片
web02
week 16-Nginx 负载均衡_第5张图片
web03
  • 站点目录结构相同
tree /html/www
week 16-Nginx 负载均衡_第6张图片
web01

week 16-Nginx 负载均衡_第7张图片
web02

week 16-Nginx 负载均衡_第8张图片
web03
  • Nginx 配置相同
user  www;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/www.conf;   
}

  • 配置 lb01/lb02
vim /etc/nginx/nginx.conf

user  www; --管理用户设置为 www  如果没有创建用户,重启服务会提示失败
    worker_processes  2;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;
    }
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        keepalive_timeout  0;
        upstream oldboy {                         --- 负载均衡模块
            server  10.0.0.7:80;            
            server  10.0.0.8:80;            
            server  10.0.0.9:80;            
        } 
        server {
           listen         80;
           server_name    localhost;
           location / {
            proxy_pass http://oldboy;   --- 反向代理模块
           }
        }
    }
  • 在lb01上测试访问站点


    week 16-Nginx 负载均衡_第9张图片
    测试访问
  • 打开浏览器测试


    week 16-Nginx 负载均衡_第10张图片
    刷新第一次
week 16-Nginx 负载均衡_第11张图片
刷新第二次
week 16-Nginx 负载均衡_第12张图片
刷新第三次

配置完成

总结要注意的问题

1. nginx.conf include *.conf 设置为 www.conf (在有多个虚拟主机配置文件的时候需要,如果只有一个,不需要修改,*.conf 就可以)
2. 注意管理服务用户是否创建,配置文件是否修改
3. 注意web主机配置要相同
4. 注意修改本地host文件解析是否修改为负载服务器地址

3. 配置文件详解

    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        keepalive_timeout  0;
        upstream oldboy {                         定义可以进行负载的主机
              oldboy 集群名,可以创建多个集群
            server  172.16.1.7:80;                用户访问的是负载均衡的80 ,网站端口有改变在这里修改就可以,不需要再前端修改
            server  172.16.1.8:80;            
            server  172.16.1.9:80;            
        } 
        upstream oldgirl {                         定义可以进行负载的主机
              oldboy 集群名,可以创建多个集群
            server  172.16.1.7:80;                用户访问的是负载均衡的80 ,网站端口有改变在这里修改就可以,不需要再前端修改
            server  172.16.1.8:80;            
            server  172.16.1.9:80;            
        } 
        server {
           listen         80;
           server_name    localhost;
           location / {
            proxy_pass http://oldboy;  发给oldboy 集群

           }
           location ~ \.(jpg|mp4) {
           proxy_pass http://oldboy;  如果匹配jpg或者MP4的uri,将负载发给oldgirl 集群
          }
        }
    }

4. 负载均衡upstream模块详解

官方说明

'语法说明'
Syntax: upstream name { ... }
Default:    —
Context:    http 只能放在http 区块中
'官方举例'
upstream backend { 
    server backend1.example.com weight=5;
    server 127.0.0.1:8080       max_fails=3 fail_timeout=30s;
    server unix:/tmp/backend3;

    server backup1.example.com  backup;
}

4.1 weight参数

weight =5 : 权重参数: 可以实现轮巡分配支援,不指定参数默认是轮巡分配资源(平均分配) 
应用环境:'可以给性能好的服务器多分配资源,老旧服务器少分配减少压力'

设置之后重启服务,在linux系统中测试对比默认与设置了权重之后的区别

week 16-Nginx 负载均衡_第13张图片
权重测试

week 16-Nginx 负载均衡_第14张图片
默认轮巡分配

访问了六次负载服务器,默认轮巡分配的情况是每个web主机两次

week 16-Nginx 负载均衡_第15张图片
设置权重之后

访问了六次负载,可以看到设置了权重之后,负载分配每个主机的情况是 web01 3次 web02 2次 web03 1次

权重是按比例来分配,不是按顺序,比如以上,它不会连续三个分配给 web01 不会连续两个分给web02

上面介绍权重的两种分配情况

第一种: '默认轮巡分配  每个请求所占用的后端时间要差不多'
第二种: 'weight 按照指定比例来分配'
第三种: 'least_conn 按照节点连接数分配资源 Web请求会被转发到连接数最少的服务器上。'

Syntax: least_conn;
Default:    —
Context:    upstream 使用在 upstream 模块中
  least_conn: 按照节点连接数分配资源 # 要把weight去掉,否则没有作用
        upstream oldboy {
            least_conn;
            server  10.0.0.7:80;
            server  10.0.0.8:80;
            server  10.0.0.9:80;
           }

第四种: 'ip_hash' 确保一个用户多次访问,负载均衡都会分配给相同的web节点
Syntax: ip_hash;
Default:    —
Context:    upstream 使用在 upstream 模块中
    upstream backend {
        ip_hash;
        server backend1.example.com;
        server backend2.example.com;
        server backend3.example.com down;
        server backend4.example.com;
}
当登录网站的时候,用户离开页面一段时间,或者关闭网站重新打开网站需要再次登录,出现此情况是因为用户的登录信息,服务器可能只会保存很短的时间,
所以会用到 ip_hash
'使用ip_hash,它会为根据每个ip生成一个hash值,当用户再次登录的时候,负载根据读取到的hash值,将访问分配给对应的web服务器 '

                                     
                        用户IP        (根据算法生成的hash值,此处仅为举例)
        用户01:          10.0.0.1         ---  001                                     web01 
        用户02:          11.0.0.1         ---  011                                     web02 
        用户03:          12.0.0.1         ---  112                                     web03 
        000 ~ 150   例如  生成hash值范围是000-150 
        000 ~ 050   -->  web01   当读取的hash值范围是000 ~ 050 时分配给 web01
        051 ~ 100   -->  web02   当读取的hash值范围是051 ~ 100 时分配给 web02
        101 ~ 150   -->  web03   当读取的hash值范围是101 ~ 150 时分配给 web03
        设置了ip_hash 之后会出现一种情况:        
        用户01(100人):   10.0.0.1    ---  001     web01 
        如果用户01访问的ip中有100人,那么负载就会将这100人的请求发送给 web01 此时就会出现'负载不均'的情况

        优选办法:
           用户01              --> web01(缓存客户端 memcache-php)   用户01登录信息
           用户02    ---> lb01 --> web02(缓存客户端 memcache-php)   用户02登录信息  -->  缓存服务器 memcached (会话记录)
           用户03              --> web03(缓存客户端 memcache-php)   用户03登录信息       session会话共享服务器
         负载将处理分配给web01/02/03 ,三个web服务器,理论上是记录各自的缓存,其实是每个服务器上有一个php-memcache 缓存客户端,然后将用
户登录信息统一存储到后台的一个缓存服务器,后台部署 memcached 缓存服务器(session会话共享服务器),把所有会话存储在缓存服务器,通过缓存服务
器管理缓存客户端,当负载将原属于web01会话分配给lb02也没有问题,缓存服务器也有web01的记录,这样就可以解决负载不均的
'需要安装php-memcache 和 memcache服务器'

4.2 max_fails=3 fail_timeout=30s;

负载均衡节点健康检查

'max_fails=3' 最大失败次数 
当负载接收到http请求,分配给例如 web01 ,第一次如果失败,会试两次,如果三次都不正常,就访问别的,例如 web02 
'fail_timeout=30s' 失败超时时间
在三次失败之后,如果设置此功能,开始计时,计时时间内,发送过来的请求,发送给web02,过了30秒之后,会访问一次 web01('只访问1此') ,如果成功,
下一次请求会再次发给web01,如果失败,再次计时30秒,不会访问三次

请求   ---  web01  1次失败  2次失败  3次失败   1次失败  30s  1次失败  30s 
请求   ---  web02  1次成功


4.3 server backup1.example.com backup;

  upstream oldboy {
server  10.0.0.7:80;
server  10.0.0.8:80;
server  10.0.0.9:80 backup;
} 
backup: 节点备份功能
当其他服务器都不可以用的时候,选择使用配置了 backup功能的服务器

示例:

设置节点备份功能

week 16-Nginx 负载均衡_第16张图片
配置web03 10.0.0.9设置为节点备份服务器

测试访问(此时web03 10.0.0.9 已经不会访问了)

week 16-Nginx 负载均衡_第17张图片
此时已经不再访问web03

week 16-Nginx 负载均衡_第18张图片
停掉 web01 和web02 之后,才会继续访问web03

4.3 down

手动关闭其中一个主机,不再给其分配资源

    upstream oldboy {
server  10.0.0.7:80;
server  10.0.0.8:80;
server  10.0.0.9:80 down;
} 

week 16-Nginx 负载均衡_第19张图片
image.png

week 16-Nginx 负载均衡_第20张图片
关闭之后访问

也可以使用 #注释掉主机所在行,也可以关掉,与down 类似
week 16-Nginx 负载均衡_第21张图片
另一种方法


5. proxy 反向代理模块 反向代理模块

proxy_pass:       反向代理指令,将请求发给指定的集群
proxy_set_header: 设置请求头信息
proxy_set_header X-Forwarded-For 使网站节点日志可以记录真实IP地址
proxy_next_upstream error timeout 检查网站页面是否正确
  01. 访问负载均衡可以显示不同网站页面
      ## 待解决
  02. 使网站节点日志可以记录真实IP地址
      proxy_set_header X-Forwarded-For $remote_addr;
  03. 检查网站页面是否正确
      proxy_next_upstream error timeout http_403;
        location / {
            proxy_pass http://oldboy;
            proxy_next_upstream error timeout http_403;
            }

proxy_next_upstream error timeout 示例
官方说明

week 16-Nginx 负载均衡_第22张图片
将web01首页文件修改

第一次 负载分配各 web03


week 16-Nginx 负载均衡_第23张图片
web03

第二次 负载分配给 web01 ,报错!


week 16-Nginx 负载均衡_第24张图片
web01

第三次 负载分配给 web02
week 16-Nginx 负载均衡_第25张图片
web02

week 16-Nginx 负载均衡_第26张图片
在负载服务器配置文件中加上proxy_next_upstream error timeout

在负载服务器配置文件中加上proxy_next_upstream error timeout ,重启服务

week 16-Nginx 负载均衡_第27张图片
web02

week 16-Nginx 负载均衡_第28张图片
web03

week 16-Nginx 负载均衡_第29张图片
web02

在配置了 proxy_next_upstream error timeout http_403 之后,错误页面不再显示,nginx 负载在分配给web01资源之后,返回的结果是错误的,(定义的403 ,可以定义多个),nginx 不会返回给用户,通过指令寻找下一个主机,分配给返回请求正常的结果之后,返回给用户

Nginx 可以检查主机服务是否正常,但是无法检查页面是否可以正常访问


proxy_set_header X-Forwarded-For示例

week 16-Nginx 负载均衡_第30张图片
week 16-Nginx 负载均衡_第31张图片
日志里边记录了访问IP

week 16-Nginx 负载均衡_第32张图片
抓包记录中也进行了记录

6. proxy 反向代理负载均衡企业应用

6.1 网站服务动静分离

准备环境
上传集群   upload   10.0.0.9 web01  uri==upload  index.html  upload page 
静态集群   static   10.0.0.8 web02  uri==static  index.html  static page 
默认集群   default  10.0.0.7 web03  uri          index.html  default page
当用户访问图片,音频的时候,访问static 集群  
当用户访问首页,访问 default 集群
当用户上传,下载的时候,访问static 集群
week 16-Nginx 负载均衡_第33张图片
动静分离
配置环境
#web01:
echo "default page" >/html/www/index.html
#web02
mkdir /html/www/static/
echo "static page" >/html/www/static/index.html
#web03
mkdir /html/www/upload/
echo "upload page" >/html/www/upload/index.html

# 主机将站点目录创建在www下,否者会提示 404

测试

week 16-Nginx 负载均衡_第34张图片
默认显示 default 10.0.0.7 页面

默认显示 default 10.0.0.7 页面

week 16-Nginx 负载均衡_第35张图片
访问static location的时候,跳转到 static集群

访问static location的时候,跳转到 static集群

week 16-Nginx 负载均衡_第36张图片
访问 upload location的时候,跳转到 upload集群

访问 upload location的时候,跳转到 upload集群


7. 网站服务根据客户端显示不同页面

需要对用户的请求头进行判断

iphone   -->  wap集群      web01    index.html   iphone page  手机端访问iPhone集群
Chrome   -->  web集群      web02    index.html   chrome page chrome浏览器访问 web集群
other    -->  default 集群 web03    index.html   default page 其他浏览器访问 default集群
配置环境 站点首页
  web01 
      echo 'iphone-page' >/html/www /index.html
  web02 
      echo 'chrome-page' >/html/www/index.html
  web03 
      echo 'default-page-other ' >/html/www/index.html
配置环境 负载配置

server {
    listen         80;
    server_name    localhost;
        location / {
            proxy_pass http://default;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_next_upstream error timeout http_403;
            if ($http_user_agent ~* iphone) {proxy_pass http://iphone;}  如果http_user_agent信息是iphone 将资源分配给 iphone集群
            if ($http_user_agent ~* chrome) {proxy_pass http://chrome;}  如果http_user_agent信息是chrome 将资源分配给 iphone集群
                                                                        # 其他浏览器分配至 default 集群
            }
        }
'重启服务测试'

chrome浏览器访问

week 16-Nginx 负载均衡_第37张图片
chrome结果

手机浏览器访问(模拟)

week 16-Nginx 负载均衡_第38张图片
模拟iPhone

其他浏览器测试(IE)

week 16-Nginx 负载均衡_第39张图片
IE浏览器测试


你可能感兴趣的:(week 16-Nginx 负载均衡)