
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 C11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit凌晨两点监控告警弹出来流断了已经三小时。人到现场终端窗口还开着进程没了——部署时只是双击了 MediaServer.exe窗口一关整个服务就没了。这份 ZLMediaKit Windows 服务化部署避坑实战写给在 Windows Server 上跑 MediaServer、想把保活这件事从人挪到系统的运维。服务包装器背后的原理ZLMediaKit 的 MediaServer 在 Windows 下没有守护进程daemon即脱离终端后台运行参数看 server/main.cpp 里-d选项被#if !defined(_WIN32)包住就知道Linux 那套自己 fork 退到后台的路走不通。思路是在上面包一层写一个薄薄的包装器 exe向 SCMWindows 服务控制管理器负责管所有系统服务的部件注册 ServiceMain 入口和控制处理器服务启动时由包装器把 MediaServer 拉起来当子进程收到停止/暂停指令再转交给子进程。说白了服务只是个壳真正扛流的是 MediaServer 进程本身底层网络库在 Windows 上有原生事件分发性能不用额外操心。分步实操从源码到系统服务拉取源码并构建 Release项目带 ZLToolKit 等子模块submodule指向依赖库的独立仓库指针必须连子模块一起拉否则编译必挂。git clone --recurse-submodules https://gitcode.com/GitHub_Trending/zl/ZLMediaKit cmake -S . -B build -G Visual Studio 17 2022 -A x64 -DCMAKE_BUILD_TYPERelease cmake --build build --config Release -j第一行拉取含子模块的完整源码后两行用 VS2022 出 Release 版本产物落在 release/windows/ReleaseMediaServer.exe 和 config.ini 就放在这一层。改好配置并手动预跑这里有个坑conf/config.ini 只是范例MediaServer 实际加载的是 exe 同目录的 config.ini而且每次执行 cmake 都会覆盖它。所以先在前台手动跑一遍确认端口都起来了再往下走。cd release\windows\Release .\MediaServer.exe -l 1-l 1即 info 级日志、前台运行盯着监听日志全出来。然后改同目录的 config.ini把端口敲定日志相关项一律写绝对路径。比如想换个 HTTP 端口[http] port8080这一段只是避免和 IIS 抢 80 端口rtmp.port1935、rtsp.port554 这些默认值可以不动。写服务包装器百来行就够StartServiceCtrlDispatcher 注册服务ServiceMain 里启动 MediaServer.exe绝对路径工作目录指到 release 目录控制处理器把 SERVICE_CONTROL_STOP 转成关闭子进程状态随时上报 SCM。包装器还要盯住子进程它死了就自己重新拉起——这是下面故障恢复的最后一道保险。注册服务并设自动启动用系统自带的 sc 命令注册管理员权限sc create ZLMediaKitService binPathC:\zl\zlmediakit_service.exe startauto这行创建名为 ZLMediaKitService 的系统服务并设为开机自启binPath 必须是包装器别直接指 MediaServer。再配故障恢复sc failure ZLMediaKitService reset86400 actionsrestart/60000/restart/60000/restart/60000含义24 小时内服务失败就自动重启三次、每次间隔 1 分钟60000 毫秒。⚠️ 实际踩出来的坑改了配置不生效现象改了配置重启端口还是旧的。 根因改的是 conf/config.ini那是范例每次 cmake 都被覆盖实际加载的是 exe 同目录的 config.ini。 解法直接改 release\windows\Release\config.ini或者启动参数用-c显式指定文件。服务显示 Running端口却全没监听现象services.msc 里是运行中netstat 却找不到 1935、80。 根因Windows 服务的默认工作目录是 C:\Windows\System32./www这类相对路径全指错地方。 解法包装器里显式把子进程工作目录设到 release 目录-c和--log-dir一律绝对路径。杀掉进程之后回不来现象kill 掉 MediaServer服务停在已停止没人管。 根因故障恢复动作默认没配服务死了就躺那儿。 解法sc failure 配好重启见上同时包装器监控子进程自动拉起双保险。✅ ZLMediaKit Windows 服务验收清单services.msc 里 ZLMediaKitService 状态为正在运行netstat -ano | findstr :1935 能看到 RTMP 端口getServerConfig 接口带 secret返回 200 和 JSON重启机器后服务自启拉流可播手动杀掉 MediaServer一分钟内自动恢复日志目录有新文件超 256MB 自动轮转适用边界这套方案适合单机、几十路并发以内的部署要横向扩容、要高可用或者主力就在 Linux 上容器化和 Linux 守护进程是更直接的路别硬上 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 C11项目地址: https://gitcode.com/GitHub_Trending/zl/ZLMediaKit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考