十分钟完成 ZLMediaKit Windows 服务部署:开机自启与故障恢复配置
【免费下载链接】ZLMediaKitWebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT/STUN/TURN server and client framework based on C++11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit
本手册指导你将 ZLMediaKit 部署为 Windows 服务,实现开机自启与故障自动恢复,适用于服务器无人值守运行场景。按顺序执行即可,全程约十分钟。
一、部署前确认
执行以下清单,确认环境与依赖就绪:
- 已安装 Visual Studio(勾选 C++ 桌面开发工作负载)与 CMake,可在命令行执行
cmake --version - Windows 下网络层依赖 wepoll(epoll 兼容实现),随 CMake 构建自动集成,无需单独安装
- 源码获取,执行:
git clone https://gitcode.com/GitHub_Trending/zl/ZLMediaKit构建成功后,确认 conf/ 目录下config.ini的三项内容:日志级别由启动参数-level控制(服务模式下建议设为 info);日志输出目录由-log-dir指定,服务模式下必须指向可写路径,否则日志丢失;端口绑定以config.ini中[rtmp]的 1935、[rtsp]的 554、[http]的 80 为准,确认未被本机其他程序占用。
[rtmp] port=1935 [rtsp] port=554二、服务化落地三步
第 1 步:服务包装程序
由于 MediaServer 本身不是服务程序,需要一个薄的服务包装层。它的职责用四点概括:
- 注册服务主函数,向 SCM(服务控制管理器)汇报服务状态
- 安装服务控制处理器,响应停止、暂停、继续指令
- 以服务子进程方式拉起 MediaServer,并传递
-level、-log-dir等参数 - 监控子进程存活,子进程退出时上报失败状态,交由故障恢复机制处理
第 2 步:注册服务与开机自启
以管理员身份打开命令提示符,执行注册命令:
sc create ZLMediaKitService binPath="D:\zlm\zlmediakit_service.exe" start=auto :: binPath= 包装程序完整路径(含依赖 dll 所在目录);start=auto= 开机自动启动参数含义:binPath指向服务包装程序,MediaServer 与 dll 需与其位于同一目录或已配置环境变量;start=auto将服务设为自动启动,系统登录后无需人工干预。
第 3 步:故障恢复配置
执行以下命令设置进程异常退出后的自动重启策略:
sc failure ZLMediaKitService reset=86400 actions=restart/60000/restart/60000/restart/60000 :: reset=86400 失败计数 24 小时后清零;restart/60000 每次重试前等待 60 秒,共三次reset=86400表示 24 小时无失败则重置失败计数,避免长期运行后重试次数耗尽;三个restart/60000依次对应第 1 至第 3 次重启动作,间隔 60 秒,便于依赖端口和磁盘资源先恢复。
三、运维三件事
权限:服务默认以 LocalSystem 账户运行,权限过高且不利于审计。建议创建专用本地账户(如zlm_service),仅授予服务目录读写与日志目录写入权限,再执行sc qc ZLMediaKitService确认、必要时调整账户。
日志:
- 通过
-log-dir将日志固定到独立磁盘分区,避免与系统日志混写 - 利用内置日志轮转(
-log-slice控制文件数、-log-size控制单文件大小),按天分割便于历史查询 - 级别选择:生产环境用 info,排障时临时调至 debug,事后改回
资源:
- 为 MediaServer 进程设置内存使用上限(任务管理器 → 进程 → 设置内存上限),防止异常流累积撑爆内存
- CPU 优先级维持"常规"即可,线程数通过
-t参数按核数设置 - 带宽密集场景可配合系统 QoS 策略限制该进程的出站带宽
四、上线前检查清单
sc query ZLMediaKitService返回 STATE 为 RUNNING- 依次探测 80、554、1935 端口连通(
telnet 127.0.0.1 1935等) - 通过 HTTP-FLV 地址播放一路实际媒体流,画面与声音正常
- 事件查看器(eventvwr.msc)→ Windows 日志 → 系统,无该服务相关的红色错误
- 重启一次服务器,确认服务随开机自动拉起
- 手动结束 MediaServer 子进程,确认 60 秒内自动重启
五、排障速查
| 现象 | 常见原因 | 处理方式 |
|---|---|---|
| 服务创建成功但无法启动 | binPath路径错误、含空格未加引号 | 用sc qc ZLMediaKitService核对 binPath,重执行sc create前先用sc delete ZLMediaKitService清理 |
| 服务启动后立即停止 | 端口被占用(1935/554/80) | 执行netstat -ano查占用进程,修改config.ini端口后重启服务 |
| 启动报依赖缺失 | 运行时缺少 VC 运行库或 dll 与 exe 不在同目录 | 安装对应 Visual C++ 运行库;将依赖 dll 与 MediaServer 放同一目录 |
| 服务状态 Unknown 或 1053 超时 | 包装程序未在规定时间内调用服务汇报 | 检查包装程序控制台日志,确认服务主函数已注册且子进程拉起逻辑未卡死 |
配置路径错误是最常见的一类问题:MediaServer 默认加载的是可执行文件同目录下的config.ini,修改 conf/ 中的范例文件不会生效,请以-c参数显式指定或修改目标目录中的实际文件。
结尾
至此,注册、开机自启、故障恢复与日常运维四部分均已落地,ZLMediaKit 可作为无人值守的长期服务运行。后续可持续关注官方对 Windows 服务的原生支持进展,逐步减少包装层维护成本。
【免费下载链接】ZLMediaKitWebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT/STUN/TURN server and client framework based on C++11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考