Ubuntu+Nginx监控报警实现指南
监控报警是保障Ubuntu服务器上Nginx稳定运行的关键环节,需覆盖服务状态、性能指标、日志异常三大维度。以下是具体实现方法,结合开源工具与自定义脚本,兼顾易用性与灵活性。
通过systemctl命令可快速查看Nginx服务的运行状态、启动时间及最近活动记录,适合日常运维手动验证:
sudo systemctl status nginx # 查看服务状态(active/radio/faulty)
ps aux | grep nginx # 列出所有Nginx进程(确认主进程与子进程存在)
编写脚本定期检查Nginx服务状态,若异常则通过邮件或短信发送报警(需提前配置邮件客户端如postfix或第三方API):
#!/bin/bash
# 检查Nginx服务状态
if ! systemctl is-active --quiet nginx; then
echo "$(date '+%Y-%m-%d %H:%M:%S') - Nginx服务异常,正在尝试重启..." >> /var/log/nginx_monitor.log
systemctl restart nginx
# 发送邮件报警(需替换为实际邮件命令,如mailx或sendmail)
echo "Nginx服务异常,已自动重启" | mail -s "Nginx报警" your-email@example.com
fi
将脚本保存为/usr/local/bin/check_nginx.sh,添加执行权限后,通过crontab -e设置每5分钟运行一次:
*/5 * * * * /usr/local/bin/check_nginx.sh
步骤1:安装Nginx Exporter
Nginx Exporter是Prometheus的适配器,用于暴露Nginx的性能指标(如QPS、响应时间、错误率)。下载并运行:
wget https://github.com/nginxinc/nginx-prometheus-exporter/releases/download/v0.10.0/nginx-prometheus-exporter_0.10.0_linux_amd64.tar.gz
tar xvf nginx-prometheus-exporter_0.10.0_linux_amd64.tar.gz
cd nginx-prometheus-exporter_0.10.0_linux_amd64
./nginx-prometheus-exporter # 默认监听9113端口
步骤2:配置Prometheus抓取指标
编辑Prometheus配置文件/etc/prometheus/prometheus.yml,添加Nginx抓取任务:
scrape_configs:
- job_name: 'nginx'
static_configs:
- targets: ['localhost:9113'] # Nginx Exporter的地址
重启Prometheus使配置生效:sudo systemctl restart prometheus
步骤3:配置Grafana仪表盘
http://<服务器IP>:3000,账号admin/admin);通过systemctl命令可直接查看Nginx服务的资源使用情况:
systemctl status nginx # 查看CPU、内存占用的简要信息
若需更详细的资源监控,可结合htop或glances工具(sudo apt install htop/glances),实时查看系统整体资源使用情况。
通过grep、awk等命令实时过滤Nginx日志中的错误信息(如404、500、503),并触发报警:
# 监控错误日志(实时显示4xx/5xx错误)
sudo tail -f /var/log/nginx/error.log | grep -E '4[0-9]{2}|5[0-9]{2}'
# 统计单位时间内的500错误数(示例:每分钟统计一次)
awk '$9 >= 500 {count++} END {if(count > 5) print "500错误数:" count}' /var/log/nginx/access.log
步骤1:部署ELK组件
logstash.conf配置文件,匹配Nginx日志格式);步骤2:设置日志报警
通过Kibana的Alerting功能,设置错误码阈值报警(如500错误数超过10次/分钟时,发送邮件或Slack通知)。
编写Python脚本解析Nginx日志,提取错误信息并发送报警(示例:监控404错误):
import re
from datetime import datetime
import smtplib
from email.mime.text import MIMEText
LOG_FILE = '/var/log/nginx/access.log'
ERROR_THRESHOLD = 200 # 404错误阈值(单位:分钟)
def send_alert(error_msg):
# 配置邮件报警(需替换为实际邮件服务器信息)
msg = MIMEText(error_msg)
msg['Subject'] = 'Nginx 404错误报警'
msg['From'] = 'your-email@example.com'
msg['To'] = 'admin@example.com'
with smtplib.SMTP('smtp.example.com', 587) as server:
server.starttls()
server.login('your-email@example.com', 'your-password')
server.send_message(msg)
def check_404_errors():
with open(LOG_FILE, 'r') as f:
# 读取最近1000行日志(避免全量读取)
lines = f.readlines()[-1000:]
error_count = sum(1 for line in lines if ' 404 ' in line)
if error_count > ERROR_THRESHOLD:
error_msg = f"时间段内404错误数:{error_count}(超过阈值{ERROR_THRESHOLD})"
send_alert(error_msg)
if __name__ == "__main__":
check_404_errors()
将脚本保存为/usr/local/bin/check_404.py,通过crontab -e设置每分钟运行一次:
* * * * * /usr/bin/python3 /usr/local/bin/check_404.py
| 工具类型 | 推荐工具 | 特点 |
|---|---|---|
| 服务状态监控 | systemctl、monit |
简单易用,适合快速检查服务是否运行 |
| 性能监控 | Prometheus+Grafana、Netdata | Prometheus+Grafana适合长期存储与可视化;Netdata适合实时监控 |
| 日志监控 | ELK Stack、Fluentd、GoAccess | ELK适合大规模日志管理;GoAccess适合实时分析访问日志 |
| 报警通知 | Mailx、Sendmail、Slack、PagerDuty | Mailx/Sendmail适合邮件报警;Slack/PagerDuty适合团队协作报警 |
通过以上方法,可实现Ubuntu+Nginx的全维度监控与及时报警,帮助运维人员快速定位并解决问题,保障服务稳定性。需根据实际需求选择合适的工具组合(如小型项目可用systemctl+自定义脚本,大型项目推荐Prometheus+Grafana+ELK)。