从零到精通:Linux RTP 服务器搭建完整指南(附Nginx-RTMP与SRS详细对比)
** 本文面向需要搭建稳定、高效RTP服务器的开发者、运维工程师和流媒体爱好者,我们将从RTP协议基础讲起,手把手教你在Linux环境下(以CentOS 7为例)搭建两种主流的RTP服务器方案:基于Nginx的Nginx-RTMP模块和专业的SRS(Simple RTMP Server),文章包含详细的步骤、命令、配置解析、常见问题(Q&A)以及性能优化建议,助你轻松掌握Linux RTP服务器搭建的核心技能。

为什么选择在Linux上搭建RTP服务器?
在开始之前,我们首先要明确一个问题:为什么RTP服务器首选Linux?
- 稳定性与可靠性: Linux以其卓越的稳定性和强大的内核著称,能够7x24小时不间断地处理高并发流媒体数据,这对于直播、视频会议等关键应用至关重要。
- 高性能: Linux系统资源占用低,I/O处理能力强,配合其强大的网络协议栈,能够实现极低延迟和高吞吐量的流媒体传输。
- 开源与免费: 大多数优秀的流媒体服务器软件(如Nginx, SRS)都是开源免费的,极大地降低了部署成本。
- 灵活性与可定制性: 开源意味着你可以根据业务需求,深入源码进行定制和优化,这是商业闭源软件无法比拟的。
核心概念扫盲:RTP、RTMP与RTSP
在搭建服务器前,必须分清这几个易混淆的概念,它们是实现流媒体传输的基石。
- RTP (Real-time Transport Protocol): 实时传输协议,它本身不保证传输的可靠性,而是侧重于数据的实时性,RTP通常运行在UDP之上,为如音频、视频等实时数据提供端到端的传输服务。它是我们最终目标(拉取/推送流数据)的承载协议。
- RTMP (Real-Time Messaging Protocol): 实时消息协议,由Adobe开发,最初用于Flash播放器和服务器之间的通信,它基于TCP,具有低延迟(通常在1-3秒)的特点,是目前主流的推流协议,直播软件(如OBS)通过RTMP将视频流推送到服务器。
- RTSP (Real Time Streaming Protocol): 实时流协议,主要用于控制流媒体服务器,如播放、暂停、快进等,它本身不传输数据,而是像“遥控器”一样,告诉服务器如何通过RTP(或RTP-over-TCP)来传输数据。
简单理解:
- OBS (推流端) 使用 RTMP 协议把流推送到 Nginx/SRS服务器。
- 服务器 接收到RTMP流后,进行转码、分发。
- VLC/播放器 (拉流端) 可以使用 RTSP 协议(服务器需开启)或 RTP 协议(通常用于WebRTC或专业播放器)来拉取观看。
方案一:使用Nginx-RTMP模块搭建RTP服务器
Nginx本身是一个高性能的HTTP和反向代理服务器,通过其第三方模块nginx-rtmp-module,它可以变身成为一个功能强大的RTMP/HLS/DASH服务器。

第1步:环境准备
-
安装依赖:
# 安装编译所需的工具和库 yum groupinstall "Development Tools" -y yum install wget git openssl-devel pcre-devel zlib-devel -y
-
安装Nginx和RTMP模块: 我们从源码编译,确保包含RTMP模块。
# 下载Nginx源码 wget http://nginx.org/download/nginx-1.18.0.tar.gz tar -zxvf nginx-1.18.0.tar.gz # 下载nginx-rtmp-module模块 git clone https://github.com/arut/nginx-rtmp-module.git # 进入nginx源码目录 cd nginx-1.18.0 # 配置编译选项,指定RTMP模块路径 ./configure --add-module=../nginx-rtmp-module --with-http_ssl_module --with-http_v2_module --with-http_stub_status_module # 编译并安装 make && make install
安装完成后,Nginx默认路径为
/usr/local/nginx。
第2步:配置Nginx-RTMP服务器
编辑Nginx主配置文件/usr/local/nginx/conf/nginx.conf,在文件末尾添加RTMP配置块(注意不要覆盖HTTP配置)。

# 在 http { ... } 块之外添加
rtmp {
server {
listen 1935; # RTMP推流端口
chunk_size 4096;
application live {
live on; # 开启直播
record off; # 不录制流
allow play all; # 允许所有人拉流
# 将RTMP流转码为HLS,并输出到指定目录
# hls on;
# hls_path /usr/local/nginx/html/hls;
# hls_fragment 3s;
}
}
}
# http 块用于提供Web服务和HLS/DASH播放
http {
server {
listen 80;
server_name localhost;
location /hls {
# HLS流媒体文件根目录
types {
application/vnd.apple.mpegurl m3u8;
video/mp2t ts;
}
root /usr/local/nginx/html;
add_header Cache-Control no-cache;
add_header 'Access-Control-Allow-Origin' '*' always;
}
}
}
配置解析:
listen 1935;:定义RTMP服务监听的端口,这是OBS等推流软件需要填写的地址。application live:定义一个“应用”,推流时在URL中指定此应用名。live on;:开启直播模式。allow play all;:允许任何人拉取此应用下的流。hls on;:可选,开启HLS(HTTP Live Streaming)功能,用于适配iOS和Web浏览器。
第3步:启动服务与测试
-
启动Nginx:
/usr/local/nginx/sbin/nginx
-
测试推流:
- 推流地址:
rtmp://你的服务器IP:1935/live - 串流密钥:
testkey(推流时填入任意密钥即可,服务器不校验) - 使用OBS Studio,设置 -> 直播 -> 服务选择“自定义”,服务器和串流密钥填入上述地址。
- 推流地址:
-
测试拉流:
- VLC播放器: “媒体” -> “打开网络串流”,输入
rtmp://你的服务器IP:1935/live/testkey。 - 网页播放(如果配置了HLS): 访问
http://你的服务器IP/hls/testkey.m3u8。
- VLC播放器: “媒体” -> “打开网络串流”,输入
方案二:使用SRS(Simple RTMP Server)搭建专业RTP服务器
SRS是一个开源的、功能更专业的RTMP/HLS/WebRTC服务器,其架构清晰,性能优越,尤其在转码、集群方面有很好的支持。
第1步:下载与安装SRS
SRS提供了预编译的二进制包,安装非常简单。
# 下载SRS最新版本(请替换为实际版本号) wget https://github.com/ossrs/srs/releases/download/v5.0/srs-5.0.tar.gz tar -zxvf srs-5.0.tar.gz cd srs-5.0 # 启动SRS服务器(默认在8080端口提供HTTP服务,1935端口提供RTMP服务) ./objs/srs -c conf/nginx.conf
SRS的配置文件在conf/nginx.conf,默认配置已经可以满足基本推拉流需求。
第2步:配置SRS
SRS的配置同样强大,以conf/nginx.conf为例,我们可以配置HTTP回调、转码、集群等高级功能,对于基础RTP服务器,默认配置足够。
# conf/nginx.conf 片段
listen 1935;
# ... 其他配置
vhost __defaultVhost__ {
# ... 默认虚拟主机配置
# 启用HLS
hls on;
hls_path ./objs/nginx/html;
hls_fragment 3s;
hls_mpegts_max_cache 1000;
# 启用WebRTC(用于RTP/UDP传输)
rtc on;
rtc_server {
listen 8000;
# ...
}
}
配置解析:
rtc on;:这是SRS实现RTP功能的关键,开启WebRTC服务后,SRS可以将RTMP流转码为WebRTC流,而WebRTC底层使用RTP/UDP进行传输,实现了低延迟的RTP分发。listen 8000;:WebRTC服务的监听端口。
第3步:启动服务与测试
-
启动SRS:
# 后台启动 nohup ./objs/srs -c conf/nginx.conf > srs.log 2>&1 &
-
测试推流:
- 推流地址:
rtmp://你的服务器IP:1935/live - 串流密钥:
livestream - 与Nginx-RTMP方案相同,在OBS中配置。
- 推流地址:
-
测试拉流:
- RTMP拉流:
rtmp://你的服务器IP:1935/live/livestream - HLS拉流:
http://你的服务器IP:8080/live/livestream.flv(SRS默认HTTP端口是8080,HLS文件在./objs/nginx/html下) - WebRTC拉流: 需要使用支持WebRTC的SDK或在浏览器中通过SRS提供的信令服务器进行连接,这比RTMP/HLS复杂,但延迟可低至300ms以内。
- RTMP拉流:
Nginx-RTMP vs. SRS:如何选择?
| 特性 | Nginx-RTMP | SRS |
|---|---|---|
| 易用性 | 较高,依赖Nginx生态,配置需与HTTP区分 | 简单,独立二进制,配置文件专注流媒体 |
| 功能 | 基础RTMP/HLS/DASH | 全面,RTMP/HLS/WebRTC/DASH/SRT,支持级联、转码、录像 |
| 性能 | 高,适合中小型规模 | 极高,针对高并发和低延迟优化 |
| 扩展性 | 依赖Nginx模块生态 | 开源,可定制,支持集群和CDN级联 |
| 社区 | Nginx社区强大,RTMP模块维护活跃 | SRS社区专注,文档和案例丰富 |
| 适用场景 | 个人项目、中小型网站、对WebRTC需求不高的场景 | 专业直播、低延迟互动、企业级应用、需要复杂转码或集群的场景 |
决策建议:
- 如果你只是想快速搭建一个简单的RTMP服务器,用于个人直播或小型活动,Nginx-RTMP足够用。
- 如果你追求极致的性能、低延迟(特别是WebRTC)、需要转码、录像或未来有集群扩展需求,SRS是更专业、更强大的选择。
常见问题与解决方案 (FAQ)
Q1: Connection timed out 或 Unable to connect 推流失败?
- A: 检查服务器防火墙是否开放了端口(如1935, 8080)。
# 永久开放1935端口 firewall-cmd --permanent --add-port=1935/tcp firewall-cmd --reload
检查云服务器安全组(如阿里云ECS、腾讯云CVM)是否也放行了该端口。
Q2: 拉流卡顿、延迟高怎么办?
- A:
- 网络带宽: 确保服务器带宽足够承载码率。
- CPU/内存: 检查服务器资源是否耗尽,
top命令查看。 - 编码设置: 在OBS中适当降低码率或分辨率。
- 使用硬件编码: 如果CPU是瓶颈,在OBS中开启硬件编码(如NVIDIA NVENC, Intel Quick Sync)。
- 选择更优协议: 对低延迟要求高,考虑使用SRS的WebRTC方案。
Q3: 如何实现录制功能?
- A (Nginx-RTMP): 在
application live块中添加record all;和record_path /path/to/recordings;。 - A (SRS): 在虚拟主机配置中添加
record on;和record_path ./objs/nginx/rec;。
Q4: 如何保护我的直播流,防止被恶意盗链?
- A: 可以使用动态密钥或防盗链token,SRS支持HTTP回调,可以在推流时向你的业务服务器请求一个动态token,服务器验证通过后才允许推流,Nginx-rtmp模块可以通过
on_publish指令实现类似功能。
总结与展望
本文详细介绍了在Linux环境下搭建RTP服务器的两种主流方案:Nginx-RTMP和SRS,从环境准备到配置部署,再到测试和问题排查,为你提供了从零到一的完整路径。
选择合适的方案,并根据实际业务需求进行配置和优化,是构建稳定、高效流媒体服务的关键,随着WebRTC、SRT等新协议的普及,Linux流媒体服务器将承载更多实时互动应用,掌握这些技术将让你在音视频领域更具竞争力。
希望这篇指南能对你有所帮助,如果在搭建过程中遇到任何问题,欢迎在评论区留言交流!
