LVS负载均衡+keepalived高可用+Nginx反向代理+Session共存

一、准备相关资源并规划

说明:
Nginx主服务器,Nginx备服务器,(keepalived心跳检测进行宕机切换)

安装phpstudy服务器三天台(或者多台),由Nginx进行反向代理和负载均衡,此处可以搭建服务器集群(多个应用集群)

redis服务器,用于多台应用服务器的Session的分离共享

参数配置:

虚拟ip/vip:192.168.0.88

Nginx主服务器 Nginx_Master (IP : 192.168.0.11)

Nginx备服务器 Nginx_Backup (IP : 192.168.0.12)

phpstudy应用服务器 WebServer1 (IP : 192.168.0.142:8027)

phpstudy应用服务器 WebServer2 (IP : 192.168.0.143:8028)

phpstudy应用服务器 WebServer2 (IP : 192.168.0.144:8029)

Redis服务器 Redis_Server (IP : 192.168.0.140)

Mysql服务器 Mysql_Server (IP : 192.168.0.141)
(这个可以不用搭建,也可以自己尝试去搭建,或者搭建主从备份数据库)

(这里我为什么要装phpstudy呢?因为我们需要检测Session,必须要安装配置Nginx或者Apache及PHP,我这里是为了快速配置方便,不用花太多时间去研究应用服务器怎么搭建)

注意访问时需要配置防火墙规则,或者关闭防火墙

大致规划图如下
这里写图片描述



二、搭建主服务器(反向代理 Nginx_Master)

  • 1、安装gcc和安装Nginx需要的依赖包
[root@localhost home]# yum install -y gcc
[root@localhost home]# yum install -y pcre pcre-devel
[root@localhost home]# yum install -y zlib zlib-devel
[root@localhost home]# yum install -y openssl openssl-devel
  • 2、下载Nginx源码包

    可以到Nginx官网下载:Nginx官网

    [或者]

  [root@localhost src]# wget http://nginx.org/download/nginx-1.13.2.tar.gz
  [root@localhost src]# tar -zxvf nginx-1.13.2.tar.gz
  [root@localhost src]# cd nginx-1.13.2
  [root@localhost src]# ./configure --prefix=/usr/local/mysoftware/nginx
  [root@localhost src]# make && make install
  [root@localhost src]# cp /usr/local/mysoftware/nginx/sbin/nginx /usr/bin/nginx
  • 3、开启Nginx
[root@localhost src]# cd /usr/local/mysoftware/nginx/sbin

# 启动nginx
[root@localhost sbin]# nginx

# 停止nginx
[root@localhost sbin]# nginx -s stop

# 重新启动
[root@localhost sbin]# nginx -s reload

# 可通过ps -ef | grep nginx查看nginx是否已启动成功
[root@localhost sbin]# ps -ef|grep nginx
root      19128      1  0 14:49 ?        00:00:00 nginx: master process ./nginx
nobody    19129  19128  0 14:49 ?        00:00:00 nginx: worker process
nobody    19130  19128  0 14:49 ?        00:00:00 nginx: worker process
root      19312 106791  0 16:00 pts/0    00:00:00 grep nginx
  • 4、配置Nginx开机启动

    把/usr/bin/nginx命令添加到/etc/rc.d/rc.local文件中,rc.local文件会在系统启动的时候执行。
    但是centos7建议将开机启动服务写成服务描述文件添加到系统服务中,所以rc.local默认是没有执行权限,这里需要给它添加执行权限。

[root@localhost ~]# vim /etc/rc.d/rc.local
# 添加以下参数
/usr/bin/nginx

[root@localhost ~]# chmod +x /etc/rc.d/rc.local #给执行权限
  • 5、配置Nginx
#Nginx用户和属组
#user  nginx nginx;

#工作进程:数目根据硬件调整,通常等于CPU数量或者2倍于CPU
worker_processes  2;

#错误日志存放路径
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#指定pid存放文件(进程标识符):存放路径。
pid        logs/nginx.pid;

events {
    #使用网络IO模型linux建议epoll,FreeBSD建议采用kqueue window下不指定
    use epoll;

    #允许最大连接数
    worker_connections  1024;
}

http {
    include       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  off;
    access_log  logs/access.log;

    client_header_timeout  3m;
    client_body_timeout    3m;
    send_timeout           3m;

    client_header_buffer_size    1k;
    large_client_header_buffers  4 4k;

    sendfile        on;
    tcp_nopush      on;
    tcp_nodelay     on;

    #fastcgi_intercept_errors on; 

    error_page 404  /404.html;

    #keepalive_timeout  75 20;

    gzip                 on;
    gzip_min_length      1000;
    gzip_types           text/plain text/css application/x-javascript;

    #配置被代理的服务器
    upstream blank {
        server 192.168.0.142:8027;
        server 192.168.0.143:8028;
        server 192.168.0.144:8029;
    }

    server {
            #nginx监听80端口,请求该端口时转发到真实目标
            listen       80;
            #配置访问域名
            server_name  localhost;                  

            location / {
                #这里配置代理是指上面定义的三个被代理目标,blank名字必须一致,
                #设置被代理服务器的端口或套接字,以及URL
                proxy_pass http://blank;

                #proxy_redirect          off;
                #如果是非80端口,配置为Host $host:端口号,目的是将代理服务器收到的
                #用户的信息传到真实服务器上,以下三行,目的是将代理服务器收到的用户的信息传到真实服务器上
                proxy_set_header        Host $host;
                proxy_set_header        X-Real-IP $remote_addr;
                proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

                #设定通过nginx上传文件的大小
                client_max_body_size    10m;

                #如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,
                #来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,
                #也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
                #无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,
                #都返回500 Internal Server Error错误
                client_body_buffer_size 128k;

                #后端服务器连接的超时时间_发起握手等候响应超时时间
                proxy_connect_timeout   300;

                #后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据
                proxy_send_timeout      300;

                #连接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
                #(也可以说是后端服务器处理请求的时间)
                proxy_read_timeout      300; 

                #设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,
                #默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小
                proxy_buffer_size       4k; 

                #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,
                #默认情况也为分页大小,根据操作系统的不同可能是4k或者8k
                proxy_buffers           4 32k;

                #设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长
                proxy_busy_buffers_size 64k;
                proxy_temp_file_write_size 64k;

                add_header Access-Control-Allow-Origin *;
            }

            #这里定义500 502 503 504的错误页面
            error_page   500 502 503 504  /50x.html;
            #错误页面位置
            location = /50x.html {
            #root表示路径 html为nginx安装目录中的html文件夹
            #位于/usr/local/mysoftware/nginx/html/下
               root   html;
            }
    }
}

可以参考更详细的Nginx配置:http://blog.csdn.net/tjcyjd/article/details/50695922

  • 6、安裝keepalived
    下载keepalived下载
    下载popt-static-1.13-7.el6.x86_64.rpm下载
[root@localhost ~]# yum -y install openssl-devel popt-devel

[root@localhost ~]# yum -y install popt-static-1.13-7.el6.x86_64.rpm  
[root@localhost ~]# yum -y install kernel-devel make gcc openssl-devel libnl* popt*

[root@localhost ~]# cd /usr/src
[root@localhost src]# ln -s /usr/src/kernels/2.6.32-696.3.1.el6.x86_64/ /usr/src/linux 

[root@localhost src]# ll
总用量 8
drwxr-xr-x. 2 root root 4096 923 2011 debug
drwxr-xr-x. 4 root root 4096 124 20:49 kernels
lrwxrwxrwx  1 root root   43 74 10:47 linux -> /usr/src/kernels/2.6.32-696.3.1.el6.x86_64/#这里就有了,换上你自己的内核版本

#####这里说明一下kernels目录下的是内核版本
##查看自己的内核版本
[root@localhost src]# ls /usr/src/kernels/
2.6.32-696.3.1.el6.x86_64 ##内核版本

##########
[root@localhost ~]# tar -zxvf keepalived-1.2.7.tar.gz  
[root@localhost ~]# cd keepalived-1.2.7  
[root@localhost keepalived-1.2.7]#./configure --with-kernel-dir=/usr/src/kernels/2.6.32-696.3.1.el6.x86_64/
[root@localhost keepalived-1.2.7]# make && make install

*如果出现一下问题

 checking for nl_socket_modify_cb in -lnl... yes
 checking libnfnetlink/libnfnetlink.h usability... no
 checking libnfnetlink/libnfnetlink.h presence... no
 checking for libnfnetlink/libnfnetlink.h... no
 configure: error: 
     !!! Please install libnfnetlink headers.

*解决办法

##安装这个后,再重新编译安装keepalived!
[root@localhost keepalived-1.2.7]# yum install -y libnfnetlink-devel

进行最后的设定


[root@localhost keepalived-1.2.7]# ln -s /usr/local/keepalived/sbin/keepalived /usr/sbin/keepalived

[root@localhost keepalived-1.2.7]# cp /usr/local/keeplived/etc/sysconfig/keepalived /etc/sysconfig/

[root@localhost keepalived-1.2.7]# cp /usr/local/keeplived/etc/rc.d/init.d/keepalived /etc/init.d/


[root@localhost keepalived-1.2.7]# chmod 755 /etc/init.d/keepalived
[root@localhost keepalived-1.2.7]# mkdir /etc/keepalived
[root@localhost keepalived-1.2.7]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf

##开机自启
[root@localhost keepalived-1.2.7]# chkconfig --add keepalived
[root@localhost keepalived-1.2.7]# chkconfig --level 35 keepalived on
  • 7、配置Keepalived
! Configuration File for keepalived

#全局的配置
global_defs {
   #指定keepalived在发生切换时需要发送邮件(email)到的对象
   notification_email {
      root@localhost
   }
   #指定发件人
   notification_email_from lyrcmd@163.com
   ##指定smtp服务器地址
   #smtp_server 127.0.0.1
   ##指定smtp连接超时时间
   #smtp_connect_timeout 30
   ##运行keepalived机器的一个标识
   router_id LVS_DEVEL
}

#主备配置
vrrp_instance VI_1 {
    ##标示状态为MASTER 备份机为BACKUP
    state MASTER
    ##设置指定keepalived实例绑定的服务器的网卡
    interface eth0
    ##在同一实例下“即同一组主备机下”必须相同,主和备都要用同一个id
    virtual_router_id 51
    ##数字越大权重越大,Master主服务器的权重一定要高于Backup备服务器,Master为100则Backup最大为99
    priority 100
    ##Master与Backup负载均衡器之间同步检查的时间间隔,单位是秒
    advert_int 1
    ##设置认证
    authentication {
        ##主从服务器验证方式,PASS为明文密码验证
        auth_type PASS
        ##密码
        auth_pass 1111
    }
    ##设置虚拟IP/vip,与我们的主备机在同一网段下,可以设置多个,多个要换行
    virtual_ipaddress {
        192.168.0.100
    }
}

重启keepalived测试虚拟ip是否成功配置

[root@localhost ~]# service keepalived restart
[root@localhost ~]# ip add
如下图所示配置成功

这里写图片描述



三、搭建备服务器(反向代理 Nginx_Backup)

搭建方法其实和主服务器一样,不同的是keepalived配置文件,我这里就把主服务器克隆出来

keepalived的配置

! Configuration File for keepalived

#全局的配置
global_defs {
   #指定keepalived在发生切换时需要发送邮件(email)到的对象
   notification_email {
      root@localhost
   }
   #指定发件人
   notification_email_from lyrcmd@163.com
   ##指定smtp服务器地址
   #smtp_server 127.0.0.1
   ##指定smtp连接超时时间
   #smtp_connect_timeout 30
   ##运行keepalived机器的唯一个标识
   router_id LVS_DEVEL
}

##主备配置
vrrp_instance VI_1 {
    ##备机为BACKUP
    state BACKUP
    ##注意--备机网卡标识,一般都是eth0,先查询一下
    interface eth1
    #virtual_router_id必须与主机相同
    virtual_router_id 51
    #权重,备服务器必须比主服务器小
    priority 99
    #MASTER与BACKUP负载均衡器之间同步检查的时间间隔,单位是秒,设置为1秒
    advert_int 1
    #认证,与主机一致
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    #虚拟IP,必须和主服务器一致
    virtual_ipaddress {
        192.168.0.100
    }
}


四、搭建Web_Sever服务器(三台)

同样是先搭建一台,再利用克隆的方式克隆多几台,这里我为了快速方便测试,就装个phpstudy,你们也可以用其他方式搭建都可以,但是必须配上redis就可以。

1、下载phpStudy

[root@localhost home]# wget http://lamp.phpstudy.net/phpstudy-all.bin
[root@localhost home]# chmod +x ./phpstudy-all.bin  ##给权限
[root@localhost home]# ./phpstudy-all.bin

###解压中————————解压完成根据提示完成操作
###等待编译----这个时候你可以去喝杯茶---等个十来分钟(看电脑性能)有的快有的慢

2、操作phpStudy

一般安装在根目录的

[root@localhost ~]# phpstudy start|stop|restart  开启 | 停止 | 重启          

配置文件地址

apache配置文件  /phpstudy/server/httpd/conf/httpd.conf
PHP配置文件    /phpstudy/server/php/etc/php.ini

打开MySQL控制台

[root@localhost ~]# /phpstudy/mysql/bin/mysql -uroot -proot
或者把他复制到/usr/sbin/mysql这样就可以直接打开mysql控制台,不用到目录mysql里面打开。
[root@localhost ~]# cp /phpstudy/mysql/bin/mysql /usr/sbin/mysql

[root@localhost ~]# mysql -uroot -p密码 ##直接打开

问题,php可能连接不了mysql

解决办法

[root@localhost ~]# vim /phpstudy/server/php/etc/php.ini ##修改php配置文件

##在配置文件里面找下面两条,补全等号后面的信息

pdo_mysql.default_socket=/phpstudy/data/mysql.sock
mysql.default_socket=/phpstudy/data/mysql.sock

重启ok-----可以了

3、安装php_redis扩展

下载phpredis下载
下载autoconf-2.62.tar.gz下载

  • 3.1、进入phpredis源码目录并执行php的bin目录下的一个工具叫 phpize
[root@localhost src]# tar -zxvf phpredis.tar.gz
[root@localhost src]# cd phpredis
[root@localhost phpredis]# /phpstudy/server/php/bin/phpize #这个命令一定要在解压后的phpredis里面执行
Configuring for:
PHP Api Version:         20121113
Zend Module Api No:      20121212
Zend Extension Api No:   220121212
  • 3.2、安装autoconf
[root@localhost src]# tar zxvf autoconf-2.62.tar.gz
[root@localhost src]# cd autoconf-2.62
[root@localhost autoconf-2.62]# ./configure && make && make install
  • 3.3、编译安装phpredis并配置
[root@localhost src]# cd phpredis
[root@localhost phpredis]# ./configure --prefix=/usr/local/mysoftware/redis --with-php-config=/phpstudy/server/php/bin/php-config
[root@localhost phpredis]## make && make install

##成功后会有一个提示你,redis扩展在那里
Installing shared extensions: /phpstudy/server/php/lib/php/extensions/no-debug-non-zts-20121212

##此时redis.so扩展已经有了,需要去php配置文件那里把redis配置上去
[root@localhost no-debug-non-zts-20121212]# ls
opcache.so  redis.so
  • 3.5、修改php配置文件 php.ini添加redis扩展
[root@localhost ~]# vim /phpstudy/server/php/etc/php.ini

添加如图所示
这里写图片描述

  • 3.6、重启phpstudy
[root@localhost ~]# phpstudy restart
  • 3.7、查看php是否引入redis扩展
    这里写图片描述

搞定,其他的利用克隆方式就可以了



五、开始搭建Redis服务器

redis服务,解决session共存,其实是把要存的session值改成存redis

下载redis-2.6.14.tar.gz下载

[root@localhost ~]# tar zxvf redis-2.6.14.tar.gz
[root@localhost ~]# cd redis-2.6.14
[root@localhost redis-2.6.14]# make PREFIX=/usr/local/mysoftware/redis install
[root@localhost src]# cd src ##看到下图
[root@localhost redis-2.6.14]# cp redis.conf /usr/local/mysoftware/redis/

这里写图片描述

##启动redis
[root@localhost redis]# ./bin/redis-server ./redis.conf 
##关闭redis
[root@localhost redis]# ./bin/redis-cli shutdown

这种启动方式是前端启动,必须保持在当前窗口,如果 退出了redis也就退出了,要改为后端启动:
首先修改redis.conf中daemonize的值
这里写图片描述

打开redis的配置文件修改如下图,吧daemonize改为yes
这里写图片描述
重启redis ok

六、開始測試

Web1复制设置值,其他两台复制读取值。
这里写图片描述

Web2和Web3

这里写图片描述

在浏览器访问设置的vip

192.168.0.100

这里写图片描述

这里写图片描述

这里写图片描述

以上是轮询的结构

把主服务器断了,测试一下keepalived心跳是否正常

我这里测试了,没有问题!你们也动手玩玩

以上内容仅供学习,有什么错误,或者不对的,请多多指教!大家共同进步,共同学习!谢谢

猜你喜欢

转载自blog.csdn.net/post_mans/article/details/74199758