昨天博客写笔记时突然崩掉,没法愉快的玩耍了。。
image.png

排错

按照步骤来,连上服务器看看服务状态

  1. 检查服务

    docker ps

[root@izj6c11y5fbhepw9woftklz java]# docker ps  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES  
f2380e20b853        b3log/solo          "java -cp lib/*:. or…"   4 months ago        Up About an hour                             solo  
9da3e37f7416        nginx               "nginx -g 'daemon of…"   6 months ago        Up About an hour    0.0.0.0:80->80/tcp       nginx

发现服务还在,于是认为是自己刚刚可能搞了啥子骚操作,把博客整出 bug 了。所以为了偷懒,直接更新下容器 docker pull b3log/solo ,然后重新 run 个容器出来。然而问题依旧!

  1. 查看日志

突然想起来我数据库好像也是用 docker 部署的,刚刚 docker ps 似乎没有看到 MySQL 的影子! docker ps -a 确认一下,果然发现 MySQL 死掉了。
由于我有三四台服务器,我有点忘记了这个博客是不是用的这个库,所以执行 docker logs --tail 50 solo 发现确实报错:

[INFO ]-[2020-05-18 22:40:22]-[org.b3log.solo.Server:216]: Solo is booting [ver=3.8.0, os=Linux, isDocker=true, inJar=false, luteAvailable=false, pid=1, runtimeDatabase=MYSQL, runtimeMode=PRODUCTION, jdbc.username=root, jdbc.URL=jdbc:mysql://127.0.0.1:3306/solo?useUnicode=yes&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC]
[ERROR]-[2020-05-18 22:40:24]-[com.zaxxer.hikari.pool.HikariPool:587]: HikariPool-1 - Exception during pool initialization.
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

于是重启 MySQL: docker start mysql
docker 报错: No space left on device

  1. 清理空间

额 ,好吧!空间不够! df -h 查看发现根目录已经 100% 了

[root@izj6c11y5fbhepw9woftklz java]# df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        909M     0  909M   0% /dev
tmpfs           919M   16K  919M   1% /dev/shm
tmpfs           919M   83M  837M   9% /run
tmpfs           919M     0  919M   0% /sys/fs/cgroup
/dev/vda1        25G   25G  	0  	100% /

使用下面 两个命令,从根目录开始检查,删除不必要的文件:

cd /
du --max-depth=1 -h 

最后发现 docker 占用空间异常的大,原来是我在里面还部署了 MQ 、ZK、Redis 等一堆东西用来学习,忍痛割爱只有把这些清理了,移到另一个服务器上学习了。

docker system df
docker stop +要删除的容器
docker rm $(docker ps -a -q)
docker system prune

docker rm $(docker ps -a -q) 是安全的,因为没有加 -f 的时候,正在运行的容器无法被删除。
docker system prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及 dangling 镜像(即无 tag 的镜像)。docker system prune -a命令清理得更加彻底,可以将没有容器使用 Docker 镜像都删掉。

  1. 重启服务

在清理足够空间后,开始重启服务。

init 6 #重启
docker start mysql
docker start solo
docker start nginx
  1. 端口占用

上面启动 nginx 时报错,提示 80 端口被占用。
netstat -tunlp | grep 80
发现系统中已有一个 nginx 启动了(非 docker 容器),原来是几个月前在服务器上装过宝塔,我已经忘了这事了。
6. 修复宝塔

忘记宝塔入口可以在直接输入: bt default .
讲道理一般这样就能找到入口了,但是我输入之后提示: /usr/bin/bt: line 129: syntax error: unexpected end of file
搜索一圈回来总结:

  • 网络波动导致无法将宝塔文件写入到/etc/init.d/bt 这个系统文件
  • 源文件缺失,可能是由于根目录炸了导致的。
    我按照如下步骤修复成功
mv /etc/init.d/bt   /tmp/bt_back
cp /www/server/panel/init.sh  /etc/init.d/bt && chmod +x  /etc/init.d/bt
/etc/init.d/bt  restart

另,官方提供了宝塔修复命令,我试了没有成功。

#进入ssh输入以下命令修复面板(3.x/4.x/5.x)
wget -O update.sh http://download.bt.cn/install/update.sh && sh update.sh
#6.x/7.x
curl http://download.bt.cn/install/update6.sh|bash

7.再次重启服务

去宝塔把 nginx 卸载掉,我再来一次 docker start nginx ,完美启动成功了。
在浏览器输入blog.caiqz.cn,
QQ图片20200520095324.jpg
然而!
404 都没有了!
网站直接没有任何响应了!

  1. 防火墙
    首先检查本地能不能访问
    curl 127.0.0.1:8081
    发现能够访问,另外检查下 nginx 代理的其他几个域名,也能访问。
    最后。。。突然想起电脑重启过,防火墙自动打开了。
systemctl stop firewalld.service

在浏览器试下,终于!!好了!

总结

本次事故是因为 docker 占用空间过大,导致了 docker中的MySQL挂掉,接着博客就崩了;与此同时,宝塔也因为系统空间不足无法正常工作了,最终宝塔服务被损坏了;
另外,还由于我个人把服务部署得有点乱,排错遇到坑不断,就当复习了一波吧。