宝塔面板批量清理网站垃圾缓存与过期日志脚本
宝塔面板批量清理网站垃圾缓存与过期日志脚本,零基础也能照做
如果你在宝塔面板上跑着多个网站,日志文件越积越多,Redis缓存和Nginx静态缓存占空间,手动一个一个清太麻烦。
本文写了一个Shell脚本,能一次性清理所有站点的过期日志、Nginx缓存、PHP Session和Redis缓存(可选),释放磁盘空间,提升服务器性能。
为什么需要这个批量清理脚本
很多新手用宝塔面板,磁盘空间慢慢被以下几类文件吃掉:
- 网站访问日志和错误日志,默认不自动清理,时间长了可能几个G。
- Nginx FastCGI缓存和静态缓存,如果开启了缓存功能,缓存目录会膨胀。
- PHP Session文件,多数情况无意义长期保留。
- Redis缓存,如果开启了Redis加速,过期key会残留。
- Composer缓存或pip缓存(如果服务器有开发环境)。
一个脚本全搞定,还能设置每月自动执行,省心省力。
准备工作
- 已安装宝塔面板(任意版本均可,测试环境为CentOS 7+,Ubuntu 20+)。
- SSH登录权限:面板左侧菜单「终端」或自己用Xshell/SecureCRT连接。
- 确认网站根目录路径:宝塔默认网站目录为
/www/wwwroot/。 - 确认缓存路径:Nginx缓存默认在
/www/server/nginx/cache/,nginx.conf里可查。
建议先执行 df -h 查看磁盘使用率,方便清理后对比。
批量清理脚本代码及说明
新建脚本文件 clean_bt.sh:
#!/bin/bash
# 宝塔面板批量清理网站垃圾缓存与过期日志脚本
# 作者:服务器运维助手
# 版本:1.0
# 适用环境:宝塔面板Linux服务器
# ========== 配置区域(可根据需要修改) ==========
LOG_RETENTION_DAYS=30 # 日志保留天数(超过此天数的日志删除)
NGINX_CACHE_DIR="/www/server/nginx/cache" # Nginx缓存目录位置,请确认
CLEAN_REDIS=0 # 是否清理Redis缓存(1=清理,0=不清)
REDIS_PASSWORD="" # Redis密码(如果有请填写)
# ========== 配置结束 ==========
echo "========================================"
echo "宝塔面板批量清理开始 - $(date)"
echo "========================================"
# 1. 清理各网站过期日志(access.log & error.log)
for site_dir in /www/wwwroot/*/; do
log_dir="${site_dir}logs"
if [ -d "$log_dir" ]; then
echo "[日志] 清理 $log_dir 中超过 ${LOG_RETENTION_DAYS} 天的日志文件"
find "$log_dir" -type f \( -name "*.log" -o -name "*.log.*" \) -mtime +${LOG_RETENTION_DAYS} -exec rm -f {} \;
fi
done
# 2. 清理Nginx缓存文件
if [ -d "$NGINX_CACHE_DIR" ]; then
echo "[缓存] 清理Nginx缓存目录:$NGINX_CACHE_DIR"
find "$NGINX_CACHE_DIR" -type f -delete
fi
# 3. 清理PHP Session文件(默认1小时无修改的视为垃圾)
php_session_path="/var/lib/php/sessions"
if [ -d "$php_session_path" ]; then
echo "[Session] 清理过期PHP Session文件"
find "$php_session_path" -type f -amin +60 -delete
fi
# 4. 清理Redis缓存(如果开启)
if [ "$CLEAN_REDIS" -eq 1 ]; then
if command -v redis-cli &> /dev/null; then
echo "[Redis] 清空所有Redis缓存(谨慎!)"
if [ -n "$REDIS_PASSWORD" ]; then
redis-cli -a "$REDIS_PASSWORD" FLUSHALL
else
redis-cli FLUSHALL
fi
else
echo "[Redis] redis-cli未安装,跳过"
fi
fi
echo "========================================"
echo "清理完成 - $(date)"
echo "========================================"
功能解释:
- 遍历
/www/wwwroot/下每个网站目录,清除 logs 文件夹中超过30天的.log文件。 - 删除 Nginx 缓存目录内所有缓存文件。
- 删除 PHP Session 文件夹中60分钟无活动的 Session 文件。
- 可选清空 Redis 所有数据(谨慎,建议先确认用途)。
使用步骤与计划任务设置
1. 创建脚本文件
在 SSH 终端执行:
cd /root
vim clean_bt.sh
按 i 进入编辑模式,粘贴上面脚本,按 ESC 输入 :wq 保存退出。
2. 赋予执行权限
chmod +x clean_bt.sh
3. 手动执行测试
bash clean_bt.sh
观察输出,确认没有报错。
用 df -h 对比清理前后的磁盘空间。
4. 设置自动执行(每月1号凌晨2点)
在宝塔面板左侧「计划任务」添加:
- 任务类型:Shell脚本
- 执行周期:选择
每月→1日→02:00 - 脚本内容:
bash /root/clean_bt.sh - 任务名称:
批量清理网站垃圾缓存与过期日志 - 点击「添加任务」
也可以直接用crontab:
crontab -e
添加一行:
0 2 1 * * bash /root/clean_bt.sh >> /var/log/clean_bt.log 2>&1
保存退出。
日志会记录执行情况,方便排查。
避坑指南及效果验证
常见问题解答
Q:脚本执行后磁盘空间没有释放?
A:先检查 NGINX_CACHE_DIR 路径是否正确,宝塔面板安装的Nginx缓存默认路径为 /www/server/nginx/cache,如果自定义过需要修改脚本。另外日志文件若未超30天不会被删除,可以临时调整 LOG_RETENTION_DAYS=1 测试。
Q:清理Redis缓存会不会导致网站数据丢失?
A:如果Redis只用于缓存(如WordPress的Redis Object Cache),清理后缓存会重新生成,不影响数据。但如果Redis存储了session或队列任务,请将 CLEAN_REDIS 设置为0或安装前确认。
Q:提示权限不足(Permission denied)?
A:确认以root用户执行。宝塔默认使用 www 用户运行网站,但脚本需要root权限才能删除Nginx缓存和日志文件。用 sudo -i 切换到root再执行。
Q:如何恢复误删的日志?
A:日志删除不可恢复。建议首次执行时先注释掉 -exec rm,改为 -exec ls {} \; 预览要删除的文件列表,确认无误再正式删除。
效果验证
清理后执行 du -sh /www/server/nginx/cache 查看Nginx缓存大小,执行 du -sh /www/wwwroot/*/logs 检查日志目录变化。
如果设置了计划任务,可等待一个月后自动执行,或者手动执行后查看 df -h 确认空间恢复。
如果你的网站开启了Redis,执行前用 redis-cli dbsize 查看key数量,清理后再查询应为0。
结语
这个宝塔面板批量清理网站垃圾缓存与过期日志脚本适合日常维护,释放磁盘空间,避免日志撑爆硬盘。
初次使用时建议先手动执行并观察,再设置自动任务。
如果遇到其他问题,欢迎在评论区留言交流。