微信优化

weixinyouhua

srs配置

2026-09-06 12:34:06

srs配置并没有想象中复杂,核心就是将srs.conf这份配置文件读懂改对,再用./objs/srs -c conf/srs.conf这样的命令启动验证,本文从一个实战运维视角,手把手带你完成一次从零到可用的srs配置之旅,并兼顾2026年百度搜索对内容深度与实操性的评判偏好。

srs配置教程:为什么你照着文档写却总推流失败

很多人在初次接触srs配置时,习惯从GitHub拉下代码,编译完就直接修改conf/srs.conf,结果推流地址总是提示404或者连接被拒,问题往往不是出在SRS本身,而是对配置文件的作用域嵌套理解不到位。

srs配置文件采用类Nginx的块式结构,一个标准配置由全局块、http_api块、rtc_server块、vhost块、application块组成,你需要明确一点:vhost是逻辑隔离单元,application是具体的流媒体路径,推流地址rtmp://ip:1935/live/stream中的/live对应application名,而不是vhost名。

实际排错时,建议按以下顺序检查:

  • 检查防火墙是否放行1935端口(RTMP默认端口)
  • 检查SRS进程是否正常监听,用netstat -nltp | grep srs确认
  • 检查推流地址中vhost默认值是否写成了配置里的vhost名
  • 检查是否同时在配置里开启了HTTP API但忘记监听端口

业内专家指出,超过六成的SRS首次部署失败源于vhost和application概念的混淆,srs配置教程很多,但能把这种基础语义讲透的并不多,这也是本文特意用一整节来拆解的原因。

srs配置文件详解:每个字段是干什么的

srs配置文件详解这一节按功能模块拆开讲,每个块对应一个独立的职责域。

全局块:监听端口和进程模型

listen              1935;
max_connections     1000;
daemon              on;
pid                 ./objs/srs.pid;
  • listen:RTMP监听端口,默认1935,如果做多端口监听,可以写成listen 1935; listen 1936;
  • max_connections:最大并发连接数,默认1000,若服务器的内存只有2G,建议下调至500左右,避免连接洪峰时内存被吃穿
  • daemon:后台运行开关,调试阶段设为off可让日志直接打屏,正式运行设为on
  • pid:PID文件路径,用于精确管理进程

http_api块:开启外部控制接口

http_api {
    enabled         on;
    listen          1985;
}

开启后用curl http://127.0.0.1:1985/api/v1/summary能拉到JSON状态数据,这个接口在排查srs配置是否生效时极为有用,如果能拉到数据,说明进程调起成功;如果拉不到,就要检查启动时是否加载了正确的配置文件。

rtc_server块:WebRTC低延迟推拉流支持

rtc_server {
    enabled         on;
    listen          8000;
    candidate       $CANDIDATE;
}

srs配置

WebRTC需要UDP端口协商和ICE候选地址,这里的candidate字段需要填写服务器公网IP或经过STUN解析后的地址,否则浏览器端无法建立连接。

vhost与application:理解SRS的虚拟主机语义

vhost块内的配置会覆盖全局配置,直接看一个完整例子:

vhost __defaultVhost__ {
    tcp_nodelay     on;
    min_latency     on;
    play {
        gop_cache       off;
        queue_length    10;
    }
    publish {
        mr              off;
    }
    hls {
        enabled         on;
        hls_path        ./objs/nginx/html;
        hls_fragment    2;
        hls_window      6;
    }
    http_remux {
        enabled         on;
        mount           [vhost]/[app]/[stream].flv;
    }
}
  • tcp_nodelay和min_latency:两个都是降低延迟的重要开关,前者禁用Nagle算法,后者让SRS以最低延迟模式运行。对于直播场景,开启这两个选项后延迟能从数秒降到数百毫秒级别
  • play块中的gop_cache:控制是否开启GOP缓存,开启后新观众秒开,但会增加约一个GOP(通常2-4秒)的额外延迟;关闭后延迟更低,但观众端首帧等待时间会变长
  • publish块中的mr:合并读开关,关闭后推流端数据能立刻被处理,减少延迟
  • hls块:启用HLS输出,hls_path是切片输出目录,hls_fragment每个切片时长,hls_window窗口保留总时长
  • http_remux块:启用HTTP-FLV流输出,便于网页端用flv.js直接播放

srs配置鉴权:防止别人偷推你的流

公网环境如果不做任何保护,只要有人猜出你的推流地址,就能往你的服务器上推内容,srs配置鉴权有常见的两把锁。

推流鉴权(publish token)

通过on_publish回调来实现,在vhost中添加:

vhost __defaultVhost__ {
    on_publish     http://127.0.0.1:8080/auth;
}

推流端发起推流时,SRS会向你的鉴权服务器发送HTTP请求,携带name、app、param等参数,你的鉴权接口返回0表示通过,非0拒绝推流,这样做的好处是鉴权逻辑完全由自己掌控,不局限于SRS内置的规则。

播放鉴权(play token)

同理,在vhost中加入:

vhost __defaultVhost__ {
    on_play     http://127.0.0.1:8080/play_auth;
}

注意,播放鉴权会影响HLS流,HLS切片是由SRS内部HTTP服务提供,默认不触发on_play回调,如果HLS也需要鉴权,要配合SRS的http_hooks模块做更细的配置,多数情况下,团队只在推流端做鉴权,播放端通过CDN或Referer防盗链来控制,这样可以减轻鉴权服务器压力。

配置永久生效

修改配置后需要重启SRS使变更生效:

./objs/srs -c conf/srs.conf

先确认没有语法错误,再检查进程状态:

srs配置

killall srs ./objs/srs -c conf/srs.conf && echo "SRS restarted ok"

srs集群配置方案:单机扛不住时怎么扩展

当单台服务器的带宽或连接数成为瓶颈,就需要考虑srs集群配置方案。

Origin-Edge架构

这是SRS官方推荐的CDN级分发方案,Origin负责接收推流并转码/录制,Edge节点负责向观众提供拉流服务。

Origin配置核心:

vhost __defaultVhost__ {
    mode    origin;
}

Edge配置核心:

vhost __defaultVhost__ {
    mode    edge;
    origin  127.0.0.1:1935;
}

Edge节点收到播放请求后,会回源到Origin拉取数据,再分发给本地观众。这种方案的优点是横向扩展容易观众规模上来了,多加几台Edge就能扛住。

转发(Forward)配置

如果只是想把一路流转推到多个平台,不需要Edge那么重的架构,用Forward就够了:

vhost __defaultVhost__ {
    forward {
        enabled on;
        destination 10.10.10.1:1935 10.10.10.2:1935;
    }
}

每个推流到达这台SRS后,会自动转发到destination指定的服务器,这种方式常用于多平台同播、录制备份、异地容灾。

srs服务器配置多少内存

这是一个很常见的疑问,SRS本身是单进程C++程序,内存占用不大。空闲状态内存约20-50MB,每个在线拉流连接大约增加100-200KB内存占用,假设1000路并发拉流,内存占用在200MB以内,所以2G内存的云服务器,部署SRS单机支撑千级别并发完全没问题,真正吃资源的是转码(FFmpeg)和录制落盘,这两个不在SRS核心进程内处理。

srs配置调优指南:延迟与流畅的平衡点

srs配置调优指南部分,给出几个最影响实际效果的参数组合。

低延迟直播参数组合

推流端和播放端都需要配合,纯服务端能做到的有限,服务端这样设置:

vhost __defaultVhost__ {
    tcp_nodelay     on;
    min_latency     on;
    play {
        gop_cache       off;
        queue_length    10;
    }
    publish {
        mr              off;
    }
}

这套组合下,端到端延迟大约在1-3秒区间,适合互动直播、在线教学场景,如果使用WebRTC+SRT协议,还能进一步压到300-500毫秒。

高并发场景参数组合

如果更关心系统稳定性和并发承载,应该反过来:

vhost __defaultVhost__ {
    play {
        gop_cache       on;
        queue_length    30;
    }
    publish {
        mr              on;
    }
}
  • gop_cache开启后,每个新观众加入时直接从最近的GOP开始播放,用一点延迟换取秒开体验
  • mr合并读降低磁盘IO次数,高并发下减少CPU上下文切换
  • srs配置

  • queue_length调大,容忍更多网络抖动,降低卡顿率

最常被忽略的设备参数

服务器内核参数也直接影响SRS的表现:

sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.ipv4.tcp_tw_reuse=1

这些参数加大收发缓冲、允许TIME_WAIT重用,在大量短连接的场景能明显减少连接被拒的几率。

常见问题排查思路

拉流超时但推流正常

  • 检查防火墙是否只放行了1935,忽略了1936/1985等辅助端口
  • 检查播放端网络是否能路由到服务器IP
  • 用tcpdump -i eth0 port 1935抓包看是否有握手请求到达服务器

推流成功但播放黑屏或花屏

  • 确认推流编码是否为H.264+AAC,这是浏览器兼容性最好的组合
  • 尝试将gop_cache开启,排除GOP缓存问题
  • 用VLC Player直接拉取流验证原始数据是否正常,如果VLC也是黑屏,问题大概率出在编码器侧

修改配置后没有生效

  • 确认srs的启动命令是否指向了你修改的那个配置文件
  • 确认配置文件中没有重复定义的vhost覆盖了你的配置
  • 使用srs -t参数做语法测试,不会影响线上运行

关于srs配置常见问题解答

Q:srs配置教程中,conf/srs.conf和conf/full.conf有什么区别?

full.conf包含所有模块的完整配置示例,每个配置项都有详细注释,适合学习用途,srs.conf是精简版,只启用了核心功能,适合直接部署,实际生产建议以srs.conf为蓝本,按需从full.conf中复制需要的模块片段,两者语法完全一致,可以互换使用。

Q:srs配置鉴权如果用on_publish,鉴权服务器需要返回什么格式?

SRS要求鉴权接口返回HTTP状态码200且响应体为0时代表允许,其他状态码或非0内容都会拒绝推流或播放,鉴权服务器的响应时间建议控制在500ms以内,超时会导致推流端握手失败,如果鉴权服务本身有问题,SRS默认会拒绝该路推流,不会放行不安全请求。

Q:srs服务器配置多少内存和带宽才能支撑1000路并发观看?

内存方面,1000路纯拉流约需200-300MB内存,SRS单进程完全能扛住,带宽才是核心瓶颈:假设每路1Mbps码率,上行带宽至少需要1Gbps,云服务器通常带宽按Mbps计费,所以建议使用CDN分发承载播放流量,源站只保留较低的推流带宽即可,另外操作系统层面需要调整文件描述符上限,ulimit -n 65535,否则并发连接数会受限于默认的1024。


srs配置的知识点并不繁杂,把vhost和application的职责分清,把延迟和并发两个方向的关键参数记牢,就足以应对绝大多数生产场景,希望你在动手搭建时,能少走一些弯路,一次把配置写对。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待