「全选→压缩」在宝塔中危险,因其调用tar命令未过滤隐藏文件、软链接、锁文件等,易致权限失效、会话异常、软链断裂或压缩不完整;应仅打包app/、config/、routes/、resources/、public/(不含软链)、.env等核心文件,排除bootstrap/cache/、storage/、vendor/等目录,并通过终端命令行加exclude参数安全压缩。

不能直接全选压缩,会出错甚至损坏网站运行环境。
为什么「全选 → 压缩」在宝塔里是危险操作
宝塔的文件管理器压缩功能本质调用的是 Linux tar 命令,但界面层没有过滤系统隐藏文件、软链接、进程锁文件等。常见问题包括:
-
.user.ini、.htaccess等权限控制文件被错误打包或解压后失效 -
/tmp、/runtime、/cache等动态生成目录包含临时文件或锁文件(如sess_*),解压后可能引发 PHP 会话异常 - 软链接(如
public/storage指向../storage/app/public)会被打包成空目录或断链 - 正在被 Nginx/Apache/PHP-FPM 占用的文件(如日志轮转中的
access.log)可能触发tar: file changed as we read it警告,导致压缩包不完整
应该只打包哪些目录和文件
真正需要备份的,是「可复现、不可再生、有业务逻辑」的部分。其他一律排除:
- ✅ 必打:
app/、config/、routes/、resources/、public/(不含public/storage软链本身)、.env(注意别提交到 Git!) - ❌ 必排除:
bootstrap/cache/、storage/(含storage/logs/)、vendor/(用composer install重装)、node_modules/、.git/、runtime/、logs/、tmp/ - ⚠️ 特殊处理:
public/storage是软链接,应进入storage/app/public/打包实际内容,再手动重建软链
在宝塔中安全打包的实操步骤
不要依赖「全选」,改用「自定义路径 + 命令行压缩」更可控:
- 进宝塔 → 文件 → 进入网站根目录(如
/www/wwwroot/example.com) - 点击右上角「终端」,执行:
tar -zcf site-source-$(date +%Y%m%d).tar.gz \ --exclude='bootstrap/cache' \ --exclude='storage' \ --exclude='vendor' \ --exclude='node_modules' \ --exclude='.git' \ --exclude='runtime' \ --exclude='logs' \ --exclude='tmp' \ --exclude='public/storage' \ .
- 压缩完成后,回文件管理器就能看到生成的
site-source-20241105.tar.gz,下载即可 - 如需包含
storage/app/public内容,单独再打一个包:tar -zcf storage-public.tar.gz -C storage/app public
压缩包解压后不能直接上线
源码包只是「开发态快照」,不是「可运行产物」。上线前必须:
- 上传后
chown -R www:www修正权限(尤其storage/和bootstrap/cache/) - 执行
composer install --no-dev(如果没打vendor) - 运行
php artisan config:clear && php artisan cache:clear(Laravel)或对应框架的缓存重置命令 -
.env文件需重新配置数据库、缓存、密钥等,不能直接沿用旧包里的
漏掉权限或缓存清理,大概率导致白屏或 500 错误,而错误日志里往往只显示「failed to open stream: Permission denied」这类模糊提示。

















