本文将介绍如何在 Debian 12 系统上部署 Nginx 访问监控脚本,当检测到敏感路径被访问时,通过 Telegram Bot 发送通知。
效果图
功能特点
- 实时监控指定网站的敏感路径访问
- 支持 IP 白名单
- 支持访问阈值控制(可开启/关闭)
- 通过 Telegram Bot 发送实时通知
- 通知内容包含:服务器名称、IP、时间、访问路径和 UA 信息
- 支持服务异常告警
一、准备工作
1. 创建 Telegram Bot
- 在 Telegram 中搜索 @BotFather
- 发送
/newbot
命令 - 按提示设置 bot 名称
- 保存获取到的 Bot Token
2. 获取 Chat ID
- 向你创建的 Bot 发送一条消息
- 访问
https://api.telegram.org/bot<YourBOTToken>/getUpdates
- 在返回的 JSON 中找到
chat_id
二、环境部署
1. 安装依赖
# 更新系统
apt update
apt upgrade -y
# 安装必要软件包
apt install -y python3 python3-pip python3-venv git
2. 创建项目结构
# 创建项目目录
mkdir -p /root/ecouu/nginx_notify_tg
cd /root/ecouu/nginx_notify_tg
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate
# 安装依赖
pip install requests
3. 创建监控脚本
# 创建脚本文件
nano /root/ecouu/nginx_notify_tg/nginx_notify_tg.py
4. 配置脚本
修改以下配置项:
# Nginx 日志路径(确认实际路径)
NGINX_LOG = "/var/log/nginx/access.log"
# Telegram 配置
TELEGRAM_BOT_TOKEN = "YOUR_BOT_TOKEN" # 替换为你的 Bot Token
TELEGRAM_CHAT_ID = "YOUR_CHAT_ID" # 替换为你的 Chat ID
SERVER_NAME = "YOUR_SERVER_NAME" # 设置服务器名称
# 监控的网站和路径
MONITOR_SITES = {
"example.com": ["/dashboard/login", "/admin"],# 修改为你要监控的网站和路径
# 添加更多网站和路径
}
# IP 白名单(可选)
IP_WHITELIST = {
"1.1.1.1": "安全IP",
"2.2.2.2": "开发者IP",
}
# 阈值设置
MONITOR_SETTINGS = {
'threshold_enabled': False, # True: 启用阈值, False: 每次访问都通知
'burst_threshold': 5, # 访问次数阈值
'burst_window': 60, # 检测窗口(秒)
}
5. 设置权限
chmod +x /root/ecouu/nginx_notify_tg/nginx_notify_tg.py
三、创建系统服务
1. 创建服务文件
nano /etc/systemd/system/nginx_notify_tg.service
2. 添加服务配置
[Unit]
Description=Nginx Access Monitor
After=network.target nginx.service
[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root/ecouu/nginx_notify_tg
Environment=PATH=/root/ecouu/nginx_notify_tg/venv/bin:$PATH
ExecStart=/root/ecouu/nginx_notify_tg/venv/bin/python /root/ecouu/nginx_notify_tg/nginx_notify_tg.py
Restart=always
StandardOutput=append:/var/log/nginx_notify_tg.log
StandardError=append:/var/log/nginx_notify_tg.log
[Install]
WantedBy=multi-user.target
四、配置日志轮转(可选)
1. 创建日志轮转配置
nano /etc/logrotate.d/nginx_notify_tg
2. 添加配置内容
/var/log/nginx_notify_tg.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 root root
}
五、启动服务
# 重载 systemd
systemctl daemon-reload
# 启动服务
systemctl start nginx_notify_tg
# 设置开机自启
systemctl enable nginx_notify_tg
# 查看服务状态
systemctl status nginx_notify_tg
六、通知效果展示
正常访问通知(阈值关闭时):
服务器: YOUR_SERVER_NAME-️⚠️ 检测到敏感路径访问 IP: xxx.xxx.xxx.xxx 时间: 19/Jan/2025:11:31:18 +0800 访问页面: example.com/dashboard/login UA: Mozilla/5.0 ...
频繁访问警告(阈值开启时):
服务器: YOUR_SERVER_NAME-⚠️ 检测到频繁访问 IP: xxx.xxx.xxx.xxx 警告: 60秒内访问超过5次 时间: 19/Jan/2025:11:31:18 +0800 访问页面: example.com/dashboard/login UA: Mozilla/5.0 ...
七、常用维护命令
# 查看服务状态
systemctl status nginx_notify_tg
# 重启服务
systemctl restart nginx_notify_tg
# 停止服务
systemctl stop nginx_notify_tg
# 查看日志
tail -f /var/log/nginx_notify_tg.log
# 或
journalctl -u nginx_notify_tg -f
# 检查运行状态
ps aux | grep nginx_notify_tg.py
八、故障排查
- 服务无法启动:
- 检查 Python 虚拟环境
- 检查文件权限
- 查看服务日志
- 无法发送通知:
- 验证 Bot Token 和 Chat ID
- 检查网络连接
- 测试 Telegram API
测试 Telegram Bot:
curl -X POST \
https://api.telegram.org/bot<YourBOTToken>/sendMessage \
-H 'Content-Type: application/json' \
-d '{
"chat_id": "<YourChatID>",
"text": "测试消息",
"parse_mode": "HTML"
}'
九、注意事项
- 确保 Nginx 日志路径配置正确
- Bot Token 和 Chat ID 不要泄露
- 合理配置监控路径和 IP 白名单
- 根据实际情况调整访问阈值
- 定期检查监控日志
- 确保服务器能访问 Telegram API
十、卸载
systemctl stop nginx_notify_tg && systemctl disable nginx_notify_tg && rm /etc/systemd/system/nginx_notify_tg.service && systemctl daemon-reload && rm /etc/logrotate.d/nginx_notify_tg && rm -rf /root/ecouu/nginx_notify_tg && rm /var/log/nginx_notify_tg.log*