Lamp 架构 搭建 论坛网站

实验环境:

firewalld : stoped
selinux:   disabled

一. 构建lamp架构搭建论坛网站

在server1和server2上都安装部署相同的论坛网站,且二者共用同一个数据库,达到数据共享的效果。

部署server1结点:

1.安装部署httpd

(1).安装apache并开启

[root@server1 ~]# yum install -y httpd
[root@server1 ~]# systemctl start httpd
[root@server1 ~]# systemctl enable httpd

(2).编写配置文件

[root@server1 ~]# cd /etc/httpd/conf.d/
[root@server1 conf.d]# ls
autoindex.conf  README  userdir.conf  welcome.conf
[root@server1 conf.d]# vim bbs.conf
######################
<VirtualHost *:80>
        DocumentRoot /var/www/bbs/html     #定义发布目录
</VirtualHost>

<Directory "/var/www/bbs/html">     	   #目录授权
        Require all granted
</Directory>

(3).在官网下载论坛

安装包: Discuz_X3.2_SC_UTF8.zip

[root@server1 conf.d]# mkdir -p /var/www/bbs/html
[root@server1 conf.d]# cd /var/www/bbs/html/
root@server1 html]# ls
Discuz_X3.2_SC_UTF8.zip

(4).解压论坛压缩包

[root@server1 html]# yum install -y unzip
[root@server1 html]# unzip Discuz_X3.2_SC_UTF8.zip
[root@server1 html]# ls
Discuz_X3.2_SC_UTF8.zip  readme  upload  utility
[root@server1 html]# cd upload/
[root@server1 upload]# ls
admin.php  connect.php      forum.php  member.php  search.php  uc_server
api        cp.php           group.php  misc.php    source      userapp.php
api.php    crossdomain.xml  home.php   plugin.php  static
archiver   data             index.php  portal.php  template
config     favicon.ico      install    robots.txt  uc_client

(5).更改配置文件

[root@server1 upload]# cd /etc/httpd/conf.d/
[root@server1 conf.d]# vim bbs.conf

(6).重启apache

[root@server1 conf.d]# systemctl restart  httpd

2.安装php

[root@server1 ~]# yum install -y php

3.安装部署mysql

(1).安装mysql并开启服务

[root@server1 ~]# cd /mnt
[root@server1 mnt]# ls
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
[root@server1 mnt]# systemctl start mysqld

(2).初始化

#查看初始密码
[root@server1 ~]# cat /var/log/mysqld.log | grep password
2019-08-28T09:21:16.366448Z 1 [Note] A temporary password is generated for root@localhost: q2Csg7lreX%B
#初始化
[root@server1 ~]# mysql_secure_installation
注意:密码必须由数字,大小写字母,特殊字符组成,且需要大于八位;

(3).创建数据库和用户并授权

[root@server1 ~]# mysql -uroot -phym19970818HYM#
MariaDB [(none)]> show databases;
MariaDB [(none)]> create database discuz;
MariaDB [(none)]> show databases;
#注意:mysql创建的数据库用户密码有要求
MariaDB [(none)]> grant all privileges on discuz.* to discuz@'172.25.66.%' identified by 'hym19970818HYM#';
MariaDB [(none)]> flush privileges;

#测试:
[root@server2 ~]# mysql -udiscuz -phym19970818HYM# -h 172.25.66.1
MariaDB [(none)]> show databases;

4.安装论坛

在网页上输入 172.25.66.1

(1).同意协议

(2).检查安装环境

发现有很多报错信息

1.解决目录不可写问题

安装好httpd后,系统会自动生成apache用户和组信息。只需将upload目录及目录下的内容的所属用户和组更改为apache即可

[root@server1 ~]# id apache
uid=48(apache) gid=48(apache) groups=48(apache)
[root@server1 ~]# cd /var/www/bbs/html/
[root@server1 html]# ls
Discuz_X3.2_SC_UTF8.zip  readme  upload  utility
[root@server1 html]# ll -d upload
drwxr-xr-x 12 root root 4096 May 31  2016 upload
[root@server1 html]# cd upload/
[root@server1 upload]# ll

[root@server1 upload]# cd ..
#更改目录和目录下的所有内容的所属用户和组
[root@server1 html]# chown -R apache.apache upload
[root@server1 html]# ll -d upload/
drwxr-xr-x 12 apache apache 4096 May 31  2016 upload/
[root@server1 html]# ll upload/

测试:刷新网页

2.解决mysqli_connect()不支持问题

默认php不支持数据库,只需安装php-mysql即可

[root@server1 ~]# yum install -y php-mysql
[root@server1 ~]# php -m

注意:必须重启apahce才能生效
[root@server1 ~]# systemctl restart httpd

测试:刷新网页

(3).设置运行环境

(4).连接数据库并设置管理员帐号密码信息(这里忽略我写的数据库密码,因为我之前用的mariadb)

(5).开始安装

(6).安装成功

管理员登陆:

部署server2结点:

1.首先 ,需要安装部署apache和php,此操作完全同server1结点。

2.拷贝论坛信息

注意:千万别在server2上重新搭建论坛,这样搭建出来是两个不同的论坛喔!!!

[root@server1 html]# pwd
/var/www/bbs/html
[root@server1 html]# ls
Discuz_X3.2_SC_UTF8.zip  readme  upload  utility
[root@server1 html]# scp -r upload root@172.25.66.2:/var/www/bbs/html

3.更改目录权限

之所以需要更改目录所属用户和组,是因为在拷贝目录时所属用户和组发生了变更

[root@server2 html]# pwd
/var/www/bbs/html
[root@server2 html]# ll -d upload/
drwxr-xr-x 12 root root 4096 Aug 21 15:04 upload/
[root@server2 html]# chown apache.apache upload/
[root@server2 html]# ll -d upload/
drwxr-xr-x 12 apache apache 4096 Aug 21 15:04 upload/

测试:   输入 172.25.66.2 即可访问论坛

 到此为止,两个共享数据库的论坛网站便搭建完成咯!

二.实现论坛数据同步

1.结构化数据同步

数据分为 结构化数据 和 非结构化数据

结构化数据: 即存在数据库中的数据
非结构化数据: 附件

要使结构化数据同步,只需两个论坛共用一个数据库即可,在此之前已经实现,现只需测试即可;

测试:两个服务器上的discuz论坛是否达到了结构化数据同步

1.在server1服务器上的论坛上,以管理员身份创建用户

(1).管理员登陆

(2).进入管理中心

(3)验证身份

(4).根据提示删除文件

[root@server1 etc]# cd /usr/local/lnmp/nginx/html/bbs/install/
[root@server1 install]# ls
data  images  include  index.php
#删除文件
[root@server1 install]# rm -rf index.php

(5).添加用户


 

(2).在server1服务器上的论坛上,以管理员身份创建用户

(3).登陆数据库,发现在discz数据库中,可以查看到刚添加的两个用户信息。

[root@server1 ~]# mysql -uroot -phym19970818HYM#
mysql> show databases;        #查看数据库
mysql> use discuz;            #使用数据库     
mysql> select * from pre_ucenter_admins;     #查看管理员用户
mysql> select * from pre_ucenter_members;    #查看普通用户

这就说明server1结点上的discuz与server2结点上的discuz实现了结构化数据的共享。

2.非结构化数据同步

首先,默认非结构化数据是不同步的

在server2结点的discuz论坛上,发表带有附件的帖子

[root@server2 ~]# cd /var/www/bbs/html/
[root@server2 html]# ls
Discuz_X3.2_SC_UTF8.zip  upload
#论坛附件存储位置为:/var/www/bbs/html/upload/data/attachment
[root@server2 html]# cd upload/data/attachment/
[root@server2 attachment]# ls
album     common  group  index.htm  profile    temp
category  forum   image  portal     swfupload
[root@server2 attachment]# cd forum/
[root@server2 forum]# ls
201908
[root@server2 forum]# cd 201908/
[root@server2 201908]# ls
21 index.html
[root@server2 201908]# cd 21/
[root@server2 21]# ls
152727vjoedmz2seomfxhz.png  index.html

发现server1结点的discuz论坛上,虽然可以查看到新帖子,但无法查看到帖子中的附件内容,因为附件并没有同步。

[root@server1 ~]# cd /var/www/bbs/html/upload/data/attachment/forum/
[root@server1 forum]# ls


解决方法:利用 rsync + innotify 实现非结构化数据同步

点击此处即可查看附件同步的方法 

在这里我只主要列出相关文件的内容:

[root@server1 ~]# cat /etc/rsyncd.conf
log file=/var/log/rsuncd.log 
pid file=/var/run/rsyncd.pid    
lock file=/var/run/rysnc.lock   
secrets file=/etc/rsync.pass   
motd file=/etc/rsyncd.motd   

[web]                                   
path=/var/www/bbs/html/upload/data/attachment/forum/                                        
comment=/web                        
uid=root                                   
gid=root                                 
port=873                                  
use chroot=no      
read only=no                                   
list=no                                     
max connections=200           
timeout=600                           
auth users=root                         
hosts allow=172.25.66.2 
[root@server1 ~]# cat /etc/rsync.pass 
root:westos
[root@server1 ~]# cat /etc/rsync2.pass 
westos
[root@server1 ~]# cat /scripts/rsync.sh 
#!/bin/bash
srcdir=/var/www/bbs/html/upload/data/attachment/forum/
dstdir=web
excludedir=/usr/local/inotify/exclude.list
rsyncuser=root
rsyncpassdir=/etc/rsync2.pass
dstip=172.25.66.2
 
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib $src
dir | while read file
do
/usr/bin/rsync -vzrtopg --delete --progress $srcdir $rsyncuser@$dstip::$dstdir --password-file=$rsyncpassdir
echo "${file} was rsynced" >> /var/log/rsync.log 2>&1 
done
[root@server2 ~]# cat /etc/rsyncd.conf 
log file=/var/log/rsuncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rysnc2.lock
secrets file=/etc/rsync2.pass
motd file=/etc/rsyncd.motd

[web]
path=/var/www/bbs/html/upload/data/attachment/forum/
comment=web
uid=root
gid=root
port=873
use chroot=no
read only=no
list=no
max connections=200
timeout=600
auth users=root
hosts allow=172.25.66.1
[root@server2 ~]# cat /etc/rsync2.pass
root:westos
[root@server2 ~]# cat /etc/rsync.pass
westos
[root@server2 ~]# cat /scripts/rsync.sh 
#!/bin/bash
srcdir=/var/www/bbs/html/upload/data/attachment/forum/
dstdir=web
excludedir=/usr/local/inotify/exclude.list
rsyncuser=root
rsyncpassdir=/etc/rsync.pass
dstip=172.25.66.1
 
/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e modify,delete,create,attrib $src
dir | while read file
do
/usr/bin/rsync -vzrtopg --delete --progress $srcdir $rsyncuser@$dstip::$dstdir --password-file=$rsyncpassdir
echo "${file} was rsynced" >> /var/log/rsync.log 2>&1
done

测试:两个服务器上的discuz论坛是否达到了非结构化数据同步

访问在server2结点上Discuz论坛,登陆admin帐号,发表带有附件的帖子;(注意:需要先删除之前发的帖子)

访问在server1结点上Discuz论坛,登陆admin帐号,发现可以查看到帖子中附件的内容;

这就说明:两个服务器上的discuz论坛实现了非结构化数据的同步

三.利用HAproxy实现网站负载均衡

选择HAproxy的原因很简单,它的安装以及配置相对于nginx更为简单,并且HAproxy自带健康检查。

1.安装HAproxy

(1).下载haproxy压缩包并解压

安装包:haproxy-1.7.3.tar.gz

点击此处即可下载haproxy安装包

[root@server3 ~]# ls
haproxy-1.7.3.tar.gz
[root@server3 ~]# tar zxf haproxy-1.7.3.tar.gz
[root@server3 ~]# ls
haproxy-1.7.3  haproxy-1.7.3.tar.gz

(2).制作rpm包

#1.安装 rpm偏包 制作工具
[root@server3 ~]# yum install -y rpm-build 
#2.安装依赖包
[root@server3 ~]# yum install -y pcre-devel gcc
#3.制作rpm包
[root@server3 ~]# rpmbuild -tb haproxy-1.7.3.tar.gz 

(3).安装haproxy

[root@server3 ~]# ls
haproxy-1.7.3  haproxy-1.7.3.tar.gz  rpmbuild
[root@server3 ~]# cd rpmbuild/RPMS/x86_64/
[root@server3 x86_64]# ls
haproxy-1.7.3-1.x86_64.rpm  haproxy-debuginfo-1.7.3-1.x86_64.rpm
[root@server3 x86_64]# rpm -ivh haproxy-1.7.3-1.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:haproxy-1.7.3-1                  ################################# [100%]

2.拷贝配置文件

[root@server3 x86_64]# cd /root/haproxy-1.7.3/examples
[root@server3 examples]# ls
acl-content-sw.cfg     debugfind              seamless_reload.txt
auth.cfg               errorfiles             ssl.cfg
check                  haproxy.init           stats_haproxy.sh
check.conf             haproxy.spec           transparent_proxy.cfg
content-sw-sample.cfg  haproxy.vim            wurfl-example.cfg
debug2ansi             init.haproxy
debug2html             option-http_proxy.cfg
[root@server3 examples]# cp content-sw-sample.cfg /etc/haproxy/haproxy.cfg

3.编写配置文件

[root@server3 ~]# vim /etc/haproxy/haproxy.cfg
##全局配置
global
        maxconn         10000          #设定每个HAProxy进程所能接受的最大并发连接数
        stats socket    /var/run/haproxy.stat mode 600 level admin    #用户访问统计数据的接口
        log             127.0.0.1 local0
        uid             200            #运行HAProxy进程的uid
        gid             200            #运行HAProxy进程的gid
        chroot          /var/empty     #修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作
        daemon                         #让haproxy以守护进程的方式工作于后台

##默认参数配置
defaults
        mode            http
        log             global         #应用全局的日志配置
        option          httplog        #启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求日志
        option          dontlognull    #启用该项,日志中将不会记录空连接
        monitor-uri     /monitoruri    #健康检查
        maxconn         80000          #每个进程可用的最大连接数
        timeout client  30s            #客户端非活动状态的超时时长

        stats uri       /admin/stats   #监控进程

        option prefer-last-server
        retries         2              #定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用
        option redispatch              #当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉
        timeout connect 5s             #定义haproxy将客户端请求转发至后端服务器所等待的超时时长
        timeout server  5s             #客户端与服务器建立连接后,等待服务器端的超时时长


##监听配置(这些套接字可接受客户端请求并与之建立连接)
frontend public
        bind      *:80 name clear      #监听的地址和端口
        default_backend dynamic

##后端配置(代理将会将对应客户端的请求转发至这些服务器)
backend dynamic
        balance         roundrobin
        server          dynsrv1 172.25.66.1:80  check inter 1000
        server          dynsrv2 172.25.66.2:80  check inter 1000

注释:

balance <algorithm>                        ##后端服务器组内的服务器调度算法(负载均衡算法)

常用的调度算法算法:

roundrobin      #基于权重进行轮叫,在服务器的处理时间保持均匀分布时,这是最平衡、最公平的算法。此算法是动态的,这表示其权重可以在运行时进行调整,不过,在设计上,每个后端服务器仅能最多接受4128个连接;并支持慢启动。
static-rr       #基于权重进行轮叫,与roundrobin类似,但是为静态算法:在运行时调整其服务器权重不会生效;不过,其在后端服务器连接数上没有限制;不支持慢启动,在高负荷的情况下,服务器重新上线时会立即被分配大量连接。

leastconn       #适用于长连接的会话,新的连接请求被派发至具有最少连接数目的后端服务器;在有着较长时间会话的场景中推荐使用此算法

server <name> <address>[:port] [param*]    ##定义后端主机的各服务器及其选项

<name>          #服务器在haproxy上的内部名称;出现在日志及警告信息;
<address>       #服务器地址,支持使用主机名;
[:[port]]       #端口映射;省略时,表示同bind中绑定的端口;
check           #对当前server做健康状态检测
inter <delay>   #连续两次检测之间的时间间隔,默认为2000ms; 

4.建立用户和组

[root@server3 ~]# id haproxy
id: haproxy: no such user
[root@server3 ~]# groupadd -g 200 haproxy
[root@server3 ~]# useradd -u 200 -g 200 -s /sbin/nologin -M haproxy
[root@server3 ~]# id haproxy
uid=200(haproxy) gid=200(haproxy) groups=200(haproxy)

5.启动haproxy

[root@server3 ~]# /etc/init.d/haproxy start
Starting haproxy (via systemctl):                          [  OK  ]
[root@server3 ~]# chkconfig haproxy on
[root@server3 ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      2633/haproxy        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      710/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      896/master          
tcp6       0      0 :::22                   :::*                    LISTEN      710/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      896/master 

测试:  

输入 172.25.66.1 即可访问论坛网站 

输入:172.25.66.1/monitoruri 即可查看健康检查   

输入:172.25.66.1/admin/stats 即可监控结点信息

模拟server1服务器宕机:

[root@server1 ~]# systemctl stop httpd

发现输入 172.25.66.3 仍然可以访问论坛,这就说明负载均衡部署成功!

并且可以发现,监控已检测到server1服务器宕机;

如果两台服务器都挂了,那么论坛网站将无法访问;

四.数据库高可用

点击此处即可查看数据库的高可用

注意事项:

1.在做主从复制的时候肯定会报错,因为两个数据库数据不一致。此时需要做数据备份与恢复

点击此处即可查看数据库的备份与恢复方法

2.在MHA故障切换时,可能也出现一系列的报错

点击此处即可查看各种报错解决方案

3.要实现主从故障切换很容易,但注意论坛连接的数据库是安装时便设定好了的,那么如何才能在主从切换时,论坛自动切换连接的数据库呢?

解决方案:首先让论坛自动切换连接的数据库主机ip是一件很困难的事,那换个思路吧,利用脚本实现MHA主从故障切换和vip的漂移,再将论坛连接的数据库更换为此vip就好咯~

(1).脚本实现MHA主从故障切换和vip的漂移

点击此处即可查看如何利用脚本实现MHA主从故障切换与VIP的漂移

(2).论坛更换连接的数据库

[root@server2 ~]# cd /var/www/bbs/html/upload/config
[root@server1 config]# vim config_global.php

[root@server1 config]# vim config_ucenter.php

[root@server2 uc_server]# vim /var/www/bbs/html/upload/uc_server/data/config.inc.php

测试:

[root@server1 ~]# ip a

1.手动将master切换到server2结点上

[root@server1 ~]# masterha_master_switch --master_state=alive --conf=/etc/masterha/app1.conf --new_master_host=172.25.66.2 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000

2.发现主从切换的同时,vip也会随之漂移到server2结点上

[root@server1 ~]# ip a

[root@server2 ~]# ip a

3. 输入 172.25.66.3  仍旧可以访问论坛网站

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值