视频服务器重启之后配置参数自动改动,在监控机房或者直播业务场景属于比较严重的故障。码率、分辨率、推流地址提前调好,重启之前业务正常,重启之后推流失败或者画面清晰度暴跌,查看系统日志也找不到明显报错。根源在于很多视频服务器采用无状态设计,配置只保存在内存,不会持久写入磁盘。重启清空内存,服务器恢复默认参数,之前手动修改的配置全部丢失。
这不算是程序bug,部分项目本身就采用这套设计。ZLMediaKit就是典型,流代理任务配置全部存放内存,进程终止任务配置直接消失。官方设计思路是保证核心程序简洁高效,持久化交由上层业务处理。这个设计理念本身没问题,但实际部署时,只在服务端修改配置,业务系统没有自动重建任务的逻辑,每次重启都要手动重新配置。

另一类配置重置问题,来自运行环境变量。Jellyfin就经常出现这类故障,用户修改/etc/jellyfin/encoding.xml内ffmpeg路径,重启服务配置又变回原值。原因是Jellyfin启动脚本依靠JELLYFIN_FFMPEG_OPT环境变量硬指定ffmpeg路径为/usr/lib/jellyfin-ffmpeg/ffmpeg,服务启动优先读取环境变量,覆盖配置文件修改内容。配置文件改动虽然保存成功,程序启动优先读取环境变量,文件内参数直接失效。这类问题单纯查看配置文件很难定位,需要翻阅启动脚本或者systemd单元文件。
硬件层面故障排查难度更高,但也时有发生。海康威视部分摄像头重启后网络配置恢复出厂,IP重置为192.168.1.64,RTSP端口变回554,新增管理员账号也直接清除。排查发现设备NAND Flash存储分区存在坏块,执行cat /proc/mtd能够看到config分区Flash写入错误,擦除分区返回I/O报错,代表存储介质物理损坏。这种场景下保存配置无法写入闪存,重启读取不到修改后的参数。同批次设备部分固件版本存在缺陷,V5.5.82版本摄像头该问题尤为突出。
排查这类故障,第一步确认配置文件加载来源。ZLMediaKit启动日志会打印Load config from: /path/to/config.ini,通过这条日志确认读取配置文件路径。修改/usr/local/ZLMediaKit/config.ini,日志却加载容器内置默认配置,故障点就找到了。启动命令显式指定--config=/path/to/config.ini,避免程序读取配置路径混乱。
第二步校验配置文件语法与层级。ZLMediaKit的config.ini内嵌JSON结构,端口参数必须放在对应层级。httpPort写在根节点不会生效,需要写成"http": {"port": 8080}。括号缺失、多余逗号,JSON片段会静默失效,程序回退硬编码默认值,日志也不会抛出报错。Docker部署额外确认挂载是否生效,docker exec进入容器cat配置文件,对比宿主机修改内容和容器读取文件是否一致。
配置文件本身没问题、加载路径无误,接着检查启动流程是否存在参数覆盖。打开systemd单元文件,查看ExecStart行附带的命令行参数。命令行参数优先级高于配置文件,启动参数写死数值,修改配置文件不会生效。环境变量优先级同样高于配置文件,Jellyfin案例就是环境变量覆盖配置。这两种场景要修改启动入口,不能仅仅改动配置文件。
硬件设备配置重置,不要直接判定固件故障。设备工具扫描,读取存储相关错误日志。海康设备使用SADP工具扫描,telnet后台查看/proc/mtd分区状态。config分区出现坏块、I/O错误,软件层面无法修复,设备需要维修或者更换。如果是固件版本缺陷,查询厂商是否发布修复版本升级固件。
有一些部署方案可以规避这类故障。ZLMediaKit这类无状态服务,不要依赖服务本身保存流代理任务。业务系统维护任务清单,监听服务启动事件,检测服务就绪之后调用API自动重建任务。这套方案不用修改源码增加持久化,后续升级也不受影响。Jellyfin这类配置同时存放在文件和启动参数的程序,修改配置两处同步调整,或者直接修改启动脚本环境变量,防止后续重启被覆盖。
多人运维场景,同步修改配置也会引发异常。多个运维人员同时编辑配置,前一次写入操作未完成继续写入,配置文件校验和和实际数据不匹配,重启之后校验失败恢复默认。这类故障不算高频,团队人员直接在线编辑服务器文件,不走配置管理流程,出现概率会上升。