最近在做一个市级的政务站群项目,甲方要求后台不能暴露在互联网中,前端网页需要生成html并推送到另外一台对外的服务器。
本次项目大致方案如下:
管理系统:PageAdmin CMS平台版
分布式储存:阿里云OSS。
服务器两台:麒麟v10两台
数据库:人大金仓
中间件:中创
分部署缓存中间件:甲方没有要求,本次项目直接采用redis。
安装好以上所有产品和中间件后,本次项目重点步骤和注意事项:
一、进入后台开启静态功能和配置分布式储存参数
进入PageAdmin系统站点的后台管理>系统配置>应用设置,如下图
重点设置:
启动站点功能:设置为开启,PageAdmin平台版本默认是支持业务系统和网站统一构建,不开启前台网页会无法打开
站点静态功能:设置为默认开启
静态生成模式:由于前端模版是响应式,这里选择:不区分客户端,如果前端模版分pc和手机端模版,选择第二种模式:PC和手机端分别生成
附件集中储存:选择阿里云oss,配置好绑定域名,BucketName,AccessKeyId,AccessKeySecret,EndPoint(OSS端点)这些参数,这些参数开通阿里云oss后就可以获取到
二、生成Html页面
进入Html页面刷新菜单,如下图:
这里注意一下:第一次需要全量生成所有页面,以后编辑修改栏目、发布编辑新内容都会自动生成新的html页面。
首页,所有栏目页,所有内容页,所有专题页面全部生成一次,生成结果会通过站内信息异步通知,这里不需要等待,可以去做其他事情即可,异步通知中会有详细的日志,包括生成数量,错误次数,错误地址,错误原因等详细描述,这里比较简答不赘述。
PageAdmin的静态文件默认生成到网站根目录下的html>站点编号>pc目录中,由于是响应式站点,所以静态html都在pc目录中。
重点:PageAdmin修改编辑栏目默认只会更新前10页(可在配置文件中配置数量),如果你的栏目列表超过10页面,需要手工点击更新栏目按钮才能所有所有的分页,这里有个小技巧,可以通过系统自带的页面静态方案来自动生成,静态方案页面可以配置需要定时更新的栏目,定时执行时间,支持选择具体时间和cron表达式两种模式,比如可以每天晚上11点更新所有栏目页面,这里就减少很多运维工作。
三、Html文件跨服务器推送
html文件跨服务器推送有很多方案,由于两台服务器在同一个局域网段,目前局域网主流两种同步方案有:inotify‑wait + rsync和lsyncd,小编这里使用lsyncd方案,这步主要是配置服务器,下面做一些简单的配置介绍,具体不懂的大家可以自行Ai搜索。
lsyncd方案说明:底层封装 inotify,收集文件事件,合并批量触发 rsync,避免文件频繁改动时疯狂调用 rsync 进程,性能远高于裸写 inotifywait 脚本。
不废话,直接上安装说明
步骤1、源机器安装 lsyncd rsync
yum install -y lsyncd rsync
步骤2、配置 SSH 免密(必须!否则同步会卡住要密码)
# 生成密钥,一路回车,不要设置密码
ssh-keygen -t ed25519
# 推送公钥到目标机器IP,替换为你的目标IP,这里回要求输入目标机器的密码。
ssh-copy-id root@目标ip
推送成功后,一定要测试一下是否真的免密了。
ssh root@目标ip
能直接登录成功,说明免密成功,一定要测试,不能成功按下免顺序排查:
2.1. ✔源机器:ssh-keygen -t ed25519 生成密钥,密钥不要设置 passphrase 密码
2.2. ✔源机器:ssh-copy-id root@目标ip推送公钥
2.3. ✔目标机器:PubkeyAuthentication yes 开启公钥认证,sshd -t校验,reload sshd
2.4 ✔目标机器权限:
chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
2.5. ✔目标机器
SELinux:`restorecon -Rv /root/.ssh`
2.6. ✔源机器手动 ssh 测试免密登录,必须成功,再启动 lsyncd
步骤3、两边创建目录
#源机器
mkdir -p /data/www_src
#目标机器
mkdir -p /data/www_dst
步骤4:编写 lsyncd 配置文件
主配置文件路径:/etc/lsyncd.conf
先备份原始文件
cp /etc/lsyncd.conf /etc/lsyncd.conf.bak
清空,写入下面完整配置:
cat > /etc/lsyncd.conf <<'EOF'
settings {
logfile = "/var/log/lsyncd.log",
statusFile = "/var/log/lsyncd.status",
inotifyMode = "CloseWrite",
delay = 1,
maxProcesses = 4,
}
sync {
default.rsyncssh,
source = "/data/www_src/",
host = "目标ip",
targetdir = "/data/www_dst/",
rsync = {
archive = true,
delete = true,
compress = false,
}
}
EOF
参数小白解释
source = "/data/www_src/" 末尾斜杠不能丢:同步文件夹里面所有文件,不是同步文件夹本身
inotifyMode = "CloseWrite":文件写完关闭后才同步,防止同步半截写入损坏文件
delay = 1:事件合并延迟 1 秒;大量文件修改不会疯狂启动 rsync 进程
delete = true:源删除文件,目标机器也同步删除。测试阶段建议改为 false,确认业务没问题再打开 true!
host:你的目标服务器 IP
targetdir:目标机器目录
多目录同步:写多个 sync{...} 块即可。
步骤5:调内核 inotify 参数(必做!文件多会报错)
inotify 默认监听文件数量有限,静态站点、大量小文件场景必须调大。
cat >> /etc/sysctl.conf <<'EOF'
fs.inotify.max_user_watches = 1048576
fs.inotify.max_user_instances = 2048
EOF
sysctl -p
查看是否生效
cat /proc/sys/fs/inotify/max_user_watches
步骤六:启动服务
# 设置开机自启并启动
systemctl enable --now lsyncd
# 查看状态
systemctl status lsyncd
绿色 active (running) 代表正常运行。
如果报错,看日志排查。
步骤七:测试同步
在源机器创建测试文件
touch /data/www_src/test01.txt
echo "hello lsyncd" > /data/www_src/test02.txt
去目标机器查看是否自动生成文件
ls /data/www_dst/
删除源文件测试 delete 效果(delete=true 才生效)
rm -f /data/www_src/test01.txt
步骤八:日志查看(排错最重要)
实时看运行日志
tail -f /var/log/lsyncd.log
看状态文件,当前监听目录
cat /var/log/lsyncd.status
常见报错查看:
journalctl -u lsyncd -f
⚠️小白高频踩坑清单
❌路径末尾斜杠丢失/data/www_src → 会把 www_src 整个文件夹同步到目标目录下;/data/www_src/ → 同步文件夹内部所有文件,配置必须带末尾 /。
❌ssh 免密失败 lsyncd 不会弹出密码输入框,直接同步失败;先手动 ssh 测试确认免密可用。
❌delete=true 风险很高 会删除目标机器多余文件,刚部署务必设置 delete=false 测试,业务验证没问题再开启。
❌大文件写入 大文件拷贝时,lsyncd 检测到 close_write 才同步;如果经常同步半截文件,把 delay 调大到 2~3。
❌权限问题 源目录、目标目录读写权限;ssh 用户要有目标目录写入权限。
❌防火墙 源机器能通目标机器 22 端口;防火墙放行 ssh。
❌双向同步 lsyncd 只适合单向:源→目标;不要两边互相 lsyncd,会造成循环同步灾难。双向同步用分布式存储。
常用操作命令
# 重启lsyncd(修改配置后必须重启)
systemctl restart lsyncd
# 停止服务
systemctl stop lsyncd
# 关闭开机自启
systemctl disable lsyncd
扩展:过滤不需要同步文件示例
如果想忽略日志、临时文件,rsync 增加 exclude 参数:
rsync = {
archive = true,
delete = true,
compress = false,
_extra = {
"--exclude","*.log","--exclude","tmp/"}
到这里,PageAdmin CMS后台生成的html文件就可以同步到目标服务器,根据带宽情况,会有1-3秒的延迟,这个过程可以接受,这里比较麻烦的就是文件同步这块,第一次配置的朋友容易踩坑。