Nginx负载均衡

1. 基本介绍

  • 1.1 代理:代为办理
  • 1.2 代理分为反向代理和正向代理
    正向代理:用于内部上网。客户端<-->代理-->服务端
    反向代理:用于公司的集群架构中,客户端-->代理<--->服务端
  • 1.3 正向代理和反向代理的区别
    正向代理的对象是客户端,为客户端提供服务(个人的电脑)
    反向代理的对象是服务端,为服务端提供服务(后端的服务不对外)
Nginx负载均衡_第1张图片
image.png
  • 1.4 Nginx代理支持的协议
Nginx负载均衡_第2张图片
image.png
  • 1.5 反向代理的配置语法
[root@lb01 conf.d]# vim proxy_web.oldxu.com.conf 
server {
    listen 80;
    server_name web.oldxu.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_forwarded_for;  #获取真实的ip地址
    }
}
#  web上的配置
[root@web01 conf.d]# cat web.oldxu.com.conf 
server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        root /html;
        index index.html;
    }                                                                                                                                                                                                                                                                   
}

2. 负载均衡

2.1 负载均衡的基本概念

  • 2.1.1 负载均衡:根据客户端的请求按照一定的规则合理均衡的分配到服务器上,并将结果返回相对应的客户端
  • 2.1.2 使用负载均衡得原因
    a 可以根据客户端的请求,使其按照最优的方式分配不同的服务器上执行,达到负载均衡;
    b 解决了单点的问题;
    c 通过减少错误返回来提升用户的体验,因为负载均衡可以检查某台服务器是否存在问题,如果出现问题会将请求分配到其他良好的服务器上
  • 2.1.3 负载均衡和反向代理的区别
    负载均衡基于反向代理的形式实现,反向代理只能代理一台,而负载均衡可以代理多台
  • 2.1.4 负载均衡实现的场景
    a 四层负载均衡(转发,改写数据包)
    四层负载均衡指的是OSI七层模型中的传输层,是将用户的源ip源端口和目标ip目标端口转换为用户真正访问的ip和端口

    *** b 七层负载均衡 (代理,贴近业务)
    七层负载均衡实在应用层,可以完成很多应用方面协议的请求,可以实现http信息的改写,头部信息的改写,安全规则的控制,URL匹配规则的控制,rewrite等等的规则,nginx就是一个典型的七层负载均衡的SLB***
    ***四层负载均衡和七层负载均衡的区别
    七层负载均衡效率没有四负载均衡高。
    四层负载均衡没有七层负载均衡支持的功能多

3 七层负载均衡的配置

Nginx实现负载均衡需要用到proxy_pass代理的模块

[root@lb01 conf.d]# cat proxy_web.oldxu.com.conf 
upstream web {                      #虚拟资源池
    server 172.16.1.7:80;
    server 172.16.1.8:80;
}

server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        proxy_pass http://web;
        include proxy_params;   #调用的变量
    }
}


[root@lb01 conf.d]# cat /etc/nginx/proxy_params 
proxy_http_version 1.1;    #后端代理请求的是HTTP1.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;
                                                   # 获取的真实ip地址
proxy_connect_timeout 30;    # 连接的超时时间
proxy_send_timeout 60;        #发送的超时时间
proxy_read_timeout 60;        #读取的超时时间

proxy_buffering on;    #边传边收
proxy_buffer_size 32k;
proxy_buffers 4 128k;
  • 后端web的配置
[root@web01 conf.d]# cat web.oldxu.com.conf 
server {
    listen 80;
    server_name web.oldxu.com;

    location / {
        root /html;
        index index.html;
    }
}

4.七层负载均衡的调度算法

调度算法 概述
轮询 平均分配,按照时间顺序逐一分配到不同的后端服务器(默认)机器的配置都一致
weight 加权轮询,值越大,分配到的几率越高,强弱,配置不一致
ip_hash 解决了会话的保持,信息对应表,来自同一ip的固定访问一个后端的服务器,会造成负载不均衡
url_hash 根据请求访问的url的hash结果分配,让每一个url定向到同一个后端的服务器
least_conn 最少的连接数,根据那个机器的链接数少就分发到那一台上面

5. 七层负载均衡的后端状态

状态 概述
down 当前的server不参与负载均衡(一般用于停机维护)
backup 预留的备份服务器(相当于备胎)
max_fails 允许请求失败的次数
fail_timeout 经历过max_fails失败后,服务暂停时间
max_conns 限制最大的接收连接数

6.企业案例:

使用nginx负载均衡时,如何将后端请求超时的服务器流量平滑的切换到另一台上。如果后台服务连接超时,Nginx是本身是有剔除机制的,如果出现一个节点down掉的时候,Nginx会更据你具体负载均衡的设置,将请求转移到其他的节点上,但是,如果后台服务连接没有down掉,但是返回错误异常码了如:504、502、500,应该如何处理。
可以在负载均衡添加如下配置proxy_next_upstream http_500 | http_502 | http_503 | http_504 |http_404;意思是,当其中一台返回错误码404,500...等错误时,可以分配到下一台服务器程序继续处理,提高平台访问成功率。
***也就是说如果在nginx正常工作的情况下,后端的php或者是tomcat出现了问题将502或者是503,500,404这样的错误即(proxy_next_upstream的模块是正常的)不显示到页面上平滑的切换到另一台服务器上

server {
    listen 80;
    server_name yueyue.com;

    location / {
        proxy_pass http://node;
        proxy_next_upstream error timeout http_500 http_502 http_503 http_504; 
    }

7.七层负载均衡实现redis会话共享

7.1当用户访问网站时cookie和session之间的工作方式

  • 1>当用户第一次请求服务端网站时,服务端会生成一个session_id,然后使用set_cookie的方式将session_id下发给浏览器,浏览器会将session_id存储到本地的cookies中
  • 2> 当用户再次请求服务端的网站时,浏览器会在headers头部信息携带给网站的cookie信息,则是第一次请求网站时服务端下发的session_id;当用户登录网站后,服务端会将对应的session_id,user,password保存到mysql或者是Redis或者是mamcached中;当用户下次请求网站时,服务端程序会验证浏览器提交的session_id的信息
Nginx负载均衡_第3张图片
image.png

7.2 使用负载均衡实现会话保持的实现方式

  • session复制:每次session发生变换时,创建或修改就广播给集群中的服务器,让所有的服务器上的session相同。
  • session的持久化:将session存储到数据库中,就像操作数据一样操作session(效率慢)。
  • session的共享:缓存session到内存的数据库中,使用redis(写入到内存中,定时存储到磁盘中),memcached(内存数据库,不支持集群,不支持持久化,重启服务后,数据会清空)。

7.3配置

  • 7.3.1首先在web服务器上安装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';
  • 7.3.2 接入负载均衡--->代理后端的web服务器上
[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;
    }
}
  • 7.3.3发现无法正常登录
    解决的方法:在负载均衡上配置 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;
    }
}
  • 7.3.4 既希望能够实现流量的均摊,有希望会话的共享,引入了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上都需要配置)
    前提:  已经安装过了redis的模块---> php71w-pecl-redis

    1.修改php存储session至redis中
    [root@db01 ~]# vim /etc/php.ini
    session.save_handler = redis
    session.save_path = "tcp://172.16.1.51:6379?weight=1"


    2.修改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

    3.将修改后的配置文件,推送至172.16.1.8
    [root@web01 ~]# scp /etc/php.ini [email protected]:/etc/  
    [root@web01 ~]# scp /etc/php-fpm.d/www.conf  [email protected]:/etc/php-fpm.d/www.conf
    
    4.重启172.16.1.7 172.16.1.8两台服务器的php-fpm
    [root@web02 conf.d]# systemctl restart php-fpm
5) 测试效果
    1.浏览器登录测试  (ok)
    
    2.查看redis的sessionID和    浏览器cookie中提交的sessionID是否一致
    [root@db01 ~]# redis-cli 
    127.0.0.1:6379> keys *
    1) "PHPREDIS_SESSION:38ecc8696c70a7252d943e7cb9b20f70"

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