告别盲人摸象:用 Flask 快速打造服务器监控可视化面板
运维兄弟们,是不是还在用 top、free 这些命令吭哧吭哧地盯着服务器?数据是有了,但不够直观,排查问题效率太低!今天,咱们就撸起袖子,用 Python Flask 框架,快速打造一个属于自己的服务器监控可视化面板,让服务器状态一目了然!
一、明确需求:我们要监控哪些指标?
在开始之前,先别急着敲代码。 咱们得先明确一下,到底要监控哪些指标?这些指标对咱们的日常运维工作最有帮助?
- CPU 使用率: 看看 CPU 是不是被哪个进程给占满了,是不是需要优化代码或者升级配置了。
- 内存使用率: 内存够不够用,是不是有内存泄漏,是不是该加内存条了。
- 磁盘使用率: 磁盘空间还剩多少,是不是该清理一下日志文件或者扩容磁盘了。
- 网络流量: 看看网络带宽是不是被打满了,是不是有恶意流量攻击。
- 进程状态: 关键进程是不是都在正常运行,有没有挂掉需要重启的。
- 服务器负载: 了解服务器的整体压力情况,判断是否需要进行负载均衡。
这些只是最基础的,实际工作中,你可能还需要监控数据库连接数、Redis 缓存命中率等等。总之,根据你的实际需求来确定监控指标。
二、技术选型:为什么选择 Flask?
监控面板的技术方案有很多,为什么我推荐 Flask 呢?
- 轻量级: Flask 非常轻量级,学习曲线平缓,容易上手。对于快速搭建原型系统非常有利。
- 灵活: Flask 提供了足够的灵活性,可以根据自己的需求进行定制,不会被框架束缚。
- Python 生态: Python 拥有丰富的第三方库,可以方便地获取服务器的各种监控数据,比如 psutil、netifaces 等。
- 易于部署: Flask 应用部署起来也很方便,可以使用 Gunicorn、uWSGI 等 WSGI 服务器。
当然,如果你对 Django 更熟悉,或者需要更强大的功能,也可以选择 Django。但对于快速搭建一个简单的监控面板来说,Flask 绝对是首选。
三、环境搭建:撸起袖子,开始干!
安装 Python 和 pip: 确保你的服务器上已经安装了 Python 和 pip。如果没有,请自行安装,这个就不赘述了。
创建项目目录: 在你喜欢的位置创建一个项目目录,比如
server_monitor
。创建虚拟环境: 强烈建议使用虚拟环境,避免不同项目之间的依赖冲突。在项目目录下执行以下命令:
python3 -m venv venv source venv/bin/activate 安装 Flask 和其他依赖:
pip install Flask psutil netifaces
Flask
:Web 框架。psutil
:用于获取系统信息的库。netifaces
:用于获取网络接口信息的库。
四、代码实现:核心功能模块
接下来,就是最核心的部分了:编写代码!
创建 Flask 应用:
app.py
from flask import Flask, render_template import psutil import netifaces app = Flask(__name__) @app.route('/') def index(): # 获取 CPU 使用率 cpu_usage = psutil.cpu_percent(interval=1) # 获取内存使用率 memory = psutil.virtual_memory() memory_usage = memory.percent memory_total = memory.total / (1024 * 1024) # MB memory_used = memory.used / (1024 * 1024) # MB # 获取磁盘使用率 disk = psutil.disk_usage('/') disk_usage = disk.percent disk_total = disk.total / (1024 * 1024 * 1024) # GB disk_used = disk.used / (1024 * 1024 * 1024) # GB # 获取网络流量 net_io = psutil.net_io_counters() bytes_sent = net_io.bytes_sent / (1024 * 1024) # MB bytes_recv = net_io.bytes_recv / (1024 * 1024) # MB # 获取服务器负载 load_average = psutil.getloadavg() # 获取进程列表(只显示前 10 个) processes = [] for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']): try: processes.append(proc.info) except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): pass processes = sorted(processes, key=lambda p: p['cpu_percent'], reverse=True)[:10] return render_template('index.html', cpu_usage=cpu_usage, memory_usage=memory_usage, memory_total=memory_total, memory_used=memory_used, disk_usage=disk_usage, disk_total=disk_total, disk_used=disk_used, bytes_sent=bytes_sent, bytes_recv=bytes_recv, load_average=load_average, processes=processes) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0') 代码解释:
- 导入 Flask、render_template、psutil 和 netifaces 库。
- 创建 Flask 应用实例
app
。 - 定义路由
/
,对应index
函数。 - 在
index
函数中,使用psutil
和netifaces
获取 CPU 使用率、内存使用率、磁盘使用率、网络流量等信息。 - 使用
render_template
函数渲染index.html
模板,并将获取到的数据传递给模板。 - 最后,运行 Flask 应用,
debug=True
开启调试模式,host='0.0.0.0'
允许外部访问。
创建 HTML 模板:
templates/index.html
在项目目录下创建一个
templates
目录,并在其中创建index.html
文件。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>服务器监控面板</title> <style> body { font-family: sans-serif; } .container { width: 80%; margin: 0 auto; } .metric { margin-bottom: 20px; border: 1px solid #ccc; padding: 10px; } .metric h2 { margin-top: 0; } .process-table { width: 100%; border-collapse: collapse; } .process-table th, .process-table td { border: 1px solid #ccc; padding: 8px; text-align: left; } </style> </head> <body> <div class="container"> <h1>服务器监控面板</h1> <div class="metric"> <h2>CPU 使用率</h2> <p>{{ cpu_usage }}%</p> </div> <div class="metric"> <h2>内存使用率</h2> <p>{{ memory_usage }}% ({{ memory_used:.2f }}MB / {{ memory_total:.2f }}MB)</p> </div> <div class="metric"> <h2>磁盘使用率</h2> <p>{{ disk_usage }}% ({{ disk_used:.2f }}GB / {{ disk_total:.2f }}GB)</p> </div> <div class="metric"> <h2>网络流量</h2> <p>发送: {{ bytes_sent:.2f }}MB, 接收: {{ bytes_recv:.2f }}MB</p> </div> <div class="metric"> <h2>服务器负载</h2> <p>1分钟: {{ load_average[0]:.2f }}, 5分钟: {{ load_average[1]:.2f }}, 15分钟: {{ load_average[2]:.2f }}</p> </div> <div class="metric"> <h2>进程列表 (CPU 占用前 10)</h2> <table class="process-table"> <thead> <tr> <th>PID</th> <th>进程名</th> <th>CPU 使用率</th> <th>内存使用率</th> </tr> </thead> <tbody> {% for process in processes %} <tr> <td>{{ process.pid }}</td> <td>{{ process.name }}</td> <td>{{ process.cpu_percent }}%</td> <td>{{ process.memory_percent }}%</td> </tr> {% endfor %} </tbody> </table> </div> </div> </body> </html> 代码解释:
- 使用 HTML 和 CSS 定义了页面的结构和样式。
- 使用 Flask 的模板语法
{{ ... }}
将 Python 代码中的数据渲染到页面上。 - 使用
{% for ... in ... %}
循环遍历进程列表,并将每个进程的信息显示在表格中。
运行 Flask 应用:
在项目目录下执行以下命令:
python app.py
然后在浏览器中访问
http://服务器IP:5000
,就可以看到服务器监控面板了!
五、进阶功能:让监控面板更强大
上面的代码只是一个最简单的原型,还有很多可以改进和扩展的地方。
使用图表展示数据:
使用 ECharts、Chart.js 等图表库,可以将 CPU 使用率、内存使用率等数据以图表的形式展示出来,更加直观。
添加历史数据查询功能:
将监控数据存储到数据库中,比如 MySQL、InfluxDB 等,然后提供一个界面,可以查询历史数据。
添加报警功能:
当某个指标超过阈值时,发送邮件、短信等报警通知,及时发现问题。
使用 Celery 实现异步任务:
有些监控任务可能比较耗时,可以使用 Celery 将这些任务放到后台异步执行,避免阻塞 Web 应用。
美化界面:
使用 Bootstrap、Vue.js 等前端框架,可以美化界面,提升用户体验。
六、总结:运维不再是苦力活
通过本文,我们学习了如何使用 Flask 快速打造一个服务器监控可视化面板。虽然这只是一个简单的示例,但它已经能够帮助我们更好地了解服务器的状态,提高运维效率。希望大家能够在此基础上,不断学习和探索,打造出更加强大的监控系统,让运维工作不再是苦力活!记住,技术是为了解放生产力,而不是让我们成为技术的奴隶!