——一个老运维的深夜值班手记
值班手机在凌晨两点五十三分准时炸响,客户哭诉网站全红,登录宝塔面板,只见满屏错误代码,那一刻,我仿佛听见硬盘里数据哀嚎,这样的剧本,每个运维都演过不止一次,今天不聊虚的,把那些年踩过的坑、翻过的车,全数摊开,这份从实战中淬炼出来的自救手册,希望能让你少掉几根头发。
凌晨三点的告警,宝塔面板从入门到崩溃自救指南
【第一幕:面板安装——上来就翻车】
报错现象: 执行安装命令后,进度条卡死在“编译Nginx”或“下载文件”阶段,终端输出一串红色curl: (7) Failed to connect to download.bt.cn port 80,或者直接提示权限不够,请使用root用户安装。
原因分析: 90%是服务器防火墙拦截了海外IP段,或者你的系统自带阿帕奇/MySQL残留冲突,另有一成是系统源(yum/apt)损坏,导致依赖拉取失败。
解决步骤: 别慌,三连招处理。
- 检查网络连通性:
curl -I http://download.bt.cn看能否返回200 OK,若不通,去云厂商安全组放行80、443、8888端口。 - 若是残留冲突,执行
apt-get purge apache2* mysql*(Debian系)或yum remove httpd mariadb*(CentOS系),然后清理旧目录rm -rf /www/server/old。 - 更换源重装:直接跑
wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh,注意加-y参数自动确认,若反复失败,别耗着,切Python离线安装版。
预防建议: 新机器先跑 yum update -y(或apt update)再装面板,生产环境禁用一键安装包,改用官方编译脚本,且务必关闭防火墙的SElinux(setenforce 0)。
【第二幕:服务启动——MySQL起死回生记】
报错现象: 面板上MySQL状态显示“已停止”,点击启动按钮转圈三秒后弹窗报错ERROR! MySQL server PID file not found,或者日志文件里躺着一行InnoDB: Cannot allocate memory for the buffer pool。
原因分析: 这一般不是SQL语法错误,而是系统内存不足导致mysqld被OOM Killer干掉,或者是上次非正常关机导致/var/lib/mysql下的ib_logfile0和ibdata1损坏。
解决步骤: 先看内存free -h,如果剩余不足1G,果断在配置/etc/my.cnf里调小innodb_buffer_pool_size(比如改成128M),同时设置innodb_force_recovery=1(临时救援模式,修完要改回0),然后执行 rm -rf /www/server/data/mysql-bin.* 删掉损坏的二进制日志,再执行 service mysqld restart,若还是起不来,用 mysqlcheck -r -uroot -p 修复数据表。
预防建议: 阿里云2G内存机器不要跑MySQL5.7+,直接上MariaDB 10.4,定期用pt-online-schema-change做表碎片整理,别等到磁盘满。
【第三幕:文件权限——都是chmod惹的祸】
报错现象: 网站能打开但图片全裂,或者后台提示/www/wwwroot/网站目录/wp-content/uploads不可写,一看权限,目录是755所有者是root,但FTP账号是www。
原因分析: 手贱用了chmod -R 777导致的混乱,或者解压zip包时默认带出了奇怪的属主,更缺德的是某宝买的主题,压缩包内含/usr/bin软链接路径。
解决步骤: 标准操作纠正权属:
chown -R www:www /www/wwwroot/你的站点目录
find /www/wwwroot/你的站点目录 -type d -exec chmod 755 {} \;
find /www/wwwroot/你的站点目录 -type f -exec chmod 644 {} \;
特别针对上传目录,单独执行 chmod -R 775 uploads/,如果出现Operation not permitted,说明开了chattr +i锁定,执行 chattr -R -i 解锁。
预防建议: 以后解压网站文件,先在面板“文件”里用root账号解压,解压完立即修权属,别为了省事,把整个站点丢给www用户拥有。
【第四幕:SSL证书——TLS握手半路夭折】
报错现象: 站点开了HTTPS,但浏览器锁头带黄三角,访问https://域名显示SSL_ERROR_RX_RECORD_TOO_LONG,或者面板申请Let's Encrypt时卡在域名验证失败。
原因分析: 常见的是Nginx配置里ssl on和listen 443 ssl重复,或是证书文件路径写错(多了一个空格),验证失败多半是80端口没开,或者域名解析指向了CDN回源IP不一致。
解决步骤: 停掉护盾软件(宝塔自带“系统防火墙”)的443防护,检查/www/server/panel/vhost/cert/域名/下是否有fullchain.pem和privkey.pem,若缺失,去面板“网站-设置-SSL”点击“文件验证”,但务必先把域名解析到本机IP(做A记录,并删除CDN解析),如果还是失败,手动编辑/www/server/panel/vhost/nginx/域名.conf,添加:
server {
listen 80;
server_name www.老域名.com 老域名.com;
location /.well-known/acme-challenge/ {
root /www/wwwroot/老域名.com;
}
}
保存后 nginx -t 测试,重载,再回面板申请。
预防建议: 证书到期前一周,在面板计划任务里添加Shell任务:python /www/server/panel/class/acme_v2.py --renew,别等过期才去点续签。
【终章:值班不是修仙】
运维的夜晚没有神奇代码,只有清醒的头脑和平静的双手,遇到问题,先看日志(/www/server/panel/logs/),再Google报错原文,如果以上方案试了三遍还不行,别死磕——登录宝塔官网工单系统,附上完整日志,回传你的php -v和nginx -v版本,截图面板错误提示,学会求助,是高级运维的必修课,愿你今夜良宵好梦,永不告警。



发表评论