云转码有很多种玩法,有一种就是搭建云转码框架,这次做的这个教程是根据实战来制作的,搭建框架的目的是使云转码可以无限扩展,负载均衡和保证服务的有效性。我们来看看这次的框架教程。

框架图示

云转码框架设计
按照图片所示,我来解释下每一台服务器的作用。
转码切片服务器:192.168.1.1 192.168.1.2
提供播放链接调用服务器:192.168.1.3 192.168.1.4
前台CMS调用播放链接进行播放和展示:192.168.1.5
服务器建议:
转码切片服务器配置需要足够高,带宽相反没有那么重要,主要需要CPU和硬盘越高越大越好。
提供播放链接调用的服务器需要带宽足够高,硬盘足够大,CPU和内存倒不是很重要。
前台CMS是真正面对用户的地方,各种配置越高越好。

搭建云转码源码

分别有四台服务器需要安装云转码express-ffmpeg的源码,提供转码和切片的服务器和提供播放链接的调用服务器。
那就是192.168.1.1到192.168.1.4这四台。我们来搭建云转码源码和环境,示例的系统为ubuntu16.04,其他系统的安装方法大同小异。

安装bbr和魔改bbr

wget --no-check-certificate -qO 'BBR.sh' 'https://moeclub.org/attachment/LinuxShell/BBR.sh' && chmod a+x BBR.sh && bash BBR.sh -f
wget --no-check-certificate -qO 'BBR_POWERED.sh' 'https://moeclub.org/attachment/LinuxShell/BBR_POWERED.sh' && chmod a+x BBR_POWERED.sh && bash BBR_POWERED.sh

上面这两个命令非常好用,如果是国外服务器建议都进行安装,BBR是谷歌开源的TCP加速技术,针对高峰时候的访问非常有效。

设置时区

timedatectl set-timezone 'Asia/Shanghai'

UBUNTU16.04设置时间的方式是使用timedatectl,非常简单易用,然后运行data,则可以看见时间已经改变。

安装宝塔

wget -O install.sh http://download.bt.cn/install/install-ubuntu.sh && sudo bash install.sh

这个命令是宝塔针对UBUNTU系统一键安装的命令行,一键搞定,完成之后会显示宝塔链接和账号密码,随后我们需要,我们继续往下面看。

进入宝塔安装环境

进入宝塔界面之后,无需安装任何关于PHP和MYSQL的环境,自动弹出来的推荐安装全部关闭。只需要安装三个环境,如图所示:
-----2018-09-17---11.29.21
只需安装软件管理->运行环境里边的NGINX、mongodb和pm2这几个即可。

三个都点击安装,可以选择编译安装和快速安装,这个随你喜欢,随后就是等待其安装完成。

配置mongodb

配置mongodb设置认证访问和开启远程访问,方便调用服务器直接链接远程数据库进行管理。

mongo
use admin
use db1
db.createUser({user:"dbuser",pwd:"dbpassword",roles:[{role:"readWrite",db:"db1"}]})
db.auth('dbuser','dbpassword')
1

这里是设置了db1数据的权限访问,创建了用户dbuser和密码dbpassword,权限是读写权限。
进入/www/server/mongodb文件夹

vi config.conf

找到bindIp: 127.0.0.1,把127.0.0.1更改成0.0.0.0。
找到authorization: disabled 修改成 enabled
然后重启mongdob服务。
更改绑定ip是为了将mongodb设置成远程服务,可以在调用服务器进行远程链接数据库。
更改认证为允许,是为了增加安全性。

安装ffmpeg

sudo add-apt-repository ppa:djcj/hybrid
sudo apt-get update  
sudo apt-get install ffmpeg 

上面是ubuntu16.04安装ffmpeg的步骤,非常简单,安装完成之后输入FFMPEG即可查看到效果。

克隆云转码源码

进入到wwwroot文件夹,然后将原来克隆到服务器上面。

cd /www/wwwroot
git clone https://gitee.com/quazero/express-ffmpeg
cd express-ffmpeg
npm install

配置安全认证文件

进入到express-ffmpeg文件夹后创建config文件夹,然后再在里边创建auth.js文件。

cd express-ffmpeg
mkdir config
cd config
touch auth.js
vi auth.js

输入以下认证信息

module.exports = {
    user: "admin",
    password: "admin",
    db: "db1",
    dbuser: "dbuser",
    dbpassword: "dbpassword",
    secret: "secret1"
};

user和password是登陆云转码后台所需账号密码。
db是刚才创建的数据库,dbuser是数据库认证账号,dbpassword是数据库认证密码。
secret是session所需加密secret。

开启云转码应用

进入到express-ffmpeg目录,然后使用pm2多线程启动应用

cd /www/wwwroot/express-ffmpeg
pm2 start bin/www -i 0

到现在云转码就已经搭建完成了,可以通过IP:3000访问到云转码,如果需要绑定域名,可以通过宝塔安装的NGINX进行站点反向代理设置,这里就不赘述了。

结果

最终两台云转码和两台调用服务器就都安装了云转码系统,这里边不同的是调用服务器不用安装mongodb,而云转码那两台服务器需要安装mongodb数据库,并且开启远程访问。

Rsync+Inotify同步配置

Rsync+Inotify文件同步配置,是为了将云转码里边的切片内容单向同步到提供调用服务的服务器上面去,并且监听云转码切片内容的变化,如果发生变化就将变化的文件单向同步到调用服务器上。

这里只讲解一台云转码和一个调用服务器的配置过程,另外一个云转码和调用服务器的配置过程是相同的。

首先我们要弄清楚,云转码和调用服务器哪一台是rsync服务端,等待连接的一方即是rsync服务端,rsync服务端的意思是--deamon启动rsync,在后台监听连接。

所以调用服务器已经是rsync服务端,它一直在监听云转码的连接请求,如果云转码发起同步请求,则调用服务器会响应请求,同步过程就发生了。

搭建rsync服务端

192.168.1.3和192.169.1.4需要搭建rsync服务端,原因如上所述,不再赘述。在UBUNTU16.04里边rsync是默认安装,所以我们不需要再次安装。

sudo vim /etc/default/rsync
RSYNC_ENABLE=true //设置开启同步
RSYNC_CONFIG_FILE = '/etc/rsyncd.conf'// 设置配置文件位置

设置rsyncd.conf配置文件

vi /etc/rsyncd.conf

下面是我的配置文件内容

pid file = /var/run/rsyncd.pid
lock file = /var/run/rsyncd.lock
log file = /var/log/rsyncd.log

[yunzhuanma]
path = /www/wwwroot/express-ffmpeg/public/videos
ignore errors = yes
read only = no
write only = no
hosts allow = 192.168.1.1
hosts deny = *
list = yes
uid = 0
gid = 0
auth users = yunzhuanma
secrets file = /etc/yunzhuanma.secrets

主要需要注意的是hosts allow是允许哪一个IP发起同步请求,这样安全性很高。
auth users是设置认证用户,后面配置192.168.1.1需要使用,还有/etc/yunzhuanma.secrets储存的是认证密码。

设置yunzhuanma.secrets

vi /etc/yunzhuanma.secrets
yunzhuanma:password

这里需要注意的是,在RSYNC服务端的secrets里边的格式是 user:pass,如果不这样设置,后面可能会无法同步。

设置yunzhuanma.secrets的权限

chmod 600 /etc/yunzhuanma.secrets

别问为什么,必须600权限。

启动RSYNC服务
使用service启动,即可启动RSYNC服务。

service rsync start

配置云转码服务器的Rsync+Inotify

配置Rsync+Inotify的目的是监听切片文件夹的文件改动,如果发生了改动,则立刻进行同步操作。

安装inotify

sudo apt-get install inotify-tools 

编写监听脚本

cd ~
touch rsync_qiepian.sh

下面是我使用的脚本

#! /bin/bash

host1=192.168.1.2

src=/www/wwwroot/express-ffmpeg/public/videos

dst=yunzhuanma

user=yunzhuanma

/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src|while read files
do
  /usr/bin/rsync -avzP --delete --progress ${src}/* ${user}@${host1}::${dst} --password-file=/etc/web.passwd
  echo "${file} was rsyncd"
done

这个脚本的目的是监听切片文件夹的内容变化,也就是/www/wwwroot/express-ffmpeg/public/videos里边的任何变化,删除、修改、创建等就会发起同步请求到192.168.1.2调用服务器,192.168.1.2接收到同步请求,就会开始同步操作。

设置同步密码文件password-file

vi /etc/web.passwd

输入同步密码:password,注意这里跟服务端RSYNC是不同的,服务端RSYNC的密码文件里边储存的是用户名和密码的键值对:yunzhuanma:password,跟这里是不一样的,千万别搞错了。
设置600权限,必须设置,不然报错。

chmod 600 /etc/web.passwd

最后给予脚本执行权限,并且测试执行。

chmod +x rsync_qiepian.sh
./rsync_qiepian.sh

测试重开一个SSH,进入/www/wwwroot/express-ffmpeg/public/videos文件夹,创建一个文件

cd /www/wwwroot/express-ffmpeg/public/videos
touch 1.txt

返回第一个SSH,如果没有报错,并且显示1.txt was rsyncd,也就是同步成功了。

最后将SH加入自启动

vi /etc/rc.local

将/root/rsync_qiepian.sh &写在exit(0)之上。

最终的结果

一旦192.168.1.1和192.168.1.2转码,那么切片文件就会自动同步到调用服务器192.168.1.3和192.168.1.4服务器上边,而调用服务器192.168.1.3和192.168.1.4因为连接的是云转码服务器的mongodb数据库,数据也是同步的,直接在调用服务器后台进行分享链接调用。
最后192.168.1.5前端CMS调用分享分享,将优质的视频内容提供给用户观看。
这整个架构就完成了,并且可以无限扩容。