
概述
项目计划用WordPress搭建一个博客系统, 为了性能更好,两个服务器都对外提供WordPress博客系统服务, 数据放在MySQL服务器, 有些上传的图片发送到NFS服务器上,并且把NFS数据实时同步到一个备份服务器上。
服务名称 | IP地址 |
---|---|
DNS | 10.0.0.200 |
WEB1 | 10.0.0.201 |
WEB2 | 10.0.0.202 |
MySQL | 10.0.0.203 |
NFS | 10.0.0.204 |
BACKUp | 10.0.0.205 |
200:DNS服务配置
执行脚本
bash
bash install_dns.sh
#!/bin/bash
#********************************************************************
#Author: wangxiaochun
#QQ: 29308620
#Date: 2020-10-23
#FileName: install_dns.sh
#URL: http://www.wangxiaochun.com
#Description: The test script
#Copyright (C): 2020 All rights reserved
#********************************************************************
HOST=www
HOST_IP=10.0.0.200
LOCALHOST=`hostname -I | awk '{print $1}'`
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_dns () {
if [ $ID = 'centos' -o $ID = 'rocky' ];then
yum install -y bind bind-utils
elif [ $ID = 'ubuntu' ];then
apt update
apt install -y bind9 bind9-utils bind9-host bind9-dnsutils
else
color "不支持此操作系统,退出!" 1
exit
fi
}
config_dns () {
if [ $ID = 'centos' -o $ID = 'rocky' ];then
sed -i -e '/listen-on/s/127.0.0.1/localhost/' -e '/allow-query/s/localhost/any/' -e 's/dnssec-enable yes/dnssec-enable no/' -e 's/dnssec-validation yes/dnssec-validation no/' /etc/named.conf
cat >> /etc/named.rfc1912.zones <<EOF
zone "$DOMAIN" IN {
type master;
file "$DOMAIN.zone";
};
EOF
cat > /var/named/$DOMAIN.zone <<EOF
\$TTL 1D
@ IN SOA master admin (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
master A ${LOCALHOST}
$HOST A $HOST_IP
EOF
chmod 640 /var/named/$DOMAIN.zone
chgrp named /var/named/$DOMAIN.zone
elif [ $ID = 'ubuntu' ];then
sed -i 's/dnssec-validation auto/dnssec-validation no/' /etc/bind/named.conf.options
cat >> /etc/bind/named.conf.default-zones <<EOF
zone "$DOMAIN" IN {
type master;
file "/etc/bind/$DOMAIN.zone";
};
EOF
cat > /etc/bind/$DOMAIN.zone <<EOF
\$TTL 1D
@ IN SOA master admin (
1 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS master
master A ${LOCALHOST}
$HOST A $HOST_IP
EOF
chgrp bind /etc/bind/$DOMAIN.zone
else
color "不支持此操作系统,退出!" 1
exit
fi
}
start_service () {
systemctl enable named
systemctl restart named
systemctl is-active named.service
if [ $? -eq 0 ] ;then
color "DNS 服务安装成功!" 0
else
color "DNS 服务安装失败!" 1
exit 1
fi
}
install_dns
config_dns
start_service
脚本功能概述
-
基础信息:
- 定义了 DNS 域名 (
DOMAIN=wang.org
)、主机名 (HOST=www
)、主机 IP 地址 (HOST_IP=10.0.0.200
)。 - 自动获取当前主机的 IP 地址并赋值给
LOCALHOST
。
- 定义了 DNS 域名 (
-
操作系统检测:
- 通过
/etc/os-release
文件检测操作系统类型,支持 CentOS/Rocky 和 Ubuntu。
- 通过
-
彩色输出:
- 使用 ANSI 转义序列打印不同颜色的信息,提示任务是否成功(
success
)、失败(failure
)、或警告(warning
)。
- 使用 ANSI 转义序列打印不同颜色的信息,提示任务是否成功(
-
DNS 安装:
- 根据操作系统不同,分别使用
yum
或apt
安装 BING 及相关工具。
- 根据操作系统不同,分别使用
-
DNS 配置:
- 修改
named
配置文件,允许外部查询,并禁用 DNSSEC(DNS 安全扩展)。 - 配置 DNS 区域文件,定义主域名(
wang.org
)及其解析记录(包括主机www
)。
- 修改
-
启动服务:
- 将
named
服务设置为开机自启,重启服务并检查运行状态。 - 根据服务状态输出结果。
- 将
配置文件修改
安装完成并验证
bash
host www.wang.org 127.0.0.1

因为要返回201、202的地址,所以要修改配置文件
bash
vim /etc/bind/wang.org.zone

不重启服务生效
bash
rndc reload

验证测试
203: MySQL服务
1. 安装MySQL
bash
apt update && apt install mysql-server -y
2. 配置文件修改
因为MySQL默认监听127.0.0.1
所以需要修改配置文件才能远程连接
bash
vim /etc/mysql/mysql.conf.d/mysqld.cnf

3. 重启MySQL服务
bash
systemctl restart mysql
4. 创建用户和数据库
sql
#创建数据库
mysql> create database wordpress;
#创建登录的用户、密码和允许来源的IP地址
mysql> create user wordpress@'10.0.0.%' identified by '123456';
#用户授权(给用户wordpress@'10.0.0.%'进入wordpress数据库的所有权限)
mysql> grant all on wordpress.* to wordpress@'10.0.0.%';
201、202:WEB服务
1. 安装web服务软件
两个web服务器安装Apache和其依赖
bash
apt update && apt install apache2 php php-mysql -y

2. 安装WordPress
进入WordPress官网下载: 博客工具、发布平台和内容管理系统 -- WordPress.org China 简体中文
拷入安装包并解压:
bash
unzip wordpress-6.2-zh_CN.zip //后面是压缩包文件名
把解压的WordPress目录放到网站所在的目录
bash
mv wordpress/* /var/www/html/
查看(删掉index文件)

输入web服务所在的域名就可以访问网站了


上图信息需要写入WordPress配置文件, 但是配置文件没有写权限,所以我们要打开目录的写权限
查看目录权限

bash
//查看apachede是由哪个身份运行的
ps aux
所以把目录文件权限赋予 www-data
bash
chown www-data.www-data /var/www/html -R
#-R: 递归
查看属性,已经修改成功

重新执行步骤,成功进入,安装完成后10.0.0.203数据库会生成数据库文件

204: NFS服务
NFS(Network File System,网络文件系统)是一种通过网络共享文件的协议,允许不同设备(如服务器和客户端)在网络中共享文件系统,使用户能够像访问本地文件系统一样访问远程文件系统。
进入网站文章发表时上传的图片文件都存于uploads文件夹中,我们下面要做的是把图片文件放入到nfs服务器中

1. 安装NFS(服务端)
bash
apt install nfs-server -y
2. 安装NFS(客户端)
在201、202web服务器安装
bash
apt install nfs-common -y
3. 新建共享文件夹(服务端)
bash
mkdir /data/www -p
新建的目录没有默认给www-data写权限

所以要把所有者,所属组改成www-data
bash
chown www-data.www-data /data/www/ #因为目录为空,所以不用加 -r 选项

4. 新建配置文件(服务端)
bash
mkdir /etc/exports.d/
bash
vim /etc/exports.d/wordpress.exports
/data/www 10.0.0.0/24(rw)

用户不同还需要压榨成相同的用户
让服务生效
bash
exportfs -v //查看是否生效
exportfs -r //生效操作

5. 文件挂载(客户端)
首先把201服务器的文件拷入204服务端共享文件夹,因为一挂载,原来的文件就会丢失
在201服务器下执行:
bash
rsync -av /var/www/html/ 10.0.0.204:/data/www/
#这条命令使用 rsync 工具将本地 /var/www/html/ 目录下的内容同步到远程主机 10.0.0.204 的 /data/www/ 目录
#-a (archive):开启归档模式,递归同步目录,并保留文件的权限、时间戳、符号链接等属性。
#-v (verbose):详细模式,显示同步过程中的详细信息
挂载之前可以用此命令确认是否可以访问
bash
showmount -e 10.0.0.204

可以把文件移走,也可以直接挂载
bash
vim /etc/fstab

查看挂载

这时候201就会出现204服务端的共享文件

在202同样的道理
bash
vim /etc/fstab

这时候文件数据也挂过来了

205: rsync服务
rsync
服务是一个快速且灵活的工具和协议,用于高效同步和传输文件。它在本地和远程系统之间传输文件时,只复制变化部分,从而节省带宽和时间。
rsync是在
204
上安装,因为
204
是源,
205
是目标,
205
配rsync
服务
1. 新建配置文件
205:
bash
[root@ubuntu2204 ~]#cat > /etc/rsyncd.conf
uid = root
gid = root
max connections = 0
ignore errors
exclude = lost+found/
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
reverse lookup = no
[backup]
path = /data/backup/
comment = backup dir
read only = no
auth users = rsyncuser
secrets file = /etc/rsync.pas
还要新建一个放用户名和密码的文件 /etc/rsync.pas
bash
#服务器端准备目录
[root@ubuntu2204 ~]#mkdir -pv /data/backup
#服务器端生成验证文件(用户名和密码+赋权限)
[root@ubuntu2204 ~]#echo "rsyncuser:123456" > /etc/rsync.pas
[root@ubuntu2204 ~]#chmod 600 /etc/rsync.pas

重新启动服务

2. 配置同步信息
204:
在204数据服务器上下载**sersync,**并拷贝到相应的目录解压

创建个软链接起名叫sersync


现在这个二进制文件存在程序环境路径的问题, 所以把它生成到软链接 里去(local/bin也是PATH变量里的文件夹)
bash
ln -s /usr/local/sersync/sersync2 /usr/local/bin/

删掉自带的confxml.xml配置文件,导入下面的文件
XML
<?xml version="1.0" encoding="ISO-8859-1"?>
<head version="2.5">
<host hostip="localhost" port="8008"></host>
<debug start="false"/>
<fileSystem xfs="false"/>
<filter start="false">
<exclude expression="(.*)\.svn"></exclude>
<exclude expression="(.*)\.gz"></exclude>
<exclude expression="^info/*"></exclude>
<exclude expression="^static/*"></exclude>
</filter>
<inotify>
<delete start="true"/>
<createFolder start="true"/>
<createFile start="false"/>
<closeWrite start="true"/>
<moveFrom start="true"/>
<moveTo start="true"/>
<attrib start="true"/>
<modify start="false"/>
</inotify>
<sersync>
<localpath watch="/data/www">
<remote ip="10.0.0.205" name="backup"/>
<!--<remote ip="192.168.8.39" name="tongbu"/>-->
<!--<remote ip="192.168.8.40" name="tongbu"/>-->
</localpath>
<rsync>
<commonParams params="-artuz"/>
<auth start="true" users="rsyncuser" passwordfile="/etc/rsync.pas"/>
<userDefinedPort start="false" port="874"/><!-- port=874 -->
<timeout start="false" time="100"/><!-- timeout=100 -->
<ssh start="false"/>
</rsync>
<failLog path="/tmp/rsync_fail_log.sh" timeToExecute="60"/><!--default every 60mins execute once-->
<crontab start="false" schedule="600"><!--600mins-->
<crontabfilter start="false">
<exclude expression="*.php"></exclude>
<exclude expression="info/*"></exclude>
</crontabfilter>
</crontab>
<plugin start="false" name="command"/>
</sersync>
<plugin name="command">
<param prefix="/bin/sh" suffix="" ignoreError="true"/> <!--prefix /opt/tongbu/mmm.sh suffix-->
<filter start="false">
<include expression="(.*)\.php"/>
<include expression="(.*)\.sh"/>
</filter>
</plugin>
<plugin name="socket">
<localpath watch="/opt/tongbu">
<deshost ip="192.168.138.20" port="8009"/>
</localpath>
</plugin>
<plugin name="refreshCDN">
<localpath watch="/data0/htdocs/cms.xoyo.com/site/">
<cdninfo domainname="ccms.chinacache.com" port="80" username="xxxx" passwd="xxxx"/>
<sendurl base="http://pic.xoyo.com/cms"/>
<regexurl regex="false" match="cms.xoyo.com/site([/a-zA-Z0-9]*).xoyo.com/images"/>
</localpath>
</plugin>
</head>
创建账户密码就可以连接对方了
bash
echo "rsyncuser:123456" > /etc/rsync.pas
chmod 600 /etc/rsync.pas

3. 同步验证
现在 data/backup文件夹为空

在204数据服务器以后台方式执行命令
bash
nohup sersync2 -dro /usr/local/sersync/confxml.xml &> /dev/null #后台执行,有标准输出扔到垃圾箱里
这是看执行过程的方式

现在查看205服务器文件夹,已经同步过来了

在web客户端发布新文章带图片的也可以实时同步过来了
