一,实验目的

利用Haproxy+Discuz实现数据的动静分离

二,实验模型

利用Haproxy对Discuz实现数据的动静分离_第1张图片

三,实验环境

利用Haproxy对Discuz实现数据的动静分离_第2张图片

四,实验内容

1,首先在node2,3上安装http服务,安装PHP

2,提供NFS文件共享存储

配置node2的web根目录为nfs共享目录为挂载在node3的文件根目录下。

node3: mount -t nfs 172.16.18.1:/var/www/html/upload   /var/www/html/upload

3,在node2上部署Discuz论坛

将Discuz解压到站点根目录下。进MySQL创建discuz库。

mysql> create database discuz;

Query OK, 1 row affected (0.23 sec)

mysql> GRANT ALL ON *.* TO  'root'@'10.%.%.%' IDENTIFIED BY 'aolens'         创建一个用户给他权限。

Discuz的具体部署可以查看此链接:http://aolens.blog.51cto.com/7021142/1548539

利用Haproxy对Discuz实现数据的动静分离_第3张图片

论坛已经配置好了。

将网址根复制到node3的对应目录下。

4,在前端node1上安装haproxy,配置haproxy

yum  install haproxy

前段代理haproxy配置

 

[root@node2 ~]# vim /etc/haproxy/haproxy.cfg

#---------------------------------------------------------------------

# Global settings

#---------------------------------------------------------------------

global                                                                                #全局段

    # to have these messages end up in /var/log/haproxy.log you will

    # need to:

    # 1) configure syslog to accept network log events. This is done

    # by adding the '-r' option to the SYSLOGD_OPTIONS in

    # /etc/sysconfig/syslog

    # 2) configure local2 events to go to the /var/log/haproxy.log

    # file. A line like the following can be added to

    # /etc/sysconfig/syslog

    # local2.* /var/log/haproxy.log

    log 127.0.0.1 local2                       #日志,需要在/etc/rsyslog启用日志记录,添加local2.*   /var/log/haproxy.log

    chroot /var/lib/haproxy

    pidfile /var/run/haproxy.pid   

    maxconn 4000                                                                #haproxy进程所接受的最大并发连接数

    user haproxy

    group haproxy

    daemon                                                                         #让haproxy以守护进程的方式工作于后台

    # turn on stats unix socket

    stats socket /var/lib/haproxy/stats

#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults                                                                                #所有其它配置段提供默认参数

    mode http                                                                        #实例运行于HTTP模式

    log global                                                    #当前实例的日志系统参数同"global"段中的定义时,将使用此格式

    option httplog                                                                  #启用记录HTTP请求、会话状态和计时器的功能。

    option dontlognull

    option http-server-close

    option forwardfor except 127.0.0.0/8

    option redispatch

    retries 3

    timeout http-request 10s

    timeout queue 1m

    timeout connect 10s

    timeout client 1m

    timeout server 1m

    timeout http-keep-alive 10s

    timeout check 10s

    maxconn 3000                                             #设定一个前端的最大并发连接数,因此,其不能用于backend区段

#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

frontend main *:80                                                                                      #前端接收设置

    acl url_static path_beg -i /static /p_w_picpaths /javascript /stylesheets        #定义静态内容前缀

    acl url_static path_end -i .jpg .gif .png .css .js .html .ico                        #定义静态内容后缀

    use_backend static if url_static                                                               #匹配到调用static静态服务器

    default_backend app                                                                              #默认调用app动态服务器

#---------------------------------------------------------------------

# static backend for serving up p_w_picpaths, stylesheets and such

#---------------------------------------------------------------------

backend static                                                                           #后端静态服务器设置

    balance roundrobin

    server static 172.16.18.3:80 check

    option forwardfor except 127.0.0.1/8           #允许在发往服务器的请求首部中插入“X-Forwarded-For”首部。

#---------------------------------------------------------------------

# round robin balancing between the various backends

#---------------------------------------------------------------------

backend app                                                             #后端动态服务器的设置

    balance roundrobin                                              #使用轮询的调度方式,不过我们后端动态服务器只有一个

    cookie srv insert nocache                   #插入cookie,使其可以访问到后端的同一台动态服务器,防止登录信息丢失

    server app1 172.16.18.1:80 check cookie app1

    option forwardfor except 127.0.0.1/8           #添加X-forwarded-for头部信息,向后端主机提供真实访问IP,需要在httpd配置文件中修改

listen admin_stat                                                         #状态页面设置

    bind *:8080                                                              #监听端口 

    stats enable

    stats uri /haproxy

    stats refresh 10s

    stats auth admin:admin

    stats admin if TRUE

    option forwardfor except 127.0.0.1/8

启动haproxy:访问node1

利用Haproxy对Discuz实现数据的动静分离_第4张图片

上传一个图片上去。清除cookie信息访问

利用Haproxy对Discuz实现数据的动静分离_第5张图片

将挂载的目录upload替换为复制的upload目录就可以看到,上传的图片不在了。

利用Haproxy对Discuz实现数据的动静分离_第6张图片

动静分离完成。如果停掉node3上的http服务。可以看到整个页面的图片数据不见了,但是框架还在。说明静态数据请求就是node3。

利用Haproxy对Discuz实现数据的动静分离_第7张图片

而我们第一的listen段启用的stats

192.168.1.12:8080/haproxy?stats

利用Haproxy对Discuz实现数据的动静分离_第8张图片

可以通过此页面控制查看各服务器的状态。

实验到此结束!