mdserver-web服务监控:进程状态和自动重启
【免费下载链接】mdserver-web Simple Linux Panel 项目地址: https://gitcode.com/GitHub_Trending/md/mdserver-web
概述
mdserver-web作为一款专业的Linux面板服务,内置了完善的进程监控和自动重启机制。本文将深入解析其服务监控架构,重点介绍进程状态检测、异常处理以及自动重启的实现原理,帮助管理员更好地理解和使用这一关键功能。
监控架构设计
mdserver-web采用多线程监控架构,通过独立的守护线程对系统各项服务进行实时监控:
核心监控功能详解
1. 系统级监控(System Monitor)
系统监控线程负责全局服务状态检测,通过配置文件控制监控开关:
def systemTask():
from utils.system import monitor
try:
while True:
monitor_status = thisdb.getOption('monitor_status',type='monitor',default='open')
if monitor_status == 'open':
monitor.instance().run()
time.sleep(5)
except Exception as ex:
print('systemTask:',mw.getTracebackInfo())
time.sleep(30)
systemTask()
监控特性:
- 5秒检测间隔,确保实时性
- 异常自动恢复机制
- 配置驱动,支持动态启停
2. PHP服务监控与自动修复
PHP监控是mdserver-web的核心功能之一,专门处理PHP-FPM进程异常:
PHP版本支持矩阵
| PHP版本 | 状态检测 | 自动重启 | 服务管理方式 |
|---|---|---|---|
| 5.2-5.6 | ✓ | ✓ | init.d |
| 7.0-7.4 | ✓ | ✓ | systemd |
| 8.0-8.4 | ✓ | ✓ | systemd |
检测算法流程
关键代码实现
def checkPHPVersion(version):
# 检查指定PHP版本状态
try:
sock = mw.getFpmAddress(version)
data = mw.requestFcgiPHP(sock, '/phpfpm_status_' + version + '?json')
result = str(data, encoding='utf-8')
except Exception as e:
result = 'Bad Gateway'
# 异常状态判断
error_patterns = [
'Bad Gateway',
'HTTP Error 404: Not Found',
'Connection refused'
]
for pattern in error_patterns:
if pattern in result:
return False
return True
3. OpenResty服务监控
OpenResty作为Web服务器核心,mdserver-web提供两种监控模式:
立即重启模式(高优先级)
def openrestyRestartAtOnce():
restart_nginx_tip = mw.getPanelDir()+'/data/restart_nginx.pl'
while True:
if os.path.exists(restart_nginx_tip):
os.remove(restart_nginx_tip)
mw.opWeb('reload')
time.sleep(1)
特性:
- 1秒检测间隔,快速响应
- 文件信号触发机制
- 安全的重载操作(reload)
自动重启模式(日常维护)
def openrestyAutoRestart():
try:
while True:
odir = mw.getServerDir() + '/openresty'
if not os.path.exists(odir):
time.sleep(86400)
continue
mw.opWeb('reload')
time.sleep(86400) # 24小时
except Exception as e:
mw.writeLog('OpenResty检测', '自动修复异常:'+str(e))
time.sleep(86400)
应用场景:
- SSL证书自动续期后生效
- 日常配置维护
- 预防内存泄漏
4. 进程状态检测机制
mdserver-web使用多种技术进行进程状态检测:
进程检测方法对比
| 检测方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 端口检测 | 网络服务 | 真实业务可用性 | 受防火墙影响 |
| 进程PID检查 | 本地服务 | 简单直接 | 不能反映业务状态 |
| Unix Socket检测 | PHP-FPM | 高性能 | 需要特定协议 |
| HTTP接口检测 | Web服务 | 完整业务链 | 依赖网络 |
进程管理命令封装
# 获取进程PID
cmd = "ps aux | grep 'panel_task.py' | grep -v grep |awk '{print $2}'"
task_pid = mw.execShell(cmd)
# 递归终止进程树
def removeTaskRecursion(pid):
cmd = "ps -ef|grep %s | grep -v grep |sed -n '2,1p' | awk '{print $2}'" % pid
sub_pid = mw.execShell(cmd)
if sub_pid[0].strip() == '':
return 'ok'
if sub_pid[0].strip() == pid :
return 'ok'
removeTaskRecursion(sub_pid[0].strip())
mw.execShell('kill -9 ' + sub_pid[0].strip())
return sub_pid[0].strip()
5. 任务队列监控系统
mdserver-web内置任务队列管理系统,确保后台任务可靠执行:
任务状态机
任务执行流程
def runPanelTask():
# 获取任务锁
lock_file = mw.getTriggerTaskLockFile()
try:
if os.path.exists(lock_file):
# 处理异常任务
bash_list = thisdb.getTaskList(status=-1)
for task in bash_list:
thisdb.setTaskStatus(task['id'], 0)
# 执行待处理任务
run_list = thisdb.getTaskList(status=0)
for run_task in run_list:
start = int(time.time())
thisdb.setTaskData(run_task['id'], start=start)
thisdb.setTaskStatus(run_task['id'], -1)
# 任务类型分发
if run_task['type'] == 'download':
argv = run_task['cmd'].split('|mw|')
downloadFile(argv[0], argv[1])
elif run_task['type'] == 'execshell':
execShell(run_task['cmd'])
end = int(time.time())
thisdb.setTaskData(run_task['id'], end=end)
thisdb.setTaskStatus(run_task['id'], 1)
# 清理锁文件
if thisdb.getTaskUnexecutedCount() < 1:
os.remove(lock_file)
except Exception as e:
print('runPanelTask:',mw.getTracebackInfo())
监控配置与管理
监控开关配置
通过数据库选项控制监控功能:
-- 查看监控状态
SELECT * FROM options WHERE type='monitor';
-- 开启系统监控
UPDATE options SET value='open' WHERE type='monitor' AND name='monitor_status';
-- 关闭系统监控
UPDATE options SET value='close' WHERE type='monitor' AND name='monitor_status';
监控日志分析
mdserver-web提供完整的监控日志体系:
| 日志类型 | 存储位置 | 内容描述 |
|---|---|---|
| PHP守护日志 | 系统日志 | PHP进程异常与修复记录 |
| OpenResty日志 | 服务日志 | Web服务重启记录 |
| 任务执行日志 | panelTask.pl | 后台任务执行详情 |
| 系统监控日志 | 系统日志 | 全局监控事件 |
最佳实践建议
1. 监控策略优化
# 自定义监控间隔
def optimizedMonitor():
check_intervals = {
'php': 10, # PHP检测间隔10秒
'nginx': 5, # Nginx检测间隔5秒
'system': 30, # 系统检测间隔30秒
'plugin': 60 # 插件检测间隔60秒
}
# 根据服务重要性设置不同检测频率
2. 异常处理策略
# 分级重试机制
def smartRetry(service_name, max_retries=3):
retry_delays = [1, 5, 30] # 分级延迟
for attempt in range(max_retries):
try:
if checkService(service_name):
return True
restartService(service_name)
time.sleep(retry_delays[attempt])
except Exception as e:
logError(f"{service_name} 第{attempt+1}次重试失败: {str(e)}")
return False
3. 资源监控集成
# 集成系统资源监控
def resourceAwareMonitor():
# 获取系统负载
load_avg = os.getloadavg()[0]
mem_info = psutil.virtual_memory()
# 根据系统负载调整监控策略
if load_avg > 5.0 or mem_info.percent > 90:
# 高负载时减少监控频率
time.sleep(30)
else:
# 正常负载标准监控
time.sleep(5)
故障排查指南
常见问题及解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| PHP频繁重启 | 配置错误 | 检查php.ini配置 |
| 监控线程阻塞 | 资源不足 | 调整监控间隔 |
| 任务队列积压 | 任务超时 | 优化任务执行时间 |
| 服务启动失败 | 端口冲突 | 检查端口占用情况 |
诊断命令参考
# 查看监控线程状态
ps aux | grep panel_task.py
# 检查PHP-FPM状态
systemctl status php74 # 根据版本调整
# 查看监控日志
tail -f /www/server/mdserver-web/logs/panel.log
# 检查任务队列
mysql -e "SELECT * FROM mw_tasks WHERE status != 1"
总结
mdserver-web的服务监控系统体现了以下设计理念:
- 分层监控:从进程级到服务级的多层次监控
- 智能恢复:基于异常类型的自适应恢复策略
- 资源感知:根据系统负载动态调整监控强度
- 日志驱动:完整的监控日志体系便于问题排查
- 配置灵活:支持动态启用/禁用各项监控功能
通过深入了解mdserver-web的监控机制,管理员可以更好地维护系统稳定性,及时发现问题并快速响应,确保Web服务的持续可用性。
提示:定期检查监控日志,根据业务特点调整监控参数,可以达到最佳监控效果。
【免费下载链接】mdserver-web Simple Linux Panel 项目地址: https://gitcode.com/GitHub_Trending/md/mdserver-web
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



