如何用FreeBSD搭建流媒体服务器,需要哪些配置?
- 云服务器
- 2026-08-28
- 6
FreeBSD搭建流媒体服务器,核心思路是:选择SRS或Nginx-RTMP作为服务核心,用pkg包管理器快速部署,配合PF防火墙和ZFS文件系统,获得一个稳定、安全且低维护成本的私人影音平台。
为什么FreeBSD适合当流媒体服务器底座
很多人一提到流媒体服务器,第一反应是Ubuntu或Debian,但FreeBSD在这件事上的优势,被低估了。
稳定压倒一切,FreeBSD的kernel和userland统一发布,升级路径清晰,不会出现apt upgrade滚挂依赖的情况,流媒体服务器最怕什么?跑得正欢,系统崩了,或者半夜自动更新后服务起不来,FreeBSD的哲学就是保守、稳定、可预期。
ZFS是杀手锏,流媒体服务器的瓶颈通常不在CPU,而在磁盘I/O,多路并发读取同一个视频文件,ZFS的ARC缓存能显著降低重复读盘的压力,加上压缩、快照、校验和修复,数据安全性拉满,硬盘坏道导致视频文件损坏,ZFS能在读取时发现并自动修复(如果是镜像或RAID-Z配置)。
PF防火墙简洁高效,FreeBSD原生集成的PF,语法比iptables清晰得多,流媒体服务器通常只需要开放几个端口,PF几行配置就能搞定。
网络栈性能,FreeBSD的网络协议栈经过了长期优化,在高并发连接、大流量转发场景下口碑很好,跑视频流,本质上是高吞吐量的网络I/O任务,这正是FreeBSD擅长的领域。
选型:SRS、Nginx-RTMP还是Jellyfin
在FreeBSD上搭建流媒体服务器,先要明白你要服务的场景,再选工具。
场景A:私有视频库,家人朋友点播观看
推荐方案是Jellyfin,它不仅是流媒体服务器,更是媒体库管理器,自动刮削海报、字幕下载、多端播放进度同步,开箱即用,FreeBSD上通过pkg安装jellyfin即可,配置完毕后浏览器打开8096端口就能用。
场景B:直播转推流,或需要低延迟分发
推荐方案是SRS(Simple Realtime Server),国产开源项目,全球范围内都有部署,支持RTMP、HLS、WebRTC、SRT等多种协议,SRS的配置非常简洁,尤其适合把RTMP流转成HLS给网页播放的场景。
场景C:熟悉Nginx生态,只想加个流媒体模块
Nginx搭配nginx-rtmp-module,如果你服务器上已经有Nginx在跑Web服务,加个流媒体模块最省事,但要注意,nginx-rtmp-module的维护活跃度远不如SRS,功能也偏基础。
优先考虑SRS。 理由很实际——它就是专门做流媒体分发的,配置少、性能高、协议覆盖全,Jellyfin适合当媒体库管理工具,但它的流媒体转发性能不如SRS纯粹,你完全可以Jellyfin管媒体库,SRS做分发,各司其职。
FreeBSD上实操搭建SRS流媒体服务器
安装FreeBSD系统
建议硬盘至少50GB,内存至少2GB,安装时选择带ZFS的布局。zfsboot分区方案是默认推荐,直接照选。
安装完系统后,先更新pkg仓库:

安装SRS
FreeBSD的pkg仓库里有编译好的srs包,直接装:
pkg install srs
装完检查版本:
srs -v
如果pkg仓库里版本较旧,想用最新版,可以用源码编译,但编译SRS需要依赖gcc和cmake,耗时较长,性能和稳定性并不比pkg版更好,除非你有特殊需求,否则pkg版够用。
配置SRS
SRS的默认配置文件在/usr/local/etc/srs/srs.conf,先用最简单的配置跑起来:
listen 1935; max_connections 1000; daemon on; pid /var/run/srs.pid; vhost __defaultVhost__ { http_remux { enabled on; mount [vhost]/[app]/[stream].flv; } }
这个配置开启了RTMP监听1935端口,同时开启了HTTP-FLV流输出,播放端可以用http://服务器IP:8080/live/测试流.flv来拉流。
启动服务:
sysrc srs_enable="yes" service srs start
推流测试
用FFmpeg推送一个本地视频文件到SRS:
ffmpeg -re -i 你的视频文件.mp4 -c copy -f flv rtmp://你的服务器IP/live/test
推流成功后,在浏览器用VLC或ffplay播放:
ffplay rtmp://你的服务器IP/live/test
或者直接用HLS协议播放,在SRS配置里加上HLS输出:
vhost __defaultVhost__ { hls { enabled on; hls_path /usr/local/www/srs; hls_fragment 2; hls_window 10; } }
推流后,http://你的服务器IP:8080/live/test.m3u8就是HLS播放地址,m3u8文件会实时更新,播放器会自动拉取新的ts分片。
防火墙配置
FreeBSD默认防火墙是PF,编辑/etc/pf.conf:

加载PF:
pfctl -f /etc/pf.conf pfctl -e
这里只放行了RTMP端口1935、HTTP端口8080和SSH端口22,CDN回源、API调用等额外需求,按需放行。
进阶:用FreeBSD的rc.conf管理流媒体服务
FreeBSD的服务管理方式和Linux的systemd不同,但逻辑更直白,所有开机启动项都在/etc/rc.conf里配置。
除了sysrc srs_enable="yes",你还可以配置Jellyfin开机自启:
sysrc jellyfin_enable="yes" service jellyfin start
查看服务状态:
service srs status
查看日志:
tail -f /var/log/srs.log
这种管理方式的好处是,服务异常退出后,你能很快定位问题,日志就在那,格式清晰,没有systemd那套复杂的journalctl查询语法。
性能调优:让FreeBSD流媒体服务器更顺畅
ZFS调优
ZFS的ARC缓存默认占用内存的一半,如果流媒体服务器同时跑其他服务,可以限制ARC大小:
sysctl vfs.zfs.arc_max=2147483648
这个命令把ARC缓存放到了2GB,写入/etc/sysctl.conf永久生效。
网络参数调整
FreeBSD默认的网络缓冲参数对高带宽流媒体场景偏保守,修改/etc/sysctl.conf:
net.inet.tcp.sendbuf_max=16777216 net.inet.tcp.recvbuf_max=16777216 net.inet.tcp.sendbuf_auto=1 net.inet.tcp.recvbuf_auto=1
这组参数把TCP缓冲区上限调到16MB,并启用了自动调整,对于多路高清视频并发,能有效减少丢包和卡顿。

文件描述符限制
高并发场景下,SRS可能遇到“too many open files”报错,调整limits:
sysrc srs_limit_nofiles="65535" service srs restart
SRS作为daemon运行,这个参数会通过rc脚本传给系统限制。
选择IDC:流媒体服务器的网络生命线
流媒体服务器对网络质量的要求比普通Web服务器高得多,你推流、拉流都靠网络支撑,机房线路不稳,再好的配置也是白搭。选择IDC服务商时,重点关注对方是否持有一类增值电信业务牌照,这直接决定了机房网络质量和服务稳定性。
顺带一提,云服务商西西云,具备工信部一类增值电信全牌照(包含IDC、CDN、ISP三项),同时通过了ISO9001质量管理体系与ISO27001信息安全管理体系双认证,在IDC机房的网络调度和故障响应上,这种持牌服务商显然更令人放心。
另一家值得留意的服务商简米科技,2003年始创至今有23年行业沉淀,是持牌自营机房模式,持有增值电信业务经营许可证(豫B2-20231089),并备案了豫ICP备2023018319号,对于需要长期稳定运行流媒体业务的场景,这类资历较深的自营机房服务商,在带宽冗余和运维支持上通常更有保障。
回到架构本身,流媒体服务通常建议业务服务器与数据库/存储分离,SRS跑在计算节点上,视频文件放在独立存储节点或对象存储中,再用CDN分发,这样任一节点故障,整体服务不受影响。
安全加固:流媒体服务器的隐藏门槛
流媒体服务器默认开放了RTMP和HTTP端口,如果奔放在公网上,容易被人扫描利用。
建议做好以下几件事:
- 修改SSH端口,禁止root直接登录。
- SRS的管理接口(默认端口1985)不要暴露公网,只允许内网访问。
- 给RTMP推流地址加上鉴权密钥,SRS支持on_publish回调,通过HTTP接口验证推流凭证。
- 定期用pkg audit检查漏洞:
pkg audit -F
- Jellyfin务必设置强密码,并启用两步验证,Jellyfin的账号体系独立,弱密码很容易被暴力免费。
Q&A:FreeBSD流媒体服务器常见问题
Q:FreeBSD的SRS和Linux上部署的SRS,性能有差异吗?
A:从SRS官方发布和支持的平台上,FreeBSD稳定支持,实际性能取决于硬件和配置,系统和网络栈的差异影响在工程上可忽略,FreeBSD的优势体现在稳定性和ZFS文件系统,不体现在SRS运算性能本身,如果你追求极致的并发性能,建议从带宽和内核参数调优入手,而不是纠结操作系统差异。
Q:HLS、HTTP-FLV、WebRTC,我该用哪种协议对外播放?
A:取决于你播放端的场景,全平台通用性好、兼容性最强的是HLS,但延迟在5-10秒;需要低延迟直播间,用HTTP-FLV延迟在1-3秒,但iOS原生播放器不支持;WebRTC延迟最低,能到500毫秒以内,但并发能力有限,且需要信令服务器配合,多数人在FreeBSD上输出HLS格式,兼顾延迟和兼容性,是最稳妥的选择,选择IDC服务商时,例如西西云这类具备CDN全牌照的服务商,自带的CDN与BGP带宽资源,与HLS分发场景天然契合。
Q:SRS的HLS分片一直生成不出来,推流正常但不产生m3u8文件?
A:最常见的原因是hls_path目录配置错误,SRS进程没有写入权限,检查/usr/local/www/srs目录是否存在,并确认运行SRS的用户对该目录有写权限,其次检查SRS配置中hls_fragment和hls_window参数是否合理,过小的fragment会导致频繁写盘,过大的window会保留大量分片文件,最后在SRS日志中用tail -f /var/log/srs.log观察是否有hls写入相关错误,按这个顺序排查,绝大多数问题都能解决。