博客的再一次折腾

博客之前一直都是用的军哥的 LNMP（Linux+Nginx+MySQL+PHP）一键安装脚本搭建 WordPress 网站，中间偶尔也用过宝塔、1pancel 等，但用的最久的还是 LNMP，但从 2023 年下半年，随着作者军哥用爱发电很多年后将网站卖给某公司，有大神发现 LNMP.COM 网站的代码里被恶意植入了后门代码，而该公司同时收购了 oneinstack，同时期出现了恶意代码，LNMP 和 oneinstack 一键网站环境安装包被广泛弃用。

当然替代方案还是有很多的，但还是想借此机会折腾一下新的，那就尝试一下秋水在佬的 LCMP (Linux + Caddy + MariaDB + PHP) 脚本（Github 地址）。Caddy 2 是一款现代、轻量级的开源 Web 服务器，以其简单的配置语法、内置自动 HTTPS 支持、动态配置和服务发现、现代的 HTTP/2 和 HTTP/3 支持、插件系统以及易于部署和管理而脱颖而出。当然论功能、生态、性能等，目前还是 Nginx 更强。

下面就来介绍如何用秋水大佬的 LCMP 一键脚本搭建 WordPress。

目前支持的系统

Enterprise Linux 7 (CentOS 7, RHEL 7)

Enterprise Linux 8 (CentOS Stream 8, RHEL 8, Rocky Linux 8, AlmaLinux 8, Oracle Linux 8)

Enterprise Linux 9 (CentOS Stream 9, RHEL 9, Rocky Linux 9, AlmaLinux 9, Oracle Linux 9)

Debian 10

Debian 11

Debian 12

Ubuntu 20.04

Ubuntu 22.04

目前支持的软件

Caddy 2

MariaDB 10.11

PHP-7.4, PHP-8.0, PHP-8.1, PHP-8.2, PHP-8.3

开搞之前先把依赖安装一下

Copy
apt update && apt -y upgrade
apt install wget -y
apt install socat -y
apt install git -y

开始安装 LCMP

如果是 Debian 10+ / Ubuntu 20.04+：

Copy
apt-get -y install wget git
git clone https://github.com/teddysun/lcmp.git
cd lcmp
chmod 755 *.sh
./lcmp.sh 2>&1 | tee lcmp.log

如果是 Enterprise Linux 7 / 8 / 9：

Copy
yum -y install wget git
git clone https://github.com/teddysun/lcmp.git
cd lcmp
chmod 755 *.sh
./lcmp.sh 2>&1 | tee lcmp.log

等出现如下实样就代表 LCMP 安装好了

Copy
LCMP (Linux + Caddy + MariaDB + PHP) installation complete

个人感觉 LCMP 的操作命令和 LNMP 有点相似，因为它的添加虚拟主机的方式如下：

Copy
lcmp vhost add

是不是有点眼熟，无非是 C 和 N 的区别，具体命令及使用方式参考秋水大佬的Github
至于 Wordpress 的建站过程就不啰嗦了，这应该都不是事。不过我在使用 Wordpress 上传照片或下载插件时碰到了权限问题需要注意一下（可能是我的个例），以往都是赋予网站目录为 www 用户的权限，使用 Caddy 后这样操作还是会出现在后台无法访问的问题，后来翻了很多网站，发现需要将网站目录赋予 caddy 用户权限即可解决，具体操作为（假设网站目录为 /data/www/ 下）

Copy
chown -R caddy:caddy /data/www/*

既然网站搭好了，必要的备份措施还是要的，秋水大佬的一键脚本里目前没有备份脚本，这里从军哥的 Github 里提取了backup.sh魔改一番就可以了，除了本地备份外还将备份文件上传到阿里云的 OSS 中，这样形成双备份以免意外发生，下面是大概的过程及代码：

配置阿里云的 ossutil

安装 ossutil（参考官方教程https://help.aliyun.com/zh/oss/developer-reference/install-ossutil?spm=a2c4g.11186623.0.0.5ed75436NQwjIE）

Copy
sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash

配置 ossutil

Copy
ossutil config

根据提示分别设置 Endpoint、AccessKey ID、AccessKey Secret 和 STSToken 参数，对应的值怎么获取阿里云上都有，唯独需要注意的是 stsToken 这个值官方讲的我一直没怎么明白，浪费了很多时间，后来才知道可以直接回车留空即可，唉！

魔改备份脚本

Copy
# 设置网站备份路径
Backup_Home="/data/www/backup/"
# 设置数据库路径
MySQL_Dump="/usr/bin/mysqldump"
# 设置需要备份的网站路径
Backup_Dir=("/data/www/a.com" "/data/wwww/b.com")
# 设置需要备份的数据库名称,不同的数据表以空格间隔
Backup_Database=("wordpress_" "typecho_")
# 设置Mysql的用户名和密码
MYSQL_UserName='root'
MYSQL_PassWord='123456'
TodayWWWBackup=www-*-$(date +"%Y%m%d").tar.gz
TodayDBBackup=db-*-$(date +"%Y%m%d").sql
OldWWWBackup=www-*-$(date -d -3day +"%Y%m%d").tar.gz
OldDBBackup=db-*-$(date -d -3day +"%Y%m%d").sql
Backup_Dir()
{
Backup_Path=$1
Dir_Name=`echo ${Backup_Path##*/}`
Pre_Dir=`echo ${Backup_Path}|sed 's/'${Dir_Name}'//g'`
tar zcf ${Backup_Home}www-${Dir_Name}-$(date +"%Y%m%d").tar.gz -C ${Pre_Dir} ${Dir_Name}
}
Backup_Sql()
{
${MySQL_Dump} -u$MYSQL_UserName -p$MYSQL_PassWord $1 > ${Backup_Home}db-$1-$(date +"%Y%m%d").sql
}
if [ ! -f ${MySQL_Dump} ]; then
echo "mysqldump command not found.please check your setting."
exit 1
fi
if [ ! -d ${Backup_Home} ]; then
mkdir -p ${Backup_Home}
fi
echo "Backup website files..."
for dd in ${Backup_Dir[@]};do
Backup_Dir ${dd}
done
echo "Backup Databases..."
for db in ${Backup_Database[@]};do
Backup_Sql ${db}
done
echo "Delete old backup files..."
rm -f ${Backup_Home}${OldWWWBackup}
rm -f ${Backup_Home}${OldDBBackup}
# 将备份的数据库上传到阿里云，将Bucket-name改为对应名称
ossutil cp -r -f /data/www/backup/$TodayDBBackup oss://Bucket-name/
ossutil cp -r -f /data/www/backup/$TodayWWWBackup oss://Bucket-name/

测试一下，备份目录下有相应的文件，然后再到阿里云 OSS 中查看，都有说明就成功了，这里只将数据库文件上传到阿里云的 OSS。最后记得添加一条计划任务，具体可参考如下：

Copy
[root@localhost ~]# crontab -e
选项:
-e: 编辑crontab定时任务
-l: 查询crontab任务
-r: 删除当前用户所有的crontab任务

Copy
0 14 * * * /bin/bash /data/www/backup/backup.sh

终于折腾完了，可以看会剧去了。