作者选择Apache 软件基金会作为Write for DOnations计划的一部分接受捐赠。
介绍
当您拥有关键网站时,您会想知道它们何时遇到任何问题,以便您可以在对用户产生影响之前修复它们。接收通知的一种方法是通过基于文本的聊天系统设置警报。
Discord是一个类似于 Slack 的托管聊天系统。使用 Discord,您可以设置一个免费的消息系统,让您可以通过文本消息、图像、音频和视频进行通信。虽然它提供高级功能,但您可以免费注册,并且它有适用于 Windows、macOS、Linux、Android 和 iOS 的客户端。
在本教程中,您将配置自己的 Discord 服务器,创建一个 Discord webhook,编写一个 Bash 脚本来检查网站列表的状态,并测试从您的服务器到您的 Discord 频道的通知。
先决条件
在开始本指南之前,您需要具备以下条件:
-
一个 Ubuntu 18.04 服务器,它将运行您的监控脚本并与 Discord ( monitor-server )对话。您可以按照此初始服务器设置指南设置此服务器。
-
如果您还没有想要监控的网站,请使用如何在 Ubuntu 18.04 上安装 Apache Web 服务器来设置apache-server,并确保完成设置虚拟主机的步骤 5。
-
一个 Discord 帐户。您可以访问Discord 注册页面以注册一个免费的 Discord 帐户。
第 1 步 — 设置您的 Discord Webhook
打开 Discord 帐户后,您可以创建自己的私人 Discord 服务器。
首先,在浏览器中登录您的 Discord 帐户或启动您的 Discord 应用程序,然后单击“创建服务器”按钮。
然后为您的服务器选择一个名称,然后单击“创建服务器”按钮。
接下来,您将配置 Discord 网络钩子。Webhook 是可用于将服务链接在一起的唯一 URL。Discord 的网络钩子允许您自动发送消息并将数据更新发送到您的 Discord 文本频道。
在本教程中,当您服务器上的特定服务出现故障时,您将向您的 webhook 发送通知,Discord 将确保您在您的频道上收到这些消息。
要创建网络钩子,您必须先点击您的频道,然后点击您频道名称旁边的“编辑频道”按钮。
然后单击Webhooks选项卡并单击Create Webhook按钮。
之后,为您的 webhook 选择一个名称,在本教程中我们将使用,Alerts
因为这是我们的 Bash 脚本将执行的操作 – 在我们的一个网站出现故障时提醒我们。
复制您的 webhook URL 并保存以备后用。最后,点击保存按钮。
您现在拥有 Discord 帐户、服务器和网络钩子。您现在可以继续为您的脚本创建一个测试文件以进行监控。
步骤 2 — 创建测试文件(可选)
如果您还没有自己的网站要测试,请完成此步骤以添加测试文件以检查您的监控脚本将如何工作。确保在您的apache-server上运行这些命令。
首先,使用以下命令创建测试文件:
- nano /var/www/your_domain/test
将一些内容添加到您的文件中,以便您可以检查它是否正常工作:
test
保存并退出文件。
现在在浏览器中导航到以确保您可以接收文件中的文本。http://your_domain/test
test
在下一步中,您将开始构建监控脚本。
第 3 步 – 创建您的监控脚本
现在您已经配置了您的 webhook,您将继续创建您的 Bash 脚本,该脚本将检查您网站的响应代码。如果任何网站返回的状态不同于200 OK
,您的脚本将向 Discord 网络钩子发送请求,以便您在 Discord 频道中收到通知。
注意:您可以使用任何其他编程语言来构建这样的脚本。
首先通过 SSH 连接到您用来运行监控脚本的监控服务器。
首先在您的主文件夹中创建一个文件。我们将check_status.sh
在本教程中调用该文件。
使用您喜欢的文本编辑器打开文件:
- nano ~/check_status.sh
为了让程序加载器将此可执行文件识别为 Bash 脚本,请将以下行添加到文件顶部:
#!/bin/bash
所有以 a 开头的行#
都是注释。注释是可选的,但在脚本中添加注释可以让其他人更容易理解脚本的作用:
#!/bin/bash
##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##
. . .
接下来,将您的 Discord webhook 指定为变量。添加您之前为 webhook 复制的 URL:
. . .
##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"
. . .
由于您可能会使用此脚本来检查多个网站的状态,因此创建一个变量websites_list
并存储您要监控的网站的域名或 IP 地址。如果您使用本教程中的可选测试文件,请确保/test
在您的域名或 IP 地址后添加:
. . .
##
# List of websites to check
##
websites_list="your_domain/test"
. . .
如果您正在监控多个网站,您可以在websites_list
变量中添加更多域名或 IP 地址,并使用空格作为分隔符:
. . .
websites_list="your_domain1/test your_domain2 your_domain3"
. . .
现在您需要遍历网站列表并检查它们的状态。为此,将以下for
循环添加到您的文件中:
. . .
for website in ${websites_list} ; do
status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})
echo $status_code
done
. . .
此for
循环将遍历websites_list
变量中的每个项目并使用curl
命令检查网站的状态。
该echo $status_code
语句将打印出curl
命令的响应状态。如果网站按预期运行,该curl
命令将返回响应代码200 OK
,这意味着网站已启动并正在运行。否则,您将收到另一个响应代码。
在for
循环内,添加一个if
语句来检查响应代码是否200
存在。如果响应代码是,200
则这意味着该网站正在运行,您不需要 Discord 通知。将以下条件块添加到您的文件中:
. . .
if [[ "$status_code" -ne 200 ]] ; then
# POST request to Discord Webhook with the domain name and the HTTP status code
else
echo "${website} is running!"
fi
. . .
如果网站有任何问题,您将获得不同的响应代码,在这种情况下,您将希望通过 Discord 网络钩子接收通知。
要发送通知,您可以使用该curl
命令向POST
Discord webhook URL提交请求。
curl
在您的if
语句中添加以下请求:
. . .
if [[ "$status_code" -ne 200 ]] ; then
# POST request to Discord Webhook with the domain name and the HTTP status code
curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} returned: ${status_code}"'"}' $url
else
echo "${website} is running!"
fi
. . .
现在让我们检查不同的论点:
-H
:告诉curl
您要在请求中添加额外的标头。"Content-Type: application/json"
:定义 webhook 应该期望的数据类型(HTTP JSON)。-X POST
: 指定您要使用 aPOST
作为请求方法。-d
:将指定的 JSON 数据发送到 Discord Webhook。
这将是您脚本的最终版本:
#!/bin/bash
##
# Website status check script
# Author: Your Name
# Date: 01/01/2020
##
##
# Discord webhook
# Change the 'your_discord_webhook_name' with your actual Discord Webhook
##
url="your_discord_webhook_name"
##
# List of websites to check
# To add more websites just use space as a separator, for example:
# websites_list="your_domain1 your_domain2 your_domain3"
##
websites_list="your_domain/test your_domain2"
for website in ${websites_list} ; do
status_code=$(curl --write-out %{http_code} --silent --output /dev/null -L ${website})
if [[ "$status_code" -ne 200 ]] ; then
# POST request to Discord Webhook with the domain name and the HTTP status code
curl -H "Content-Type: application/json" -X POST -d '{"content":"'"${domain} : ${status_code}"'"}' $url
else
echo "${website} is running!"
fi
done
该脚本将遍历此列表并检查每个网站的状态。
使用以下命令运行脚本以确保它按预期工作:
- bash ~/check_status.sh
运行脚本后,您将在终端中收到以下输出,确认您的网站正在运行:
Outputyour_domain1 is running!
your_domain2 is running!
接下来,您将测试您的 Discord 通知。
第 4 步 — 测试您的 Discord 通知
现在是时候使用测试文件检查您的 webhook 是否按预期工作了。
在apache-server 上运行以下命令来关闭对该文件的访问权限:
- sudo chmod 000 /var/www/your_domain/test
接下来,返回您的监控服务器并运行脚本:
- bash check_status.sh
转到您的 Discord 应用程序并检查您的警报,您将收到:403错误。这表明您没有正确设置权限,禁止查看文件。
现在,要测试不同的错误,请从您的apache-server 中完全删除此文件:
- sudo rm /var/www/your_domain/test
接下来,返回您的监控服务器并运行脚本:
- bash check_status.sh
转到您的 Discord 应用程序并检查您的警报,您将收到:404错误。这表明该文件不可用。
如果您在手机上安装了 Discord,您也会在那里收到警报。
您现在有一个脚本,可以在您的网站遇到任何问题时提醒您。接下来让我们将脚本配置为每五分钟自动运行一次。
步骤 5 — 自动化流程
自动化检查的方法之一是创建一个每 5 分钟左右运行一次的cron 作业。
首先,回到你的monitor-server。那么在你可以自动运行脚本之前,你需要整理你的文件权限并确保脚本是可执行的,否则它不会运行。要使脚本可执行运行:
- chmod u+x ~/check_status.sh
运行以下命令来编辑您的 crontab:
- crontab -e
然后将以下内容添加到文件中:
*/5 * * * * /home/your_user/check_status.sh
然后保存crontab
,您的脚本将每 5 分钟执行一次。
结论
在本文中,您配置了自己的 Discord Webhook 并创建了一个脚本,以便在您的网站发生特定错误时通知您。现在,您可以使用自己喜欢的编程语言并编写更复杂的机器人。
要了解有关设置监控基础架构的更多信息,请查看我们的监控主题页面。
而且,如果您有兴趣了解有关 Shell 脚本的更多信息,请查看我们的Shell 脚本简介教程系列。
要了解有关 Discord Webhooks 的更多信息,您可以查看官方Discord Webhooks 文档。