Nginx日志实现访问异常报警详解

发布时间 - 2026-01-10 23:25:51    点击率:

前言

在工作中为了防止一些恶意访问的行为,例如不断的请求刷流量,通过实时过滤Nginx访问日志,将单位时间内访问次数达到指定阀值的来源ip及时的通知系统管理员,这里通过邮件的方式通知。

监控脚本

vim /opt/nginx/sbin/nginx_log_monitor.sh
#!/bin/bash
#日志文件
logfile=/opt/nginx/logs/www
 
#开始时间
start_time=`date -d"$last_minutes minutes ago" +"%H:%M:%S"`
 
#结束时间
stop_time=`date +"%H:%M:%S"`
 
#过滤出单位之间内的日志并统计最高ip数
tac $logfile/access.log | awk -v st="$start_time" -v et="$stop_time" '{t=substr($4,RSTART+14,21);if(t>=st && t<=et) {print $0}}' \
| awk '{print $1}' | sort | uniq -c | sort -nr > $logfile/log_ip_top10
ip_top=`cat $logfile/log_ip_top10 | head -1 | awk '{print $1}'`
# 单位时间[1分钟]内单ip访问次数超过200次,则触发邮件报警
if [[ $ip_top -gt 200 ]];then
 /usr/bin/python /opt/tools/send_mail.py &
fi
chmod +x /opt/nginx/sbin/nginx_log_monitor.sh

定时任务

如上脚本监控一分钟内的日志,因此每分钟执行一次:

# crontab -e
*/1 * * * * /bin/bash /opt/nginx/sbin/nginx_log_monitor.sh

邮件告警

这里通过python实现发送邮件

# vim /opt/tools/send_mail.py
# -*- coding: utf-8 -*-
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.utils import parseaddr, formataddr
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from datetime import datetime
import os
import smtplib
def _format_addr(s):
 name, addr = parseaddr(s)
 return formataddr((Header(name, 'utf-8').encode(), addr))
# 邮箱定义
smtp_server = 'smtp.exmail.qq.com'
smtp_port = 465
from_addr = 'chenqingkang@qiniu.com'
password = os.environ.get('MAIL_PASSWD')
to_addr = ['810959120@qq.com']
# 邮件对象
msg = MIMEMultipart()
msg['From'] = _format_addr('发件人 <%s>' % from_addr)
msg['To'] = _format_addr('收件人 <%s>' % to_addr)
msg['Subject'] = Header('Warning:单ip请求次数异常', 'utf-8').encode()
# 获取系统中要发送的文本内容
with open('/opt/nginx/logs/log_ip_top10', 'r') as f:
 line = f.readline().strip()
 line = line.split(" ")
print(line)
# 邮件正文是MIMEText:
html = '<html><body><h2>一分钟内单ip请求次数超过阀值</h2>' + \
 '<p>ip:%s  请求次数/min:%s</p>' % (line[1],line[0]) + \
 '</body></html>' 
msg.attach(MIMEText(html, 'html', 'utf-8'))
server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.login(from_addr, password)
server.sendmail(from_addr, to_addr, msg.as_string())
server.quit()

示例

写个脚本不停curl请求资源触发报警:

# vim curl.sh
#!/bin/bash
#example:curl.sh http://www.qingkang.me 100
usage()
{
 echo "usage: `basename $0` url count"
}
if [ $# -ne 2 ]; then
 usage
 exit 1
fi
for i in `seq 1 $2`;do
 http_code=`curl -o /dev/null -s -w %{http_code} $1`
 echo $1 $http_code
done
# bash curl.sh http://qingkang.me/ 5
http://qingkang.me/ 200
http://qingkang.me/ 200
http://qingkang.me/ 200
http://qingkang.me/ 200
http://qingkang.me/ 200

调低阀值触发告警:

一分钟内单ip请求次数超过阀值
ip:115.231.182.82 请求次数/min:27

完善

这里仅实现了邮件告警功能,实际上还可以实现自动屏蔽恶意访问的ip。可以通过Nginx deny来实现,也可以iptables -I INPUT -s x.x.x.x -j DROP通过iptables屏蔽。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家能有一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。


# nginx  # 访问日志  # 日志  # ginx  # 日志分析  # 利用nginx访问日志如何记录mysql中的用户id详解  # Nginx自定义访问日志的配置方式  # centos中nginx按日期自动分割访问日志的方法  # Nginx实现浏览器可实时查看访问日志的步骤详解  # Nginx屏蔽F5心跳日志、指定IP访问日志  # nginx访问日志并删除指定天数前的日志记录配置方法  # Python 分析Nginx访问日志并保存到MySQL数据库实例  # shell脚本分析 nginx日志访问次数最多及最耗时的页面(慢查询)  # Nginx访问日志及错误日志参数说明  # 一分钟内  # 还可以  # 有一定  # 时间内  # 可以通过  # 这篇文章  # 谢谢大家  # 来实现  # 每分钟  # 在工作中  # 为了防止  # 中要  # 大家能  # 发送邮件  # 调低  # 实现了  # 结束时间  # 有疑问  # cat  # ip_top 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: C#如何调用原生C++ COM对象详解  详解jQuery停止动画——stop()方法的使用  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】  郑州企业网站制作公司,郑州招聘网站有哪些?  Linux后台任务运行方法_nohup与&使用技巧【技巧】  Laravel怎么为数据库表字段添加索引以优化查询  Laravel怎么实现支付功能_Laravel集成支付宝微信支付  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  Chrome浏览器标签页分组怎么用_谷歌浏览器整理标签页技巧【效率】  Laravel如何使用Vite进行前端资源打包?(配置示例)  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能  简历在线制作网站免费版,如何创建个人简历?  如何快速搭建FTP站点实现文件共享?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  jQuery 常见小例汇总  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何在云虚拟主机上快速搭建个人网站?  EditPlus中的正则表达式 实战(4)  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  教你用AI将一段旋律扩展成一首完整的曲子  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  如何在腾讯云免费申请建站?  javascript基本数据类型及类型检测常用方法小结  Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面  如何快速生成可下载的建站源码工具?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  如何构建满足综合性能需求的优质建站方案?  如何快速搭建高效可靠的建站解决方案?  详解Android图表 MPAndroidChart折线图  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  如何快速搭建高效服务器建站系统?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  如何快速完成中国万网建站详细流程?  如何用PHP快速搭建高效网站?分步指南  如何在Windows虚拟主机上快速搭建网站?  Android GridView 滑动条设置一直显示状态(推荐)  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  如何将凡科建站内容保存为本地文件?  如何正确下载安装西数主机建站助手?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  如何选择可靠的免备案建站服务器?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑