背景(只关心技术实现的不用看)
最近在复习大物,所以在web技术上并没有太多的突破。我有便复习边听音乐的习惯,然而很多我喜欢的音乐都听过很多遍了,作为一个(伪)收音机爱好者,边复习边听国际广播似乎也是个不同的选择。然而VOA的 、RFA的节目有时稍显弱智,NHK的节目时长太短,KBS、RTI很多时段的的节目我不喜欢,我最喜欢的是RFI这样的电台,客观而有深度。然而...只有RFI的节目源被墙了,不翻墙很难收听,就算翻了墙也容易出现断流的现象。有没有一种方法可以稳定的收听RFI的节目呢?
——当然有!那就是Nginx的流媒体代理功能!
它可以代理常见的.m3u8 .ts .mp3等多种格式的流媒体。
Nginx配置
这个功能需要用到一个Nginx模块
http_sub_module
.请确认你的Nginx服务器安装了这个模块,方法也很简单:
- 运行命令
nginx -V
- 检查输出结果是否包含
--with-http_sub_module
,没有就表示没安装,需要进行安装。
如果你是自己编译安装的Nginx,网上有很多添加模块重新编译的教程,请自行查找下吧~
我是用的是oneinstack
一键安装包,先备份好Nginx配置文件,修改oneinstack配置文件后卸载Nginx并进行重装即可安装模块。
- 备份Nginx配置文件
cp -r /usr/local/nginx/conf/. /home/conf/
同时备份一下存放网站的wwwroot
文件夹,防止卸载Nginx时造成网站数据丢失。 - 进入oneinstack目录,编辑配置文件
vim options.conf
- 在第37行,
nginx_modules_options
处加入--with-http_sub_module
(多个模块用空格分隔) - 运行卸载程序,注意只卸载Ngnix服务器
./uninstall.sh
,根据提示进行选择。 - 运行安装程序,注意只安装Nignx服务器
./install.sh
,根据提示进行选择。 - 还原配置文件
cp -rf /home/conf/. /usr/local/nginx/conf/
现在Nginx的http_sub_module
模块已经安装好了~
我们为什么要使用这个比较冷门的模块呢?主要是为了替换m3u8文件中的.aac
格式的连接。m3u8文件只是一个“指路标”,指向了音视频文件的地址。因此,我们需要用这个模块,将其中指向源服务器的音视频文件指向我们自己的代理服务器。其他格式如mp3文件原因也是如此。
进入你Nginx的配置文件,在合适的地方加入下面的内容,需要的地方请进行替换:
location ~* \.(m3u8|ts|aac)$ {
proxy_cache off; # 禁用代理缓存
expires -1; # 禁用页面缓存
proxy_pass http://example.com; # 反代目标 URL
sub_filter 'http://example.com/' 'http://$host/'; # 替换 m3u8 文件里的资源链接
sub_filter_last_modified off; # 删除原始响应里的浏览器缓存值
sub_filter_once off; # 替换所有匹配内容
sub_filter_types *; # 匹配任何 MIME 类型
}
下面是我的配置文件,我需要对RFI进行反代:
location ~* \.(mp3)$ {
proxy_cache off;
expires -1;
proxy_pass http://live02.rfi.fr;
sub_filter 'http://live02.rfi.fr/' 'https://$host/';
sub_filter_last_modified off;
sub_filter_once off;
sub_filter_types *;
}
没有问题就可以运行systemctl restart nginx
重启Nginx了。
如何使用呢?打个比方,比如,原链接是http://example.com/playlist.m3u8
,将域名改为你自己的,其它的不变就可以访问了。
Then, Enjoy It!
中间还可以使用CDN加速,经过了一层cloudflare CDN加速,延迟和丢包率都有明显下降,节目的延迟也自然大大下降,收听体验得到了明显提升~
xmg666🤗
哇,是超哥!快,捉活的 :i_f02: