基于 Nginx 搭建视频直播服务器
最近几年,网络视频直播处于蓬勃的发展期,各大直播平台的竞争也趋于白热化。在游戏直播领域,就有许多电子竞技的前职业选手,退役后转行游戏主播,收入不菲。当然,网络直播的用处不仅仅是娱乐行业,诸如实时视频监控等应用方向,同样潜力无限。如果没有太高的并发播放需求,完全可以自行搭建直播服务器。借助于 Nginx 和一些拓展模块,你就可以轻松地运行一个小型的直播平台。
笔者在参看了大量教程后,成功地在 VPS 上搭建了这样的视频直播服务器,而且在昨晚经过测试,能够正常地使用 OBS Studio 推流,在浏览器上实现 HTML5 播放。下面附上具体步骤,请将所有 example.com
替换为你的域名或者服务器 IP。
下载 Nginx 及扩展模块
首先,需要下载可编译的 Nginx 源代码,以及必要的拓展库。
获取 Nginx 源码
这一步需要根据你所使用的系统的实际情况选择:
- 初次安装或曾使用包管理工具安装了 Nginx:参考文章 Nginx 环境搭建中的「源码安装」方式,执行「准备工作」步骤;
- 此前通过源码编译安装了 Nginx:如果下载的源码没有删除,可以继续使用,具体操作会在后文中讲到;也可以参考上一条下载最新的源码;
- 曾使用 LNMP 安装 Nginx:执行下面「使用 LNMP」中额外的步骤;
- 如果你对在 Linux 上安装配置 Nginx 有所了解,可以使用你喜欢的方式安装。
使用 LNMP
如果此前使用了 LNMP 安装 Nginx,可以在 lnmp1.4
目录中解压得到 Nginx 源码。进入安装时生成的文件夹,并执行:
1 | cd lnmp1.4/src |
如果 LNMP 编译的 Nginx 包含 --add-module=openssl
等,也需要将依赖包一并解压,否则会报错找不到文件。
下载 nginx-http-flv-module
GitHub 项目地址:nginx-http-flv-module,克隆到本地即可:
1 | #为 Nginx 创建扩展模块目录 |
安装 Nginx
查看 Nginx 配置参数
如果此前已经安装过 Nginx(例如 LNMP),执行 nginx -V
会输出配置参数,类似于这样:
复制 configure arguments
后的所有参数,例如:
1 | --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-ipv6 --with-http_sub_module |
这会在后面用到。
如果是初次安装则可以跳过这一步,使用默认的 configure
参数。
编译 Nginx
这一步与文章 Nginx 环境搭建类似,区别是编译用到的 configure
参数不同。
1 | #进入 Nginx 源码目录 |
再次执行 nginx -V
查看安装状态,如果 configure arguments
后出现 nginx-http-flv-module
说明安装成功!
最后重启 Nginx 服务即可。
1 | systemctl restart nginx |
注意:在部分系统下需要使用 service
代替 systemctl
命令。
服务器开放 1935 端口
注:若服务器防火墙已关闭,请跳过此步。
1 | #开放 1935 端口 |
执行 iptables -L
查看防火墙设置是否生效。
配置 HLS 或 http-flv
对 nginx.conf
进行修改:
1 | #编辑配置 |
需要修改的是 http
下 server
的配置,其内容可参照:
1 | server |
参数说明:
rtmp
协议名称server
说明内部中是服务器相关配置listen
监听的端口号,rtmp 协议的默认端口号是 1935application
访问的应用路径是,这里设置为了 livelive on
开启直播record off
不记录数据
修改完后执行 nginx -s reload
重载 nginx 配置。
创建目录及文件
根据前面配置文件中的 hls_path
创建子目录 hls,例如 /home/hls
,确保 nginx 服务器对其具有读写权限。
在服务器的根目录,例如 /home/www
下创建 test.html 文件,进行 hls 播放:
1 | <!--test.html--> |
开始推流
如果要使用 OBS Studio 等软件推流,地址设置为 rtmp://example.com:1935/live/test
。
ffmpeg 也可以进行推流,用法是:
1 | ffmpeg -re -stream_loop -1 -i /path/to/your/video.mp4 -vcodec libx264 -acodec aac -f flv rtmp://example.com:1935/live/test |
版本较老的 ffmpeg 无法设置 -stream_loop -1
,可以前往官方网站下载最新版本。
hls 播放
用 http 访问之前创建的 test.html,即可观看直播。
如直播没有声音,请参考 ffmpeg 没有声音。
附录:浏览器对 hls 的支持
如果浏览器并不原生支持 hls,可使用第三方插件,例如 hls.js;或者使用 video.js 配合 http-streaming,这也是不错的解决方案。
http-flv 播放
对于 http-flv 播放,可以使用 VLC 等软件测试拉流,拉流地址为 http://example.com/flv?app=live&stream=test
。
如果要实现 HTML5 播放,可以使用 B 站开源的 flv.js,更多内容可以参照其文档,此处不做更多说明。
推流验证
如果配置文件中开启了 publish_notify
,那么 on_publish
项设置的页面将会被用作推流验证。如果验证失败,使这个页面返回 404 头即可。
比如你设置了 on_publish http://localhost/auth.php
,那么在 auth.php
中加入一下内容即可实现:
1 |
|
这时的推流地址也要对应改为 rtmp://example.com:1935/live/test?pass=password
。
参考文章:
基于 Nginx 搭建 RTMP/HLS 视频直播服务器
更多内容可以参考文中提到的模块在 GitHub 上的文档。
原文使用的是 nginx-rtmp-module,其功能被本文介绍的模块完全涵盖,故不再赘述。
本文更新于 2018 年 5 月 30 日:
由于 nginx-http-flv-module 一直在更新中,其配置文件的参数设置可能略有调整,请以文档为准,本文仅供参考。
本文更新于 2018 年 11 月:
在很多文章中都提到了一个 RTMP 源:rtmp://live.hkstv.hk.lxdns.com/live/hks
,不过最近它已经失效了,不能用于拉流。你可以使用前面提到的 OBS Studio 和 ffmpeg 进行测试。