如何在Ubuntu18.04上使用DiscordWebhooks获取网站状态通知
作为 Write for DOnations 计划的一部分,作者选择了 Apache 软件基金会 来接受捐赠。
介绍
当您拥有关键网站时,您会想知道它们何时遇到任何问题,以便在对用户产生影响之前修复它们。 接收通知的一种方法是通过基于文本的聊天系统设置警报。
Discord 是一个类似于 Slack 的托管聊天系统。 使用 Discord,您可以设置一个免费的消息系统,让您可以通过文本消息、图像、音频和视频进行交流。 虽然它提供高级功能,但您可以 免费注册 ,它有适用于 Windows、macOS、Linux、Android 和 iOS 的客户端。
在本教程中,您将配置自己的 Discord 服务器、创建 Discord webhook、编写检查网站列表状态的 Bash 脚本,并测试从服务器到 Discord 频道的通知。
先决条件
在开始本指南之前,您需要以下内容:
- 一个 Ubuntu 18.04 服务器,它将运行您的监控脚本并与 Discord (monitor-server) 对话。 您可以按照 初始服务器设置指南 设置此服务器。
- 如果您还没有想要监控的网站,请使用 How To Install the Apache Web Server on Ubuntu 18.04 设置 apache-server 并确保完成步骤5关于设置虚拟主机。
- 一个不和谐的帐户。 您可以访问 Discord 注册页面 注册一个免费的 Discord 帐户。
第 1 步 — 设置 Discord Webhook
打开 Discord 帐户后,您可以创建自己的私人 Discord 服务器。
首先,在浏览器中登录您的Discord帐户或启动您的Discord应用程序并单击创建服务器按钮。
然后为您的服务器选择一个名称并单击 创建服务器 按钮。
接下来,您将配置 Discord Webhook。 Webhook 是可用于将服务链接在一起的唯一 URL。 Discord 的 webhook 允许您自动发送消息并将数据更新发送到 Discord 文本频道。
在本教程中,当您的服务器上的特定服务出现故障时,您将向您的 webhook 发送通知,Discord 将确保您在您的频道上收到这些消息。
要创建 webhook,您必须首先单击您的频道,然后单击频道名称旁边的 Edit Channel 按钮。
然后点击 Webhooks 选项卡并点击 Create Webhook 按钮。
之后,为您的 webhook 选择一个名称,在本教程中,我们将使用 Alerts
,因为这是我们的 Bash 脚本将执行的操作 - 在我们的一个网站出现故障的情况下提醒我们。
复制您的 webhook URL 并保存以供以后使用。 最后点击【X19X】保存【X27X】按钮。
您现在拥有 Discord 帐户、服务器和 webhook。 您现在可以继续为您的脚本创建一个测试文件以进行监控。
第 2 步 — 创建测试文件(可选)
如果您还没有自己的网站要测试,请完成此步骤以添加测试文件以检查您的监控脚本将如何工作。 确保在您的 apache-server 上运行这些命令。
首先,使用以下命令创建测试文件:
nano /var/www/your_domain/test
将一些内容添加到您的文件中,以便您检查它是否正常工作:
测试
test
保存并退出文件。
现在在浏览器中导航到 http://your_domain/test
以确保您可以接收到 test
文件中的文本。
在下一步中,您将开始构建您的监控脚本。
第 3 步 - 创建您的监控脚本
现在您已经配置了 webhook,您将继续创建您的 Bash 脚本,该脚本将检查您网站的响应代码。 如果任何网站返回的状态与 200 OK
不同,您的脚本将向 Discord webhook 发送请求,以便您在 Discord 频道中收到通知。
注意: 您可以使用任何其他编程语言来构建这样的脚本。
首先通过 SSH 连接到您用来运行监控脚本的 monitor-server。
首先在您的主文件夹中创建一个文件。 在本教程中,我们将调用文件 check_status.sh
。
使用您喜欢的文本编辑器打开文件:
nano ~/check_status.sh
为了让程序加载器将此可执行文件识别为 Bash 脚本,请将以下行添加到文件顶部:
~/check_status.sh
#!/bin/bash
所有以 #
开头的行都是注释。 注释是可选的,但在脚本中添加注释会让其他人更容易理解脚本的作用:
~/check_status.sh
#!/bin/bash ## # Website status check script # Author: Your Name # Date: 01/01/2020 ## . . .
接下来,将 Discord Webhook 指定为变量。 添加您之前为 webhook 复制的 URL:
~/check_status.sh
. . . ## # Discord webhook # Change the 'your_discord_webhook_name' with your actual Discord Webhook ## url="your_discord_webhook_name" . . .
由于您可能会使用此脚本来检查多个网站的状态,因此请创建一个名为 websites_list
的变量并存储您要监控的网站的域名或 IP 地址。 如果您使用本教程中的可选测试文件,请确保在您的域名或 IP 地址后添加 /test
:
~/check_status.sh
. . . ## # List of websites to check ## websites_list="your_domain/test" . . .
在监控多个网站的情况下,可以在 websites_list
变量中添加多个域名或 IP 地址,并使用空格作为分隔符:
~/check_status.sh
. . . websites_list="your_domain1/test your_domain2 your_domain3" . . .
现在您需要遍历网站列表并检查它们的状态。 为此,将以下 for
循环添加到您的文件中:
~/check_status.sh
. . . 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 通知。 将以下条件块添加到您的文件中:
~/check_status.sh
. . . 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 webhook 接收通知。
要发送通知,您可以使用 curl
命令向 Discord webhook URL 提交 POST
请求。
在 if
语句中添加以下 curl
请求:
~/check_status.sh
. . . 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
:指定要使用POST
作为请求方法。-d
:将指定的 JSON 数据发送到 Discord Webhook。
这将是您脚本的最终版本:
~/check_status.sh
#!/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
接下来,返回您的 monitor-server 并运行脚本:
bash check_status.sh
移动到您的 Discord 应用程序并检查您的警报,您将收到 :403 错误。 这说明您没有正确设置权限,被禁止查看该文件。
现在,要测试不同的错误,请从 apache-server 中完全删除此文件:
sudo rm /var/www/your_domain/test
接下来,返回您的 monitor-server 并运行脚本:
bash check_status.sh
移至 Discord 应用程序并检查警报,您将收到 :404 错误。 这表明该文件不可用。
如果您在手机上安装了 Discord,您也会在那里收到警报。
您现在有一个脚本,可以在您的网站遇到任何问题时提醒您。 接下来让我们将脚本配置为每五分钟自动运行一次。
第 5 步 — 自动化流程
自动化检查的一种方法是创建一个 cron 作业 ,它将每 5 分钟左右运行一次。
首先,回到您的 监控服务器 。 那么在你可以自动运行脚本之前,你需要整理一下你的文件权限,并确保脚本是可执行的,否则它不会运行。 要使脚本可执行运行:
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 文档。