MediaMTX 上云部署指南:从单个 Docker 到多可用区,先拍板三个决策

发布时间:2026/9/8 18:19:47
MediaMTX 上云部署指南:从单个 Docker 到多可用区,先拍板三个决策 MediaMTX 上云部署指南从单个 Docker 到多可用区先拍板三个决策【免费下载链接】mediamtxReady-to-use Media-over-QUIC / SRT / WebRTC / RTSP / RTMP / LL-HLS / MPEG-TS / RTP live media server and media proxy that allows to read, publish, proxy, record and playback real-time video and audio streams.项目地址: https://gitcode.com/GitHub_Trending/me/mediamtx周五晚九点直播并发一涌进来跑着媒体服务的那台单节点 ECS 直接被打满 CPU读者端开始大面积卡顿。这类场景的解法通常是把服务搬上公有云。而把一台媒体服务器搬到公有云上跑媒体流真正麻烦的不是安装而是动手前的几个决策。MediaMTX 是一个单进程同时覆盖 SRT、WebRTC、RTSP、RTMP、LL-HLS 的流媒体服务器支持发布、转发、录制和回放云部署本身不复杂但下面这三件事想清楚了能少走很多弯路。动手前先拍板的三件事镜像怎么挑仓库里的 standard.Dockerfile 基于scratch构建按TARGETPLATFORM自动选 amd64 / arm64 / armv7 二进制。公有云上 ECS 基本是 x86 或 arm64倚天、Graviton这个镜像都覆盖需要转码能力才看 ffmpeg.Dockerfile树莓派那版用不上。配置怎么注入MediaMTX 支持三种方式混合使用最省心对比如下。方式适用场景注意点配置文件完整基线配置路径正则、source 这类复杂字段建议只放文件里环境变量少量覆盖命名规则是MTX_前缀加大写字段名如MTX_APIControl API运行时改路径/限流改的是内存态重启后丢失需配合 API 文档端口怎么开这是云上最容易被忽略的一点。核心监听RTSP 8554/tcp、RTSPS 8322/tcp、RTP 8000–8007/udp、RTMP 1935/tcp、HLS 8888/tcp、WebRTC 8889/tcp、ICE 8189/udp、SRT 8890/udp、API 9997/tcp、Metrics 9998/tcp。安全组按实际启用的协议最小化放行UDP 段一定要单独放漏了 UDP 的症状就是TCP 握手成功但画面卡死。用 Docker Compose 跑通最小部署先上单节点K8s 的事后面再说。下面这个版本我认为是能跑通的最短形态services: mediamtx: image: mediamtx:latest # WebRTC/SRT/RTSP 大量走 UDPbridge 网络 NAT 容易把 ICE 搞挂用 host 网络最稳 network_mode: host environment: # 只把少量开关放环境变量完整字段清单见仓库 mediamtx.yml - MTX_APIyes # 开 Control API健康检查和动态路径都靠它 volumes: # 拉流地址、path 这类复杂配置放文件里环境变量写不干净 - ./mediamtx.yml:/mediamtx.yml restart: always几个字段的理由network_mode: host是因为媒体 UDP 对 NAT 很敏感而且省一层端口映射host 模式下端口直接暴露在主机的 8554/8888/8189 等安全组照上面的清单放行即可MTX_APIyes是后面健康检查和运维操作的入口。验证方式很简单起一个容器用 ffmpeg 往rtsp://ECS公网IP:8554/test推一路再从 HLS 地址http://公网IP:8888/test/index.m3u8读回来能看就说明链路通了。如果你要上 K8s思路是 Deployment headless Service 或 StatefulSet 按 path 固定实例这一节不展开直接看后面。生产加固的三个层次多副本怎么摆⚠️ 先泼冷水MediaMTX 的路径是有状态的一条 path 只有一个 publisher挂在某个实例上所以多副本不是简单的负载均衡。正确的摆法是按 path 切分每路流固定路由到某个副本客户端侧按 path 做一致性哈希或 DNS 分流不同前缀。K8s 上再加一条topologySpreadConstraints把副本摊到不同可用区单 AZ 挂掉时其余副本还能服务各自的路径。指标和健康检查怎么接mediamtx.yml里把metrics: yes、metricsAddress: :9998打开Prometheus 直接抓:9998/metrics。真实存在的指标是paths活跃路径数、paths_readers按路径的读者数、paths_inbound_bytes/paths_outbound_bytes出入流量注意它没有mtx_前缀那种旧指标名。健康检查打 Control API 的:9997/v3/info即可K8s 里配httpGet探针日志走logDestinations: [stdout]交给平台采集比写本地文件省得自己管轮转。证书和认证怎么挂三件事就够一是给对外协议开加密webrtcEncryption、hlsEncryption低延迟 HLS 在苹果设备上必须走 HTTPS、rtspEncryption都设为optional或strict二是认证别用默认空密码简单场景在authInternalUsers里给publish动作绑一个ips白名单只放行推流机所在网段三是对接企业身份体系就配authJWTJWKS客户端把 JWT 当密码传权限写进mediamtx_permissionsclaim省掉自己维护账号表。演进路线和四个最常踩的坑三步走验证单节点跑通推读回路打开 API 和 Metrics接上 Prometheus。高可用两副本起、跨 AZ 打散、协议全量 TLS、按 path 路由固定。弹性副本按 path 数量扩拉流型路径开sourceOnDemand: yes配sourceOnDemandCloseAfter没读者时自动断上游省带宽比扩容更划算。Q/A 部分Q镜像是 scratch 基底、连 shell 都没有Docker 的 healthcheck 怎么写A标准镜像里跑不了curl所以 Docker 场景要么用 sidecar 容器探测要么接受靠平台层面监控K8s 的httpGet探针不依赖容器内命令是更省事的方案。Q端口全开了浏览器 WebRTC 还是连不上A多半是webrtcIPsFromInterfaces默认把 ECS 的私网 IP 发给了客户端。云上必须把公网 IP 或域名填进webrtcAdditionalHosts这个坑我踩过一次。Q多副本下读者会连到和 publisher 同一个副本吗A不会自动发生。同一路流只存在于一个实例上必须按 path 切分流量或者用source: redirect让副本间做源重定向。Q怎么防止一路热门流吃光整机资源ApathDefaults里设maxReaders给单路流限并发再配合指标里的paths_readers做告警超了扩副本而不是升配单机。完整的字段说明和默认值都在 docs/5-references/1-configuration-file.md遇到坑欢迎提 issue 一起讨论。【免费下载链接】mediamtxReady-to-use Media-over-QUIC / SRT / WebRTC / RTSP / RTMP / LL-HLS / MPEG-TS / RTP live media server and media proxy that allows to read, publish, proxy, record and playback real-time video and audio streams.项目地址: https://gitcode.com/GitHub_Trending/me/mediamtx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考