昨天下午浏览博客,突然发现博客无法访问,服务器上部署的的其他网站也全挂了。顿时大感不妙,赶忙打开远程链接工具看看到底怎么回事。然后发现,SSH 也连不上了,换成平时使用最流畅的电信线路还是不行。脑子里突然冒出一个想法:难不成商家跑路这事真被我遇上了?不过好在所有网站的数据我在本地都有备份,就算跑路数据也不会丢,就是重新部署有些麻烦。当然这只是最坏的结果。

后来打开服务器厂商官网,进入管理后台,一切都很顺利,后台显示服务器状态正常,这说明最坏的结果没有发生。我重启了服务器后再次尝试连接 SSH 还是连接不上,我又想是不是 IP 被墙了,我在本地 ping 了很多次都都 ping 不通,然后又换 ping.pe 试了几次,发现海外是没问题的,大陆的大部分地区丢包率都是接近 100%,这才反应过来可能是线路炸了,开启代理后 SSH 也能连上了。大概过了几个小时后,线路也都逐渐恢复了,虚惊一场~

现在为了能够更方便地查看服务器和网站状态,我想还是部署一个探针比较好,最后选择了相对轻量化的 ServerStatus,简单记录一下(Docker)部署过程。

部署服务端

ServerStatus 分为服务端和客户端,也就是监控中心和被监控的服务器(可以部署在同一台机器上),首先部署服务端。

下载配置文件

1
sudo mkdir -p /srv/docker_data/server_status/server_status_monthtraffic && sudo wget --no-check-certificate -qO /srv/docker_data/server_status/server_status_config.json https://raw.githubusercontent.com/cppla/ServerStatus/master/server/config.json

自定义 json 文件

根据自己的需要进行修改,我删除了官方提供的 json 文件内自己不需要的内容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 编辑完成后建议删除注释,包括这一行,以免产生错误
{
    "servers": [
        {
            "disabled": false, // 是否隐藏服务器
            "username": "s01", // 客户端连接时所需的用户名
            "name": "node1", // 页面显示的节点名称
            "type": "kvm", // 服务器虚拟化类型
            "host": "host1",
            "location": "🇺🇸", // 服务器位置
            "password": "USER_DEFAULT_PASSWORD", // 客户端连接时所需的密码
            "monthstart": 1 //流量刷新日期
        },
        {
            "disabled": true,
            "username": "s02",
            "name": "node2",
            "type": "vmware",
            "host": "host2",
            "location": "🇯🇵",
            "password": "USER_DEFAULT_PASSWORD",
            "monthstart": 1
            }
    ],

    "monitors": [
        {
            "name": "Google", // 要监控的站点名称
            "host": "https://www.google.com/", // 站点地址
            "interval": 600, // 请求间隔
            "type": "https" // 协议类型
        },
        {
            "name": "example",
            "host": "1.1.1.1",
            "interval": 600,
            "type": "tcp"
        }
    ]
}

部署 Docker 容器

1
2
3
cd /srv/docker_data/serverstatus/

touch docker-compose.yaml

在 docker-compose.yaml 文件内输入以下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
version: '3.9'
services:
    serverstatus:
        image: 'cppla/serverstatus:latest'
        ports:
            - '35601:35601'
            - '7380:80'
        volumes:
            - '/srv/docker_data/server_status/server_status_monthtraffic:/usr/share/nginx/html/json'
            - '/srv/docker_data/server_status/server_status_config.json:/ServerStatus/server/config.json'
        container_name: serverstatus
        restart: always

部署容器

1
sudo docker compose up -d

至此服务端就部署完成了,浏览器输入服务器 IP:7380 就可以查看监控页面了,接下来部署客户端。

部署客户端

下载客户端脚本

1
sudo wget --no-check-certificate -qO client-linux.py 'https://raw.githubusercontent.com/cppla/ServerStatus/master/clients/client-linux.py'

修改脚本内容

1
2
3
4
5
# SERVER 后的内容改为服务端的 IP
# USER 后的内容改为服务端 username 对应的名称
# PASSWORD 后的内容改为服务端 password 对应的名称,没有设置则不用改

vim client-linux.py

输入:wq保存后接下来就可以运行脚本了

1
nohup python3 client-linux.py >/dev/null 2>&1 &

至此客户端也已部署完成,接下来可以绑定域名进行反向代理。

卸载 ServerStatus

最后说一下卸载方法

卸载客户端

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 删除容器
sudo docker ps # 查看容器 ID
sudo docker stop <容器 ID>
sudo docker rm <容器 ID>

# 删除镜像
sudo docker images # 查看容器 ID
sudo docker rmi <镜像 ID>

# 最后进入"/srv/docker_data/"目录删除"serverstatus"目录

卸载服务端

1
2
3
4
5
6
7
# 查看 client-linux.py 对应进程 PID
ps -ef | grep python3

# 结束 python3 对应的进程
kill -9 PID

# 最后删除下载的名为“client-linux.py”的 Python 脚本

ServerStatus-Rust

ServerStatus 还有一个 rust 重写版,比原版更轻量,项目地址 ServerStatus-Rust

这里顺便附上官方一键安装脚本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# 创建目录
mkdir -p /opt/ServerStatus/server/ && cd /opt/ServerStatus/server/
mkdir -p /opt/ServerStatus/client/ && cd /opt/ServerStatus/client/

# 下载脚本
wget --no-check-certificate -qO status.sh 'https://raw.githubusercontent.com/zdz/ServerStatus-Rust/master/scripts/status.sh'

# 安装 服务端
bash status.sh -i -s

# 安装 客户端
bash status.sh -i -c
# or
bash status.sh -i -c protocol://username:password@master:port
# eg:
bash status.sh -i -c grpc://h1:[email protected]:9394
bash status.sh -i -c http://h1:[email protected]:8080

# 更多用法:
❯ bash status.sh

help:
    -i,--install    安装 Status
        -i -s           安装 Server
        -i -c           安装 Client
        -i -c conf      自动安装 Client
    -up,--upgrade   升级 Status
        -up -s          升级 Server
        -up -c          升级 Client
        -up -a          升级 Server and Client
    -un,--uninstall  卸载 Status
        -un -s           卸载 Server
        -un -c           卸载 Client
        -un -a           卸载 Server and Client
    -rc,--reconfig      更改 Status 配置
        -rc          更改 Client 配置
        -rc conf         自动更改 Client配置
    -s,--server     管理 Status 运行状态
        -s {status|start|stop|restart}
    -c,--client     管理 Client 运行状态
        -c {status|start|stop|restart}

    -b,--bakup      备份 Status
        -b -s          备份 Server
        -b -c          备份 Client
        -b -a          备份 Server and Client
    -rs,--restore    恢复 Status
        -rs -s          恢复 Server
        -rs -c          恢复 Client
        -rs -a          恢复 Server and Client

若无法访问 Github: 
    CN=true bash status.sh args