Day-42代理与负载均衡

1.代理

  • 概念:代为办理

  • 分类

    正向代理:上网,vpn

    反向代理:nginx

  • 区别

    正向代理是为客户端服务

    反向代理是为服务端服务

  • nginx代理(反向代理)

    代理模式:http,websocket,https,fastcgi,uwsgi,grpc

    代理模块:ngx_http_proxy_module,ngx_http_fastcgi_module,ngx_http_uwsgi_module,nginx_http_v2_module

  • nginx代理语法

    #代理设置头把信息给后端服务器读取
    proxy_redirect defult;
    proxy_set_header Host $http_host;
    proxy_set-header X-Real-IP $remote_addr;
    #连接超时
    proxy_set_connect_timeout 30;
    #请求后处理时间
    proxy_send_timeout 60;
    #接受后处理时间
    proxy_read_timeout 60;
    #读取头信息的大小
    proxy_huffer_size 32k;
    #缓冲
    proxy_buffering on;
    proxy_buffers 4 128k;
    proxy_busy_buffers_size 256k;
    
  • nginx反向代理实例

    #代理配置
    [root@lb01 conf.d]# cvim proxy_web.conf
    server {
      listen 80;
      server_name web.com;
      location / {
          proxy_pass http://10.0.0.7:80;
          proxy_http_version 1.1;
          proxy_set_header Host $http_host;
          proxy_set_header X-Forwarded-For $proxy_add_x_forword_for;
      }
    }
    #web1配置
    [root@web01 conf.d]# cvim web.conf
    server {
      listen 80;
      server_name web.com;
      root /web;
      client_max_body_size 100m;
      
      location / {
      index index.html
      }
    }
    #web2配置
    [root@web02conf.d]# cvim web.conf
    server {
      listen 80;
      server_name web.com;
      root /web;
      client_max_body_size 100m;
      
      location / {
      index index.html
      }
    }
    #host劫持
    #访问网站测试
    

2.负载均衡

  • 概念:高可用网络基础架构的的一个关键组成部分,有了负载均衡,可以将我们的应用服务器部署多台,然后通过负载均衡将用户的请求分发到不同的服务器用来提高网站、应用、数据库或其他服务的性能以及可靠性

  • 作用

    解决单点故障问题

    解决多个用户在同一时间内访问服务器响应慢

  • 场景:四层负载均衡与七层负载均衡

    四层:转发·改写数据包·源IP·端口·真实ip,目标端口

    七层:代理 代为办理

  • 四层与七层的区别

    效率:四层远高于七层

    功能:七层可以url匹配,设置头部信息

  • 配置七层负载均衡

    [root@lb01 conf.d]# vim fz.conf
    upstream fz {
      server 10.0.0.7:80;
      server 10.0.0.8:80;
    }
    server {
      listen 80;
      server_name fz.com
      
      location / {
          proxy_pass http://fz;
          include proxy_params;
      }
    }
    [root@lb01 ~]# vim /etc/nginx/proxy_params
    proxy_http_version 1.1;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for
    
    proxy_connect_timeout 30;
    proxy_send_timeout 60;
    proxy_read_timeout 60;
    
    proxy_buffering on;
    proxy_buffer_size 32k;
    proxy_buffers 4 128k;
    调度算法
    
  • 七层负载均衡调度算法

    轮询
    #按时间顺序逐一分配到不同的后端服务器(默认)机器的配置一致(web集群 硬件环境 一致)
    weight
    #加权轮询,weight值越大,分配到的访问几率越高机器硬件不一致的情况下使用  (硬件  pc机)
    ip_hash
    #每个请求按访问IP的hash结果分配,这样来自同一IP的固定访问一个后端服务器
    解决问题:能解决会话保持的问题   
    带来新的问题:会造成后端负载不均衡
    url_hash
    #按照访问URL的hash结果来分配请求,是每个URL定向到同一个后端服务器
    least_conn
    #最少链接数,个机器链接数少就分发
    
  • 七层负载均衡后端状态

       状态             概述
      down                当前的server暂时不参与负载均衡
      backup              预留的备份服务器
      max_fails           允许请求失败的次数
      fail_timeout        经过max_fails失败后, 服务暂停时间
      max_conns           限制最大的接收连接数
    
    
  • 七层负载均衡实现Redis会话共享

    1、粘性session
    粘性session是指Ngnix每次都将同一用户的所有请求转发至同一台服务器上,及Nginx的 IP_hash。
    
    2、session复制
    即每次session发生变化时,创建或者修改,就广播给集群中的服务器,使所有的服务器上的session相同。
    
    3、session持久化 ( 慢 )
    将session存储至数据库中,像操作数据一样操作session。
    
    4、session共享
    缓存session至内存数据库中,使用redis ( 内存-->刷到磁盘  ),memcached (内存数据库)。
    
  • #在172.16.1.8和172.16.1.7安装phpmyadmin     
    #1.安装phpmyadmin(web01和web02上都装)
    [root@web01 conf.d]# cd /code
    [root@web01 code]# wget https://files.phpmyadmin.net/phpMyAdmin/4.8.4/phpMyAdmin-4.8.4-all-languages.zip
    [root@web01 code]# unzip phpMyAdmin-4.8.4-all-languages.zip
    #2.配置phpmyadmin连接远程的数据库
    [root@web01 code]# cd phpMyAdmin-4.8.4-all-languages/
    [root@web01 phpMyAdmin-4.8.4-all-languages]# cp config.sample.inc.php config.inc.php
    [root@web01 phpMyAdmin-4.8.4-all-languages]# vim config.inc.php
    /* Server parameters *
    /$cfg['Servers'][$i]['host'] = '172.16.1.51';
    #接入负载均衡
    [root@lb01 conf.d]# cat proxy_php.oldxu.com.conf 
    upstream  php {
      server 172.16.1.7;
      server 172.16.1.8;
    }
    
    server {
      listen 80;
      server_name php.oldxu.com;
      location / {
          proxy_pass http://php;
          proxy_set_header Host $http_host;
      }
    }
    #发现无法正常登陆
    #1.解决方法:  
    在负载均衡上配置ip_hash会话保持*(ip_hash的缺点)
    [root@lb01 conf.d]# cat proxy_php.oldxu.com.conf 
    upstream  php {
      ip_hash;
      server 172.16.1.7;
      server 172.16.1.8;
    }
    
    server {
      listen 80;
      server_name php.oldxu.com;
      location / {
          proxy_pass http://php;
          proxy_set_header Host $http_host;
      }
    }
    #既希望能够实现流量的均摊,又希望会话的问题得以保持, 所以引入了redis
    
    #1)安装redis
      [root@db01 ~]# yum install redis -y
    #2)配置redis
      [root@db01 ~]# sed -i '/^bind/c bind 127.0.0.1 172.16.1.51' /etc/redis.conf
    #3)启动redis
      [root@db01 ~]# systemctl enable redis
      [root@db01 ~]# systemctl start redis
    #4) 改造php, session写本地修改为写入redis中  (所有的web上都需要配置)
    PS:已经安装过了redis的模块---> php71w-pecl-redis
    #修改php存储session至redis中
    [root@db01 ~]# vim /etc/php.ini
    session.save_handler = redis
    session.save_path = "tcp://172.16.1.51:6379?weight=1"
    #修改php-fpm 注释默认存储session的位置
    [root@web01 ~]# vim /etc/php-fpm.d/www.conf
    ;php_value[session.save_handler] = files
    ;php_value[session.save_path]    = /var/lib/php/session
    #将修改后的配置文件,推送至172.16.1.8
    [root@web01 ~]# scp /etc/php.ini root@172.16.1.8:/etc/  
    [root@web01 ~]# scp /etc/php-fpm.d/www.conf  root@172.16.1.8:/etc/php-fpm.d/www.conf
    #重启172.16.1.7 172.16.1.8两台服务器的php-fpm
    [root@web02 conf.d]# systemctl restart php-fpm
    #测试效果
    #浏览器登录测试  (ok)
    #查看redis的sessionID和    浏览器cookie中提交的sessionID是否一致
    [root@db01 ~]# redis-cli 
    127.0.0.1:6379> keys *
    "PHPREDIS_SESSION:38ecc8696c70a7252d943e7cb9b20f70"
      
    
  • 案例

    企业案例:使用nginx负载均衡时,如何将后端请求超时的服务器流量平滑的切换到另一台上。如果后台服务连接超时,Nginx是本身是有机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,应该如何处理。
    可以在负载均衡添加如下配置proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率。

    server {
        listen 80;
        server_name xuliangwei.com;
    
        location / {
            proxy_pass http://node;
            proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
        }
    }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。