day041-web集群架构搭建
文章目录
- 0. 老男孩思想-高薪四板斧
- 1. web集群架构图
- 2. 搭建异地备份服务
- 2.1 服务端-阿里云服务器
- 2.1.1 查看rsync软件包
- 2.1.2 添加rsync配置文件
- 2.1.3 添加虚拟用户
- 2.1.4 创建校验用户密码文件
- 2.1.5 创建备份目录
- 2.1.6 启动服务
- 2.1.7 开放安全组端口
- 2.1.8 发送检查邮件
- 2.2 客户端
- 2.2.1 检查与服务端的网络连通性
- 2.2.2 创建rsync用户的密码文件
- 2.2.3 测试
- 2.2.4 编写定时备份脚本
- 2.2.5 设置定时任务
- 3. 搭建实时备份服务
- 3.1 backup服务器
- 3.1.1 编辑rsync配置文件
- 3.1.2 创建虚拟用户rsync
- 3.1.3 创建校验用户密码文件
- 3.1.4 修改备份目录所属用户/组
- 3.1.5 lsyncd测试
- 3.2 nfs服务器
- 3.2.1 添加rsync用户密码文件
- 3.2.2 rsync测试
- 3.2.3 检查lsyncd软件包
- 3.2.4 修改lsyncd配置文件
- 3.2.5 创建备份目录
- 3.2.6 设置lsyncd服务自启动
- 4. 搭建nfs服务
- 4.1 服务端
- 4.1.1 查看nfs服务的软件包
- 4.1.2 启动rpc中介服务
- 4.1.3 创建虚拟用户:www,修改共享目录所属用户/组
- 4.1.4 修改nfs配置文件,添加挂载路径
- 4.1.5 启动nfs服务
- 4.2 客户端
- 4.2.1 查看是否有nfs
- 4.2.2 挂载测试
- 5. 搭建mariadb数据库
- 5.1 安装mariadb
- 5.2 数据库配置
- 5.3 远程登录测试
- 6. 搭建nginx服务
- 6.1 配置nginx官方yum源
- 6.2 下载并启动nginx
- 6.3 修改nginx的虚拟用户并创建该虚拟用户
- 6.4 添加站点子配置文件
- 6.5 创建站点根目录并修改所属用户/组
- 6.6 在站点跟目录添加php文件
- 6.7 部署WordPress代码
- 6.7.1 下载压缩包并解压
- 6.7.2 移动代码至站点目录,重启nginx
- 6.7.3 配置本地hosts解析
- 6.7.4 本地浏览器访问
- 6.8 配置数据库信息
- 6.9 挂载nfs共享目录
- 6.10 重启nginx
- 7. 搭建php服务
- 7.1 下载php
- 7.2 修改php配置文件
- 7.3 检查语法并重启
- 8. 测试
- 9. 踩坑记录
- 1. lsyncd.service: Start request repeated too quickly.
- 2. 云服务器Ubuntu,不能使用中文
0. 老男孩思想-高薪四板斧
- 坚持第一个来,最后一个走
- 以领导的岗位职责要求自己
- 积极主动、勇于承担
- 为领导、其他同事干活
- 把公司当做自己的去工作
- 不要频繁的跳槽
- 当公司有困难时,要主动承担责任,为领导、公司解难
- 对公司要有一定的忠心
- 把前三条坚持做5-10年
薪资的高低和对公司的价值成正比
1. web集群架构图
2. 搭建异地备份服务
- 服务:rsync
- 服务端:阿里云Ubuntu
- 客户端:backup
2.1 服务端-阿里云服务器
2.1.1 查看rsync软件包
# Ubuntu默认安装了rsync
[root@aliyun-ubuntu ~]# dpkg -l |grep rsync
ii rsync 3.2.7-0ubuntu0.22.04.4 amd64 fast, versatile, remote (and local) file-copying tool
2.1.2 添加rsync配置文件
- 路径:
/etc/rsyncd.conf
[root@aliyun-ubuntu ~]# cat /etc/rsyncd.conf
#created by oldboy 15:01 2009-6-5
##rsyncd.conf start##
fake super = yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 172.16.1.0/24
#hosts deny = 0.0.0.0/32
auth users = aliyun_rsync_backup
secrets file = /etc/rsync.password
#####################################
[backup]
comment = www by old0boy 14:18 2012-1-13
path = /nfs/backup/blog
2.1.3 添加虚拟用户
[root@aliyun-ubuntu ~]# id rsync
id: ‘rsync’: no such user
[root@aliyun-ubuntu ~]# useradd -s /sbin/nologin -M rsync
[root@aliyun-ubuntu ~]# id rsync
uid=1001(rsync) gid=1001(rsync) groups=1001(rsync)
[root@aliyun-ubuntu ~]# tail -1 /etc/passwd
rsync:x:1001:1001::/home/rsync:/sbin/nologin
2.1.4 创建校验用户密码文件
[root@aliyun-ubuntu ~]# echo aliyun_rsync_backup:1 >/etc/rsync.password
[root@aliyun-ubuntu ~]# chmod 600 /etc/rsync.password
[root@aliyun-ubuntu ~]# ll /etc/rsync.password
-rw------- 1 root root 22 Jun 24 17:32 /etc/rsync.password
2.1.5 创建备份目录
[root@aliyun-ubuntu ~]# mkdir -p /nfs/backup/blog
[root@aliyun-ubuntu ~]# ll /nfs/backup/blog -d
drwxr-xr-x 2 root root 4096 Jun 24 17:34 /nfs/backup/blog/
[root@aliyun-ubuntu ~]# chown -R rsync:rsync /nfs/backup/blog
[root@aliyun-ubuntu ~]# ll /nfs/backup/blog -d
drwxr-xr-x 2 rsync rsync 4096 Jun 24 17:34 /nfs/backup/blog/
2.1.6 启动服务
[root@aliyun-ubuntu ~]# systemctl enable --now rsync.service
Synchronizing state of rsync.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable rsync
Created symlink /etc/systemd/system/multi-user.target.wants/rsync.service → /lib/systemd/system/rsync.service.
[root@aliyun-ubuntu ~]# systemctl is-active rsync.service
active
[root@aliyun-ubuntu ~]# systemctl is-enabled rsync.service
enabled
[root@aliyun-ubuntu ~]# ps -ef |grep [r]sync
root 128116 1 0 17:36 ? 00:00:00 /usr/bin/rsync --daemon --no-detach
[root@aliyun-ubuntu ~]# ss -lntup |grep rsync
tcp LISTEN 0 5 0.0.0.0:873 0.0.0.0:* users:(("rsync",pid=128116,fd=5))
tcp LISTEN 0 5 [::]:873 [::]:* users:(("rsync",pid=128116,fd=6))
2.1.7 开放安全组端口
2.1.8 发送检查邮件
- 配置邮件服务器
- 下载邮件服务:
apt install -y s-nail
- 邮件服务的配置文件:
/etc/s-nail.rc
- 下载邮件服务:
set from=skx2554798585@163.com
set smtp=smtps://smtp.163.com:465
set smtp-auth-user=skx2554798585@163.com
set smtp-auth-password=CPVZ6355KsCtEUik
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb/
- 编写发送邮件脚本
[root@aliyun-ubuntu /server/scripts]# cat check_rsync_remote_backup.sh
#!/bin/bash
##############################################################
# File Name: check_rsync_remote_backup.sh
# Version: V1.0
# Author: SunKexu
# Organization: www.oldboyedu.com
# Description:check remote backup
##############################################################
export LANG=en_US.UTF-8# vars
# backup file
file=`mktemp`
# year
year=`date +%Y`
# month
month=`date +%m`
# date
date=`date +%F_%w`
# backup dir
backup="/nfs/backup/blog/"
# title
title="aliyun-backup_check-${date}"
# mail
mail="skx2554798585@qq.com"
# command
echo "Number of documents this month:" >${file}
ls -l "${backup}${year}/${month}" |awk 'NR>1' |wc -l >>${file}
echo "backup dir size:" >>${file}
du -sh ${backup} |cut -f1 >>${file}
# send mail
cat ${file} |s-nail -s "${title}" ${mail}
- 设置定时任务
[root@aliyun-ubuntu /server/scripts]# crontab -e
crontab: installing new crontab
[root@aliyun-ubuntu /server/scripts]# crontab -l
# rsync remote backup check
0 8 * * * bash /server/scripts/rsync/check_rsync_remote_backup.sh >/dev/null 2>&1
2.2 客户端
- 查看本机公网ip
[root@backup ~]# curl ifconfig.io
123.117.19.236
2.2.1 检查与服务端的网络连通性
# 阿里云的公网ip
[root@backup ~]# grep aliyun /etc/hosts
8.140.211.162 aliyun
[root@backup ~]# ping aliyun -c1
PING aliyun (8.140.211.162) 56(84) bytes of data.
64 bytes from aliyun (8.140.211.162): icmp_seq=1 ttl=128 time=7.41 ms--- aliyun ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 7.409/7.409/7.409/0.000 ms
2.2.2 创建rsync用户的密码文件
[root@backup ~]# echo 1 >/etc/rsync-client.password
[root@backup ~]# ll /etc/rsync-client.password
-rw-r--r-- 1 root root 2 6月 24 17:45 /etc/rsync-client.password
[root@backup ~]# chmod 600 /etc/rsync-client.password
[root@backup ~]# ll /etc/rsync-client.password
-rw------- 1 root root 2 6月 24 17:45 /etc/rsync-client.password
2.2.3 测试
- 备份路径:
/nfs/backup/blog
- 创建备份目录
[root@backup ~]# mkdir -p /nfs/backup/blog/
- 测试
2.2.4 编写定时备份脚本
[root@backup /server/scripts]# cat rsync_remote_backup.sh
#!/bin/bash
##############################################################
# File Name:rsync_remote_backup.sh
# Version:V1.0
# Author:SunKexu
# Organization:www.oldboyedu.com
# Desc:rsync 异地备份
##############################################################
export LANG=en_US.UTF-8# vars
username="aliyun_rsync_backup"
server_ip="aliyun"
bak_module="backup"
bak_dir="/nfs/backup/blog/"
client_password="/etc/rsync-client.password"
# command
# rsync同步备份
send_backup_files(){rsync -avz "${bak_dir}" "${username}"@"${server_ip}"::"${bak_module}" --password-file="${client_password}"[ $? -eq 0 ] && echo "rsync success!" || {echo "rsync failed"exit 1}
}
send_backup_files
2.2.5 设置定时任务
[root@backup /nfs/backup/blog]# crontab -e
crontab: installing new crontab
[root@backup /nfs/backup/blog]# crontab -l
#1. sync time by lidao996 at 20230101
*/3 * * * * /sbin/ntpdate ntp.aliyun.com >/dev/null 2>&1
#2. 异地备份
0 1 * * * bash /server/scripts/rsync_remote_backup.sh >/dev/null 2>&1
3. 搭建实时备份服务
- 服务:rsync服务、lsyncd服务
- backup服务器:rsync服务端、lsyncd客户端
- nfs服务器:rsync客户端、lsyncd服务端
3.1 backup服务器
3.1.1 编辑rsync配置文件
[root@backup ~]# cat /etc/rsyncd.conf
#created by oldboy 15:01 2009-6-5
##rsyncd.conf start##
fake super = yes
uid = rsync
gid = rsync
use chroot = no
max connections = 2000
timeout = 600
pid file = /var/run/rsyncd.pid
lock file = /var/run/rsync.lock
log file = /var/log/rsyncd.log
ignore errors
read only = false
list = false
#hosts allow = 10.0.0.0/24
#hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
#####################################
[backup]
comment = www by old0boy 14:18 2012-1-13
path = /nfs/backup/blog
3.1.2 创建虚拟用户rsync
[root@backup ~]# id rsync
id: “rsync”:无此用户
[root@backup ~]# useradd -s /sbin/nologin -M rsync
[root@backup ~]# id rsync
用户id=1000(rsync) 组id=1000(rsync) 组=1000(rsync)
3.1.3 创建校验用户密码文件
[root@backup ~]# echo "rsync_backup:1" >/etc/rsync.password
[root@backup ~]# chmod 600 /etc/rsync.password
[root@backup ~]# ll /etc/rsync.password
-rw------- 1 root root 15 6月 24 19:49 /etc/rsync.password
3.1.4 修改备份目录所属用户/组
[root@backup ~]# chown -R rsync:rsync /nfs/backup/blog/
[root@backup ~]# ll -d /nfs/backup/blog/
drwxr-xr-x 2 rsync rsync 4096 6月 24 19:05 /nfs/backup/blog/
接下来backup作为lsyncd客户端进行配置
3.1.5 lsyncd测试
3.2 nfs服务器
3.2.1 添加rsync用户密码文件
[root@nfs01 ~]# echo 1 >/etc/rsync-client.password
[root@nfs01 ~]# chmod 600 /etc/rsync-client.password
[root@nfs01 ~]# ll /etc/rsync-client.password
-rw------- 1 root root 2 6月 24 19:53 /etc/rsync-client.password
3.2.2 rsync测试
接下来nfs作为lsyncd服务端进行配置
3.2.3 检查lsyncd软件包
[root@nfs01 ~]# rpm -qa |grep lsyncd
lsyncd-2.2.3-2.ky10.x86_64
[root@nfs01 ~]# rpm -ql lsyncd
/etc/logrotate.d/lsyncd
/etc/lsyncd.conf
/etc/sysconfig/lsyncd
……
3.2.4 修改lsyncd配置文件
[root@nfs01 ~]# cat /etc/lsyncd.conf
--全局部分主要配置lsyncd服务,日志,pid文件.
settings {--※※※※※日志文件,主要查看日志文件.logfile = "/var/log/lsyncd.log",--pid文件pidfile = "/var/run/lsyncd.pid",--服务状态文件statusFile = "/var/log/lsyncd.status",--改为非守护进程模式,默认.rsync命令,lsyncdnodaemon = true,--控制最多用于传输数据的进程数量 rsync进程数(最大)--※※※※※根据cpu核心数来 一致或2倍maxProcesses = 2
}--配置rsync命令,rsync服务端与客户端模式
--sync部分可以有多个.
sync {--指定rsync工作模式default.rsync,--※※※※※ 指定lsyncd监控目录,源目录 source = "/nfs/backup/blog",--※※※※※ 指定目标 rsync服务端 用户名@rsync ip地址::模块名字target = "rsync_backup@172.16.1.41::backup",--※※※※※ 每隔5秒同步一次.delay = 5,--rsync命令的 --delete 选项 保存客户端与服务端 内容一致.delete = true,-- 配置rsync命令位置,rsync命令选项,rsync = {-- 命令位置binary = "/usr/bin/rsync",-- rsync命令的 -a选项archive = true,-- rsync命令的 -z选项 压缩compress = true,-- ※※※※※配置rsync--password-file密码文件password_file = "/etc/rsync-client.password"}
}
3.2.5 创建备份目录
[root@nfs01 ~]# mkdir -p /nfs/backup/blog
[root@nfs01 ~]# ll -d /nfs/backup/blog
drwxr-xr-x 2 root root 6 6月 24 20:19 /nfs/backup/blog
3.2.6 设置lsyncd服务自启动
[root@nfs01 ~]# systemctl enable --now lsyncd.service
Created symlink /etc/systemd/system/multi-user.target.wants/lsyncd.service → /usr/lib/systemd/system/lsyncd.service.
[root@nfs01 ~]# systemctl is-active lsyncd.service
active
[root@nfs01 ~]# systemctl is-enabled lsyncd.service
enabled
4. 搭建nfs服务
- 服务:nfs
- 服务端:nfs服务器
- 客户端:web服务器
4.1 服务端
4.1.1 查看nfs服务的软件包
[root@nfs01 ~]# rpm -qa |grep -E 'nfs-utils|rpcbind'
nfs-utils-2.5.1-5.p04.ky10.x86_64
rpcbind-1.2.5-2.p01.ky10.x86_64
rpcbind-help-1.2.5-2.p01.ky10.noarch
nfs-utils-help-2.5.1-5.p04.ky10.x86_64
4.1.2 启动rpc中介服务
[root@nfs01 ~]# systemctl enable --now rpcbind.service
[root@nfs01 ~]# systemctl is-active rpcbind.service
active
[root@nfs01 ~]# systemctl is-enabled rpcbind.service
enabled
[root@nfs01 ~]# rpcinfo -pprogram vers proto port service100000 4 tcp 111 portmapper100000 3 tcp 111 portmapper100000 2 tcp 111 portmapper
……
4.1.3 创建虚拟用户:www,修改共享目录所属用户/组
[root@nfs01 ~]# id www
id: “www”:无此用户
[root@nfs01 ~]# useradd -s /sbin/nologin -M -u 1999 www
[root@nfs01 ~]# id www
用户id=1999(www) 组id=1999(www) 组=1999(www)
[root@nfs01 ~]# tail -1 /etc/passwd
www:x:1999:1999::/home/www:/sbin/nologin
[root@nfs01 ~]# chown -R www:www /nfs/backup/blog/
[root@nfs01 ~]# ll -d /nfs/backup/blog/
drwxr-xr-x 3 www www 87 6月 24 20:25 /nfs/backup/blog/
4.1.4 修改nfs配置文件,添加挂载路径
[root@nfs01 ~]# cat /etc/exports |grep '/nfs/backup/blog'
/nfs/backup/blog 172.16.1.0/24(rw,all_squash,anonuid=1999,anongid=1999)
4.1.5 启动nfs服务
[root@nfs01 ~]# systemctl enable --now nfs
[root@nfs01 ~]# systemctl is-active nfs
active
[root@nfs01 ~]# systemctl is-enabled nfs
enabled
[root@nfs01 ~]# rpcinfo -p |grep nfs100003 3 tcp 2049 nfs100003 4 tcp 2049 nfs100227 3 tcp 2049 nfs_acl
[root@nfs01 ~]# showmount -e |grep '/nfs/backup/blog'
/nfs/backup/blog 172.16.1.0/24
4.2 客户端
4.2.1 查看是否有nfs
[root@web01 ~]# rpcinfo -p nfs01 |grep nfs100003 3 tcp 2049 nfs100003 4 tcp 2049 nfs100227 3 tcp 2049 nfs_acl
[root@web01 ~]# showmount -e nfs01 |grep '/nfs/backup'
/nfs/backup/blog 172.16.1.0/24
4.2.2 挂载测试
[root@web01 ~]# mount -t nfs nfs01:/nfs/backup/blog /mnt/
[root@web01 ~]# df -hT /mnt/
文件系统 类型 容量 已用 可用 已用% 挂载点
nfs01:/nfs/backup/blog nfs4 77G 4.1G 73G 6% /mnt
[root@web01 ~]# ll -d /mnt/
drwxr-xr-x 3 www www 87 6月 24 20:25 /mnt/
[root@web01 ~]# ll /mnt/
总用量 0
-rw-r--r-- 1 www www 0 6月 24 20:23 孙克旭.com
-rw-r--r-- 1 www www 0 6月 24 20:24 oldboy-lidao-孙克旭.com
drwxr-xr-x 2 www www 6 6月 24 20:25 skx
-rw-r--r-- 1 www www 0 6月 24 20:24 skx.com
5. 搭建mariadb数据库
- 服务器:db01
5.1 安装mariadb
[root@web01 ~]# yum install -y mariadb-server
上次元数据过期检查:1:15:23 前,执行于 2025年06月23日 星期一 18时21分42秒。
软件包 mariadb-server-3:10.3.39-1.p01.ky10.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
# 设置开机自启动
[root@web01 ~]# systemctl enable --now mariadb-server
[root@web01 ~]# systemctl is-active mariadb.service
active
[root@web01 ~]# systemctl is-enabled mariadb.service
enabled
# 检查
[root@db01 ~]# ps -ef |grep [m]ysql
mysql 1015 1 0 09:22 ? 00:00:17 /usr/libexec/mysqld
[root@db01 ~]# ss -lntup |grep mysql
tcp LISTEN 0 80 *:3306 *:* users:(("mysqld",pid=1015,fd=33))
5.2 数据库配置
- 安装配置:
mysql_secure_installation
- 创建blog数据库:
create database blog;
- 添加blog用户,并设置权限,可以远程登录:
grant all on blog.* to 'blog'@'172.16.1.%' identified by '1';
5.3 远程登录测试
- 数据库客户端:web01
[root@web01 ~]# mysql -ublog -p1 -h db01
……
MariaDB [(none)]> select user();
+------------+
| user() |
+------------+
| blog@web01 |
+------------+
1 row in set (0.001 sec)MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| blog |
| information_schema |
+--------------------+
2 rows in set (0.001 sec)
6. 搭建nginx服务
- 服务器:web01
6.1 配置nginx官方yum源
[root@web01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/7/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
6.2 下载并启动nginx
[root@web01 /etc/yum.repos.d]# yum install -y nginx
上次元数据过期检查:0:03:22 前,执行于 2025年06月22日 星期日 11时49分44秒。
软件包 nginx-1:1.26.1-2.el7.ngx.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
[root@web01 /etc/yum.repos.d]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
[root@web01 /etc/yum.repos.d]# systemctl status nginx
……
6.3 修改nginx的虚拟用户并创建该虚拟用户
[root@web01 /etc/nginx]# grep -nE '^user ' nginx.conf
3:user www;
[root@web01 /app/code/blog]# useradd -s /sbin/nologin -M www
[root@web01 /app/code/blog]# id www
用户id=1999(www) 组id=1999(www) 组=1999(www)
6.4 添加站点子配置文件
[root@web01 /etc/nginx/conf.d]# cat blog.oldboy.cn.conf
server {listen 80;server_name blog.oldboy.cn;root /app/code/blog;error_log /var/log/nginx/blog.oldboy.cn-error.log notice;access_log /var/log/nginx/blog.oldboy.cn-access.log main;location / {index index.php;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}
}
6.5 创建站点根目录并修改所属用户/组
[root@web01 /app/code/blog]# mkdir -p /app/code/blog/
[root@web01 /app/code/blog]# chown -R www:www /app/code/blog/
6.6 在站点跟目录添加php文件
[root@web01 /app/code/blog]# cat chk_db.php
<?php
//数据库地址
$db_host='db01'
$db_user='blog'
$db_pass='1'
//数据库名字
$db_name='blog'$link_id=mysqli_connect($db_host,$db_user,$db_pass,$db_name);
if($link_id){echo "mysql successflu by oldboy lidao996!\n";
}else{echo "connection failed!\n"
}
?>
6.7 部署WordPress代码
6.7.1 下载压缩包并解压
[root@web01 ~]# wget https://cn.wordpress.org/latest-zh_CN.zip
[root@web01 ~]# unzip latest-zh_CN.zip
6.7.2 移动代码至站点目录,重启nginx
[root@web01 ~]# mv wordpress/* /app/code/blog/
[root@web01 ~]# chown -R www:www /app/code/blog/
[root@web01 /app/code/blog]# systemctl reload nginx.service
6.7.3 配置本地hosts解析
6.7.4 本地浏览器访问
- 在文章中上传一张图片
6.8 配置数据库信息
- 查看下数据库信息是否正确
[root@web01 /app/code/blog]# grep 'DB' wp-config.php
define( 'DB_NAME', 'blog' );
define( 'DB_USER', 'blog' );
define( 'DB_PASSWORD', '1' );
define( 'DB_HOST', 'db01' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
6.9 挂载nfs共享目录
[root@web01 /app/code/blog/wp-content/uploads]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 962M 0 962M 0% /dev
tmpfs 979M 0 979M 0% /dev/shm
tmpfs 979M 9.0M 970M 1% /run
tmpfs 979M 0 979M 0% /sys/fs/cgroup
/dev/mapper/klas-root 77G 4.6G 73G 6% /
/dev/sda1 2.0G 178M 1.9G 9% /boot
tmpfs 196M 0 196M 0% /run/user/0
nfs01:/nfs/backup/blog 77G 4.1G 73G 6% /mnt
[root@web01 /app/code/blog/wp-content/uploads]# umount /mnt
[root@web01 /app/code/blog/wp-content/uploads]# mkdir /backup/up -p
[root@web01 /app/code/blog/wp-content/uploads]# mv ./* /backup/up
[root@web01 /app/code/blog/wp-content/uploads]# mount -t nfs nfs01:/nfs
/nfs/backup/blog /nfs/blog /nfsdata /nfs/pics
[root@web01 /app/code/blog/wp-content/uploads]# mount -t nfs nfs01:/nfs/backup/blog ./
[root@web01 /app/code/blog/wp-content/uploads]# df -hT /app/code/blog/wp-content/uploads/
文件系统 类型 容量 已用 可用 已用% 挂载点
nfs01:/nfs/backup/blog nfs4 77G 4.1G 73G 6% /app/code/blog/wp-content/uploads
[root@web01 /app/code/blog/wp-content/uploads]# mv /backup/up/* ./
- 上面是临时挂载,可以永久挂载
[root@web01 ~]# tail -n1 /etc/fstab
nfs01:/nfs/backup/blog /app/code/blog/wp-content/uploads nfs defaults 0 0
6.10 重启nginx
[root@web01 ~]# systemctl reload nginx.service
7. 搭建php服务
- 服务器:web01
7.1 下载php
yum -y install php php-bcmath php-cli php-common php-devel php-embedded php-fpm php-gd php-intl php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml php-json
- 开机自启动
[root@web01 ~]# systemctl enable --now php-fpm
7.2 修改php配置文件
[root@web01 ~]# grep -En '^(user|group|listen) ' /etc/php-fpm.d/www.conf
24:user = www
26:group = www
38:listen = 127.0.0.1:9000
7.3 检查语法并重启
[root@web01 ~]# php-fpm -t
[24-Jun-2025 21:52:40] NOTICE: configuration file /etc/php-fpm.conf test is successful[root@web01 ~]# systemctl reload php-fpm.service
8. 测试
- 查看数据库文本信息:SELECT post_title, post_content FROM wp_posts WHERE post_type = ‘post’;
- 测试总结
- 太过完美🙂
9. 踩坑记录
1. lsyncd.service: Start request repeated too quickly.
- lsyncd监听的目录没创建(;・∀・)
2. 云服务器Ubuntu,不能使用中文
- 修改字符集:
localectl set-locale LANG=en_US.UTF-8
相关文章:
day041-web集群架构搭建
文章目录 0. 老男孩思想-高薪四板斧1. web集群架构图2. 搭建异地备份服务2.1 服务端-阿里云服务器2.1.1 查看rsync软件包2.1.2 添加rsync配置文件2.1.3 添加虚拟用户2.1.4 创建校验用户密码文件2.1.5 创建备份目录2.1.6 启动服务2.1.7 开放安全组端口2.1.8 发送检查邮件 2.2 客…...
国产化条码类库Spire.Barcode教程:如何使用 C# 读取 PDF 中的条码(两种方法轻松实现)
在 PDF 文档的 .NET 平台处理流程中,使用 C# 读取 PDF 条码 是一项常见需求,特别适用于处理扫描件或电子表单。无论是物流、金融、医疗还是制造行业,PDF 文档中经常包含用于追踪或识别的条码。这些条码可能是嵌入图像,也可能是矢量…...
vue 3 计算器
效果: <template><div class"calculator-container"><div class"calculator"><!-- 显示区域 --><div class"display">{{ formattedDisplay }}</div><!-- 按钮区域 --><div class"…...
CRMEB PHP多门店版v3.2.1系统全开源+Uniapp前端+搭建教程
一.介绍 CRMEB多店版是一款为品牌连锁门店打造的私域电商解决方案,以三大运营模式为核心,助力品牌连锁门店轻松构建全渠道、一体化的私域电商生态,促进“线上电商”与“线下门店”销售运营融合,加速品牌数字化转型,为…...
主机复制文字和文件到 Ubuntu 虚拟机
在 VMware Workstation Pro 16 中复制文字和文件到 Ubuntu 虚拟机,方法如下: Open-VM-Tools 禁用 Wayland 解决 。 1.安装 VMware Tools(推荐)或 open-vm-tools: sudo apt update sudo apt install open-vm-tools…...
性能测试 —— 数据库的连接池和主从同步和分表分区
一、数据库的调优(库层面) 1、数据库连接池 1、介绍:数据库连接池(Database Connection Pool)是一种用于管理数据库连接的技术,它通过预先创建并维护一组数据库连接来提高应用程序的性能和可扩展性。 2、创建、管理、关闭 数据…...
猿人学js逆向比赛第一届第十二题
一、分析请求 看到这里只有一个m的密文参数,没有cookie,请求头等其他的参数,那么这里跟一堆栈信息。 很顺利地锁定了m的加密位置。看到是字符串拼接然后使用btoa函数进行编码,那么这里尝试使用Python复现一下。顺利拿到结果。 复现…...
第十节 新特性与趋势-CSS层叠规则升级
以下是关于 CSS层叠规则升级 的全面解析,结合最新规范(如级联层layer)和传统层叠机制的演进,从核心原理、应用场景到实践策略的系统性总结: 一、传统层叠规则的三大支柱 CSS层叠规则的传统机制基于以下三个维…...
关键领域软件工厂的安全中枢如何全面升级供应链检测能力
随着软件供应链安全体系在互联网、金融等领域逐步成熟,关键领域正加速迈向以 MLOps、软件工厂为核心的新型研发生态。在这一过程中,面对代码安全、依赖合规、系统可信等多重挑战,传统人工审查模式已难以满足国家级高安全性要求。 Gitee Scan…...
西门子G120XA变频器:数据中心能效革命的核心引擎
在数字经济爆发式增长的今天,数据中心已成为支撑社会运转的"数字心脏"。然而,其庞大的能耗需求与绿色低碳目标之间的矛盾日益凸显——尤其是冷却系统作为数据中心第二大能耗单元(占比约35%),正成为能效提升的…...
从零开始学习Spring Cloud Alibaba (一)
人狠话不多,直接开始少点屁话本着共同学习进步的目的和大家交流如有不对的地方望铁子们多多谅解 准备工具 开发工具 idea Java环境 jdk17 容器: docker Maven 3.8.6 仓库镜像阿里云 <mirror><id>alimaven</id><name>aliyun maven</name><…...
【C/C++】C++ 编程规范:101条规则准则与最佳实践
C 编程规范:101条规则准则与最佳实践 引言 C 是一门强大而复杂的语言,能高效控制硬件,也能写出优雅抽象。然而,正因其复杂性,项目中若缺乏统一规范,极易陷入混乱、难维护、易出错的泥潭。 本文总结了 10…...
PyTorch topk() 用法详解:取最大值
torch.topk(input, k) 返回张量中最大的 k 个元素以及它们在原张量中的 索引。 函数原型 torch.topk(input, k, dimNone, largestTrue, sortedTrue)参数说明: 参数说明input输入张量k要取出的前 k 个值dim指定沿哪个维度取值(默认是最后一维ÿ…...
毕业论文查重原理及降重方法
【30%的重复率有那么重要吗?】 老师说论文重读率必须低于30%,否则无法毕业! 如果您在专科或者普通本科学生,我只能这样一句话告诉你:你想多了~, 真的想多了~~~,一篇论文还不至于让你不能毕…...
Golang Kratos 系列:业务分层的若干思考(二)
上一篇文章简单讨论了领域层在Kratos中的使用,主要涉及引入领域层,将数据层和业务层之间的解耦,接下来讨论一个稍微全面一点的例子,在此基础上引入外部Api(主要是易变部分)的领域层下的情况。 我们同样可以…...
技术伦理之争:OpenAI陷抄袭风波,法院强制下架宣传视频
在AI巨头OpenAI宣布以65亿美元天价收购苹果前设计总监Jony Ive的硬件公司IO仅一个月后,一场抄袭指控将这家科技明星企业推上风口浪尖。 源自谷歌X实验室的初创企业IYO将OpenAI告上法庭,指控其窃取智能耳塞核心技术,并通过巨额收购试图掩盖抄袭…...
烟花爆竹生产企业库房存储安全风险预警系统
烟花爆竹生产企业库房存储安全风险预警系统是保障库房物资安全、规范作业流程、防范安全事故的重要技术手段,涵盖多个关键预警功能。 温湿度预警 在库房内安装温湿度传感器,这些传感器如同敏锐的“环境感知员”,能够实时监测库房内环境变…...
Jenkins+Jmeter+Ant接口持续集成
2025最新Jmeter接口测试从入门到精通(全套项目实战教程) 前言: 为什么要用Jmeter做接口测试: 当选择这套方案的时候,很多人会问,为什么选择Jmeter做Case管理?为什么不自己写框架?说…...
基于STM32的寻迹小车设计
标题:基于STM32的寻迹小车设计 内容:1.摘要 本文围绕基于STM32的寻迹小车设计展开。背景是随着自动化技术的发展,寻迹小车在工业巡检、物流运输等领域有广泛应用前景。目的是设计一款能稳定、准确寻迹的小车。方法上,以STM32微控制器为核心,…...
【150】基于SSM+Vue实现的小说阅读小程序(有文档)
系统介绍 基于SSMVue实现的小说阅读小程序采用前后端分离的架构方式,系统设计了管理员、用户两种角色,系统分为管理端、小程序端,管理端实现了管理员登录、个人中心、管理员管理、帮助中心管理、基础数据管理、论坛中心管理、公告资讯管理、…...
ValKey中使用SIMD指令优化bitcount命令
一、AVX/AVX2 的历史演进 随着计算机技术的飞速发展,数据处理需求呈指数级增长,SIMD(单指令多数据)技术应运而生。它通过一条指令同时处理多个数据元素,大幅提升计算效率,从早期的 MMX 技术起步࿰…...
leetcode114-二叉树展开为链表
leetcode 114 思路 用简单例子推导规律 不要一开始就看复杂的树,先从最简单的情况入手 案例一:只有一个节点 输入:1 输出:1不需要任何操作,直接返回 案例二:有两个节点 输入: 1/2输出&a…...
第七章 习题
1.给出下面表达式的逆波兰表示(后缀式): 3请将表达式-(ab)* (cd)-(abc)分别表示成三元式,间接三元式和四元式序列 四元式(Op,arg1,arg2,result) (,a,b,T1) (,c,d,T2) (*,T1,T2,T3) (uminus,T3,-,T4) (,a,b,T5) (,T5,c,T6) (-,T4,T6,r) 三元式 (op,arg1,arg2) (0) (,…...
Spring Ai Alibaba Graph实现五大工作流模式
Spring Ai Alibaba Graph实现五大工作流模式 概述 在 building-effective-agents 一文中,Anthropic将"智能体系统"(agentic systems),从架构层面分为 “工作流”(workflows)和 “智能体”(agents): 工作流…...
基于单片机的语音控制设计(论文)
摘要 自然语音作为人机交互在目前得以广泛的应用以及极大的发展前景。该设计介绍了基于非指定人语音芯片LD3320的语音控制器结构及其实现语音控制的方法。该语音控制器利用STM32F103C8T6单片机作为主要控制器,控制芯片对输入的进行语音识别并处理,根据语…...
【网络安全】从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark 实战
从IP头部看网络通信:IPv4、IPv6与抓包工具 Wireshark实战 在网络安全分析和数据通信的世界中,一切都始于“数据包”。数据包是网络上传输的基本单位,而数据包的结构与内容,正是我们理解网络行为的核心。本文将带你深入了解 IP 协…...
计算机组成原理笔记(公众号版本)
1.MAR,存储单元和PC位数之间的关系 我们的MAR位数取决于我们的存储单元的个数; PC位数也是取决于我们的存储单元的个数; 假设我们是64个存储单元,我们的这个MAR实际上就是6位,因为这个2的6次方等于我们的64吗&#…...
CPM基本原理
CPM(连续相位调制,Continuous Phase Modulation )是一种恒包络,信号相位随时间连续变化的调制技术 。其优势显著,连续相位特性,频谱效率高,对带外辐射抑制好;相位平滑过渡࿰…...
浅谈开源在线客服系统与 APP 集成的技术方案与优劣势
在为移动端 App 接入在线客服系统的过程中,我经历了长时间的技术选型探索。最初,我也曾被一些“技术理想主义”选项所吸引,比如让用户自己研发界面我提供 API 以获得最高自由度,或集成 SDK 以追求原生体验。然而,随着项…...
AutoGPT,自主完成复杂任务
AutoGPT是一个开源的AI Agent项目,它的核心目标是让AI能够自主完成复杂任务,而不仅仅是回答单个问题。简单来说,它让AI具备了"自主思考和行动"的能力。 1. AutoGPT的核心概念 什么是AI Agent? AI Agent(智…...
基于Qt C++的影像重采样批处理工具设计与实现
摘要 本文介绍了一种基于Qt C++框架开发的高效影像重采样批处理工具。该工具支持按分辨率(DPI) 和按缩放倍率两种重采样模式,提供多种插值算法选择,具备强大的批量处理能力和直观的用户界面。工具实现了影像处理的自动化流程,显著提高了图像处理效率,特别适用于遥感影像处…...
Qt Windows平台调用ffmpeg动态库
本文基于QT6.8实测验证。 一、下载预编译库 从官方或第三方源获取FFmpeg的Windows动态库(Shared版本),解压后需包含以下目录: bin DLL文件(运行时依赖)include 头文件lib .lib或.dll.a链接…...
猿人学js逆向比赛第一届第十三题
一、分析请求 通过分析请求得知,本题目的参数为yuanrenxue_cookie,因为题目中中明说了是动态cookie,所以可以先删除这个cookie然后下脚本断点,简单分析看一下页面执行的js代码逻辑。 在经过这段代码的时候很明显的可以看到这里的有…...
React性能优化精髓之一:频繁setState导致滚动卡顿的解决方案
在开发一个 List 页面时,我们遇到了一个典型的React性能问题:页面在滚动时出现明显卡顿。这个问题的调试过程充满了误判和重新思考,最终发现了一个重要的性能优化原则。 问题现象 我们有一个监控仪表盘页面,包含多个图表组件。用…...
JavaScript 事件常用属性
一、事件对象基础 在事件处理函数中,浏览器会自动传入一个 event 对象,它包含了与事件相关的所有信息。 element.addEventListener(click, function(event) {// event 是事件对象 }); 二、常见事件属性 属性名 类型 描述 type String 事件类…...
配置自己的NTP 服务器做时间同步
✅ 推荐方案:使用 chrony 搭建 NTP 服务器(适用于 CentOS 7/8/9) chrony 是 CentOS 推荐的 NTP 实现,精度高、资源占用低、同步快,默认在 CentOS 8 中取代了 ntpd。 🔧 一、安装 chrony sudo yum install…...
基于深度学习的双色球智能预测系统:从原理到实现
需要源码的小伙伴可以在这里直接下载:基于深度学习的双色球智能预测系统:从原理到实现(完整代码训练数据)可直接运行-预测)资源-CSDN下载可直接运行,包括完整的训练测试数据,让你的双色球更准&a…...
STM32[笔记]--4.嵌入式硬件基础
4.嵌入式硬件基础 4.1认识上官二号开发板 主控芯片:STM32F103C8T6高速晶振:8M低速晶振:32.768kLED:5颗KEY:3个 主控芯片内部的资源如下项目介绍内核Cortex-M3Flsah64K*8bitSRAM20K*8bitGPIO37个GPIO,分别为PA0-PB15,PC13-PC15,PD0-PD1ADC2个12bitADC合计12了通道,外部通…...
Springboot项目中使用手机号短信验证码注册登录实现
文章目录 1. 功能概述2. 技术栈3. 实现步骤3.1 短信服务集成3.2 创建短信工具类3.3 验证码生成和存储3.4 控制器实现发送短信验证码手机号+验证码注册短信验证码登录3.5 服务层实现4. 前端实现4.1 API层4.2 手机号注册页面5. 最佳实践6. 总结本文将介绍如何在Spring Boot应用中…...
Python的GUI库选择指南(深度拓展)
前文我们分析了python的GUI库,有很多,面向应用场景也不尽相同,如何在使用过程中,选择合适的GUI库呢?可以查看:python有哪些常用的GUI(图形用户界面)库及选择指南-CSDN博客 初学者推…...
Kubernetes生命周期管理:深入理解 Pod 生命周期
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
JVM(12)——详解G1垃圾回收器
G1(Garbage-First)垃圾回收器。它是现代 Java 应用中默认的垃圾回收器(自 JDK 9 起),旨在提供一个高性能、可预测停顿时间(低延迟)的解决方案,尤其适合大内存(多GB甚至TB…...
Matplotlib vs Seaborn:选择与区别
相同点 都是Python数据可视化库:两者都用于创建统计图形和图表 基于Python生态系统:都与NumPy、Pandas等科学计算库良好集成 开源免费:两者都是开源项目,可自由使用 支持多种图表类型:都能创建折线图、柱状图、散点…...
TCP/UDP协议深度解析(一):UDP特性与TCP确认应答以及重传机制
🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 前言 在网络通信的世界里,传输层协议如同交通规则,决定了数据包如何从源头抵达目的地。其中UDP和TCP就…...
Linux线程概念及常用接口(1)
目录 1. Linux线程概念 什么是线程 线程的优点 线程的缺点 线程异常 线程用途 2. Linux进程VS线程 进程和线程 关于进程线程的问题 3. Linux线程控制 POSIX线程库 创建线程 线程ID及进程地址空间布局 线程终止 线程等待 为什么需要线程等待? 4. 分离线程 1. Linux线…...
Qt+OPC开发笔记(三):OPC客户端订阅特点消息的Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/148868209 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
《美化生活》投稿简介
《美化生活》杂志是国家新闻出版署批准的正规期刊,是面向全国发行的文学艺术刊。本刊坚持“传播新理念,交流新经验”办刊方针,坚持“指导消费、丰富生活、美化心灵、雅俗共赏”的宗旨,以其丰富的内容,融学术性与技术性…...
如何为虚拟机上的 Manjaro Linux启用 VMware 拖放功能
如果你的Manjaro 发行版本是安装在 VMware Workstation Player 上使用的 ,而且希望可以通过拖放功能将文件或文件夹从宿主机复制到客户端的Manjaro 里面,那么可以按照以下的步骤进行操作,开启拖放功能。 在 VMware 虚拟机上安装 Manjaro 后&…...
VIVADO导出仿真数据到MATLAB中进行分析
VIVADO导出仿真数据到MATLAB中进行分析 目录 前言 一、导出仿真数据需要编写的RTL代码 二、MATLAB读入txt文件中的数据 三、需要注意的点 总结 前言 在使用 Xilinx Vivado 进行 FPGA 开发时,如何将 RTL 仿真生成的数据导出,进行进一步分析与可视化&…...
Harmony状态管理@Event
ArkUI Event装饰器:实现子组件向父组件通信的规范方式 概述 Event装饰器是ArkUI框架中用于规范组件间通信的重要工具,特别是在需要子组件向父组件请求更新Param变量的场景下。它通过回调机制实现数据的双向同步,是组件化开发中不可或缺的一…...