首页 / 资讯中心 / 文章详情

PHP 实战:服务器磁盘突然100%怎么办?从日志清理到存储优化完整排查方案

PHP 实战:服务器磁盘突然100%怎么办?从日志清理到存储优化完整排查方案 ★ FEATURED ARTICLE
一、问题背景网站运行正常突然无法写入数据最近维护一个 PHP 订单管理系统运维发现网站还能访问但是上传文件失败订单无法生成。错误日志id8f3k2m No space left on device用户表现idk9m4x7 上传图片 失败 创建订单 失败 后台生成报表 失败服务器状态idp5x8n3 CPU 正常 内存 正常 磁盘 100%二、问题定位发现服务器磁盘空间耗尽查看磁盘df -h结果Filesystem /dev/vda1 Use% 100%说明磁盘已经满了。三、为什么磁盘满会影响PHP很多操作都需要写文件。例如PHP日志PHP错误日志 ↓ 写入磁盘Session用户登录 ↓ 保存Session文件上传文件图片上传 ↓ 保存服务器磁盘满全部失败。四、第一步快速找到占用空间最大的目录查看du -sh /*例如20G /var 5G /home 2G /tmp继续du -sh /var/*发现/var/log 50G五、问题一日志文件无限增长很多 PHP 项目开启错误日志。例如error_log/var/log/php/error.log但是没有限制。几年后error.log 80GB六、解决方案日志切割使用 logrotate。配置/etc/logrotate.d/php内容/var/log/php/*.log { daily rotate 7 compress missingok }含义每天生成新日志。保留7天。旧日志压缩。七、第二步检查PHP错误日志查看tail -100 error.log发现PHP Warning: Undefined variable大量重复。例如代码echo $username;变量不存在。每请求产生一条日志。八、修复代码减少无效日志错误echo $user[name];没有判断。优化echo $user[name] ?? ;减少大量错误日志。九、第三步清理临时文件查看du -sh /tmp/*发现/tmp/cache 30GB原因程序生成缓存没有清理。设置自动清理find /tmp/cache \ -type f \ -mtime 7 \ -delete删除7天前文件。十、第四步上传文件无限增长商城系统用户上传图片。目录/uploads几年后500GB优化图片不要全部放服务器。架构用户上传 ↓ 对象存储 ↓ 返回URL例如OSSCOSS3十一、第五步数据库备份文件占满磁盘常见每天执行mysqldump database backup.sql结果backup1.sql backup2.sql backup3.sql几年几十GB。自动清理find /backup \ -name *.sql \ -mtime 30 \ -delete保留30天。十二、第六步Docker日志占满磁盘如果使用Docker查看docker system df可能发现container logs 100GB限制日志大小docker-composelogging: driver: json-file options: max-size: 100m max-file: 3十三、第七步检查删除文件仍被占用有时候删除文件空间没有释放。查看lsof | grep deleted例如php-fpm error.log (deleted)原因进程仍占用。解决重启服务。systemctl restart php-fpm十四、第八步PHP Session文件过多默认session.save_handlerfiles保存/var/lib/php/session大量用户产生大量小文件。优化方案使用Redis保存Session。配置session.save_handlerredis session.save_pathtcp://127.0.0.1:6379优势减少磁盘压力。十五、第九步缓存文件管理错误/cache 永久保存没有过期机制。设计缓存文件增加时间。例如if( filemtime($file)time()-3600 ){ unlink($file); }超过1小时清理。十六、生产环境磁盘监控不要等100%。设置报警。例如磁盘使用率 80% 提醒 90% 报警监控内容磁盘空间 inode数量 日志大小 临时文件十七、inode耗尽问题有时候空间还有。但是创建文件失败。查看df -i原因大量小文件。例如session cache tmp解决删除小文件。优化存储方式。十八、生产环境常见错误1. 日志不切割结果日志几十GB。2. 上传文件永久保存结果磁盘越来越满。3. 备份无限增长结果备份占满服务器。4. 没有磁盘报警结果发现时已经故障。十九、上线前检查清单日志✅ 开启日志切割✅ 设置保存周期✅ 清理历史日志文件✅ 上传使用对象存储✅ 定期清理缓存✅ 删除无用文件系统✅ 磁盘监控报警✅ inode监控✅ 备份周期管理二十、优化效果优化前日志增长 ↓ 磁盘100% ↓ PHP无法写文件 ↓ 业务失败优化后日志切割 ↓ 自动清理 ↓ 对象存储分离 ↓ 磁盘稳定总结服务器磁盘问题表面看是磁盘满了实际上可能来自日志失控 缓存堆积 上传文件增长 备份无限保存 小文件过多生产环境 PHP 系统必须建立自动清理 容量监控 日志管理 存储优化才能避免因为磁盘问题导致整个网站停止运行。
阅读完成 · 觉得有帮助?
咨询建站