做了几年运维,我最怕的不是难的问题,是那种「本地跑得好好的,一上线就出问题」的场面。这种大多是环境差异造成的,而且往往发生在半夜。
所以我现在有一套固定清单,每次部署 PHP 源码都过一遍,前后不到二十分钟,能挡掉八成事故。
一、环境层
- PHP 版本是否和源码要求一致(看说明文档或
composer.json) - 必需扩展是否齐全:
fileinfo、gd、curl、zip、openssl、mbstring - MySQL 版本是否匹配,
sql_mode有没有开严格模式(老源码经常被它坑) - PHP 的
upload_max_filesize、post_max_size、max_execution_time是否够用
# 一条命令快速看环境
php -v && php -m | grep -E "fileinfo|gd|curl|zip|openssl|mbstring"
二、Web 层
- 伪静态规则已配置
- 运行目录指向正确的 public 子目录
- HTTPS 证书已部署,且 HTTP 能 301 跳 HTTPS
- 默认入口文件(比如
install.php)已删除,后台路径已改
最后一条特别重要。忘了删安装目录,等于把站点白送人,这种事每年都能看到几起。
三、数据层
- 数据库账号使用最小权限,不要拿 root 跑业务
- 表前缀和配置文件一致
- 确认导入完整——比对关键表的行数,别只看导入成功提示
- 配置好自动备份(我一般设每天凌晨一次,保留 7 份)
四、可观测层
- PHP 错误日志目录固定下来,且确认有写权限
- 生产环境关掉
display_errors,但一定要开着log_errors - 站点加了监控,掉线能收到通知
五、回滚预案
这条我最看重。上线前先确认两件事:老版本的文件和数据库各有一份完整快照,并且我知道怎么在五分钟内切回去。
如果这两条答不上来,我建议推迟上线。真的。
# 上线前打快照
tar -czf /www/backup/site_$(date +%F).tar.gz /www/wwwroot/你的站点
mysqldump -u用户名 -p 数据库名 > /www/backup/db_$(date +%F).sql
最后一点
清单的意义不是让你变得很慢,而是把「靠记忆」换成「照单子打勾」。人总有状态不好的时候,凌晨三点尤其。有单子在手,失误率会低一个数量级。