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
软件版本
  • 管理服务用户设置为 www
vim /etc/nginx/nginx.conf
管理用户设置
  • 虚拟主机配置文件相同
web01
web02
web03
  • 站点目录结构相同
tree /html/www
web01

web02

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上测试访问站点


    测试访问
  • 打开浏览器测试


    刷新第一次
刷新第二次
刷新第三次

配置完成

总结要注意的问题

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系统中测试对比默认与设置了权重之后的区别

权重测试

默认轮巡分配

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

设置权重之后

访问了六次负载,可以看到设置了权重之后,负载分配每个主机的情况是 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功能的服务器

示例:

设置节点备份功能

配置web03 10.0.0.9设置为节点备份服务器

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

此时已经不再访问web03

停掉 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;
} 

image.png

关闭之后访问

也可以使用 #注释掉主机所在行,也可以关掉,与down 类似
另一种方法


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 示例
官方说明

将web01首页文件修改

第一次 负载分配各 web03


web03

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


web01

第三次 负载分配给 web02
web02

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

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

web02

web03

web02

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

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


proxy_set_header X-Forwarded-For示例

日志里边记录了访问IP

抓包记录中也进行了记录

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 集群
动静分离
配置环境
#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

测试

默认显示 default 10.0.0.7 页面

默认显示 default 10.0.0.7 页面

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

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

访问 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浏览器访问

chrome结果

手机浏览器访问(模拟)

模拟iPhone

其他浏览器测试(IE)

IE浏览器测试

\color{red}{Nginx 负载常用功能复习完成}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,681评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,710评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,623评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,202评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,232评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,368评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,795评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,461评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,647评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,476评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,525评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,226评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,785评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,857评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,090评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,647评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,215评论 2 341

推荐阅读更多精彩内容