Nginx+负载均衡-2

2018-07-14  本文已影响0人  空留灯半盏

Nginx+负载均衡-2

rewrite重写

规则

语法: location 配置 (注: 需要pcre才能开启此模块)

前缀含义
location =  /uri    精确匹配(必须全部相等)
location ^~ /uri     匹配指定字符开头
location ~  pattern   区分大小写
location ~* pattern  不区分大小写
location /         通用匹配,任何请求都会匹配到 

例如

#精确匹配,网址:http://www.example.com/
location = / {}

#区分大小写 
location ~ /Example/ {}
http://www.example.com/Example/  [成功]
http://www.example.com/example/  [失败]

#不区分大小写 
location ~* /Example/ {}

#匹配指定字符开头
location ^~ /img/ {}
#http://www.example.com/img/a.jpg   [成功]
#http://www.example.com/img/b.mp4   [成功]
#http://www.example.com/video/b.mp4 [失败]

动静分离

准备两台服务器,分别为apache和nginx

修改nginx 配置文件 apache处理php nginx 处理图片

server {
    #监听端口
    listen 80;
    
    #请求php文件则交给大括号处理
    location ~ \.php$ {
        #重写交给指定服务器的指定端口处理
        proxy_pass http://192.168.159.131:8082;
    }
    
    #请求图片则交给大括号处理
    location ~ \.(gif|jpg|jpeg|png)${
        #重写交给指定服务器指定端口处理
        proxy_pass http://192.168.159.131:8081;
    }
}

server{
    #监听端口
    listen 8081;
    
    location / {
    项目跟目录
    root /php/wwwroot/wev2;
    location / {
        #项目根目录
        root /php/wwwroot/web2;
        #默认首页
        index index.html index.htm;
    }
}       

修改配置文件后需要重启服务

vi /php/server/nginx/sbin/nginx -s reload

修改apache配置文件启动服务

vi /php/server/apache/conf/httpd.conf

#apache 服务端口修改为8082
Listen 8082;

重启apache服务

/php/server/apache/bin/Apachectl start

关闭防火墙/将端口8081/8082添加到防火墙例外

service iptable stop #关闭防火墙
vi  /etc/sysconfig/iptables  #添加防火墙例外

运维架构设计方案

架构设计(使用冗余策略,增加备用服务器监控活动服务器)

高可用服务器搭建

什么是HA

HA是英文High Available的缩写,指高可用服务器

当活动服务器出现故障,导致用户无法访问,则使用备用服务器

如何使用高可用服务器(HA)
冷备
活动服务器出现故障,收到阿里云短信报警,需要运营人员手动备用服务器
热备
通过第三方软件( keepalived ),监控活动服务器,当出现故障自动切换到备用服务器
介绍keepalived

什么是keepalived : 就是一个高可用软件

用来检测服务器状态,用来防止单点故障的发生,保证业务的正常运行

原理:

                ->主服务器
用户->VIP(虚拟IP)
               ->备用服务器

安装keepalived

安装: yum -y install keepalived
管理: service keepalived start/stop/restart #启动/关闭/重启
配置文件: /etc/keepalived
日志文件: /var/log/messages
配置部署keepalived

至少准备两台服务器(查看ip信息)

分别在两台服务器上安装nginx并访问测试 (安装具体见上一将)

分别在两台服务器上安装keepalived

yum -y install keepalived

分别查看两台服务器网卡 ip a

配置活动服务器

vi /etc/keepalived/keepalived.conf

留下配置文件第一行 并将其与代码替换以下代码
#健康检查配置
vrrp_script check_web {
    #监控本机80端口
    script "</dev/tcp/127.0.0.1/80"
    interval 2  #每隔2秒中检测一次
    fall 2      #检查2次异常则切换备用服务器
    rise 1      #检查正常次数
}

#虚拟路由
vrrp_instance VI_1 {
    state MASTER            #活动服务器(MASTER) 备用服务(BACKUP)
    interface eth0          #绑定的网卡
    virtual_router_id 51    #虚拟路由器的ID,有效范围为0-255
    priority 100            #优先级
    advert_int 1            #健康检查时间
    authentication {        #身份认证
        auth_type PASS
        auth_pass 1111
    }

    track_script {          #健康检查脚本
        check_web
    }

    virtual_ipaddress {     #VIP(虚拟IP地址)
        192.168.159.200
    }
}
#注:修改VIP 和绑定网卡

启用/重启活动服务器/备份服务器

访问测试....

负载均衡

负载均衡架构图

负载均衡.png

负载均衡策略

轮询: 将请求依次轮询发给每个服务器

权重: 服务器的权重越高,处理请求的概率越大

ip哈希: 通过哈希函数决定请求发送给哪个服务器

最少连接: 将请求发给持有活动连接的服务器.

语法(修改nginx配置文件)
http {
    #设定负载均衡的服务器列表 phpServers 可以写网址或ip或其他英文
upstream phpServers {
    #默认轮询
    #权重     server 服务器IP:端口 weight=3;
    #ip哈希  ip_hash;
#最少连接 least_conn;
        server 服务器IP:端口;
        server 服务器IP:端口;
        server 服务器IP:端口;
    }

    server {
        listen 80;

        location / {
            # 当80端口有请求的时候交给上面定义的负载均衡器处理(phpServers)
            proxy_pass http://phpServers;
        }
    }
}

SESSION共享

明确: session存储在服务端(打开php配置文件可以查看存储路径)

发现: 由于实现了复制均衡的轮询策略导致session丢失

解决

使用ip哈希负载均衡策略

session入库(将session保存的数据库中)

实现

准备主服务器(注: 实现轮询结果)

server {
    Listen 80;
    server_name   localhost;
    #charset koi8-r;
    $access_log logs/host.access.log  main;
        location / {
            #现在: 所有请求交给负载均衡器处理
            #解释: 当80端口有请求的时候交给上面定义的负载均衡器处理(phpServer)
            proxy_pass  http://phpServers;
            #之前: 所有的请求访问html目录下的文件
            #root  html;
            #index  index.html  index.htm
        }
    #error_page  404  /404.html
    #redirect  server error pages to the static page /50x.html
}

打开从服务器的nginx配置文件

在server{

    location ~ \.php$ {
        root            站点目录(比如 /php/wwwroot/web1);
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index    index.php
        fastcgi_param     SCRIPT_FILENAME   站点目录/$fastcgi_script_name;
        include           fastcgi_params;
        }
    .....
}

重启服务..

/php/server/nginx/sbin/nginx -s reload

在从A服务器站点目录中创建test.php文件并写入session代码打印

<?php
   session_start();
$_SESSION['TEST'] = 'xxsdxas';
   print_r($_SESSION)'

在从B服务器创建..

<?php
 session_start(); 
print_r($_session);
session负载均衡丢失.png

修改配置文件

vi /phpserver/nginx/conf/nginx/conf

upstream phpServers {
    ip_hash;
    server 192.168.80.88;
    server 192.168.80.89;
}

重启服务...

发现只能查看到一台服务器(hash原因) 每次就只能访问一个服务器读取session 并在B服务器上设置session即可;

上一篇 下一篇

猜你喜欢

热点阅读