很多人刚开始做在线电影音乐站的时候,脑子里想的是买个域名,租个虚拟主机,把网站程序传上去就能开业了。真干起来才发现,事情远没那么简单。网站本身跑起来是一回事,那些电影和歌曲文件往哪儿搁,是另一回事,而且往往是更棘手的那回事。
打个比方,你的网站程序就像一家电影院的售票系统和装修,而电影文件本身是那一盘盘胶片。你不可能把几千部胶片全堆在售票窗口后面,影院得有个专门的片库,甚至是个独立的仓库。放到互联网上,这个仓库就是你另外需要准备的存储空间,也就是常说的流媒体服务器或者对象存储空间。
之所以要分开,最直接的原因是成本。现在一台入门级的云服务器,配置个2核4G,一年下来也得几百上千块,带宽通常也就几兆。这点带宽用来跑网站程序绰绰有余,但要是敢直接往上面存高清电影,那就是拿水管往游泳池里灌水。一个用户在线看一部1080P的电影,码率算低点8Mbps,换算下来每秒就要消耗1兆带宽。你那5M带宽的服务器,满打满算也就够五个人同时看,还不算网站的网页、图片、数据库查询也要挤占带宽。再多几个人,卡顿、缓冲、白屏,用户骂娘是轻的,服务器直接宕机也不稀奇。
再说容量。一部90分钟的普通电影,压缩成720P,怎么也得2到3个G,1080P的动不动就上5个G。你站里要是有500部电影,算算就是1.5到2.5TB的数据量。这还只是电影,音乐虽然单个体积小,但架不住数量多,无损格式的一首歌几十MB,来个几万首也是好几百G。网站程序本身撑死几百MB,跟这些文件完全不是一个量级。虚拟主机的空间基本都是按G算的,你往里面塞几部电影就满了,更别提那些主机商往往还会限制单个文件大小,超过两三百兆就不让你上传。
带宽和容量还只是表面的坑,更深一层是IO并发的问题。网站程序是典型的小文件频繁读写,而视频文件是顺序的大块读取,这两者对磁盘系统的压力模式完全不同。把视频文件跟程序混在一个磁盘上,用户一多,磁盘IO直接拉满,不仅视频放不出来,你的网站后台甚至都可能打不开。那种互相拖后腿的体验,谁碰谁知道。

所以实际操作上,稍微有点规模的站点都是分开部署的。网站程序放在一个小而稳的云服务器上,只负责跑PHP和MySQL,处理网页访问。电影和音乐文件则统一放到对象存储里,像阿里云的OSS、腾讯云的COS,或者自建一套独立的文件服务器。对象存储是按存储量和流量计费的,标准存储大约每GB每月一毛二左右,CDN回源流量另算。听着似乎不便宜,但它能扛住极高的并发,而且自带CDN加速,能把文件分发到全国各地的节点。用户看视频时,其实是从离他最近的CDN节点读取数据,这样既快又省主服务器带宽。
这里多说一句,视频文件本身的转码和切片也很关键。你如果直接放一个完整的高清MP4文件上去,用户拉进度条很难受,服务器压力也大。正规做法是把视频转码成HLS格式,切成一个个几秒钟的小TS分片,配上m3u8索引文件。这样做的好处是用户可以拖动进度条秒开,而且服务器可以按需分发分片,哪个分片被看得多就缓存哪个,极大节省流量。这一切转码和切片处理,也是需要额外的计算资源的,虽然可以临时用,但平时也得留预算。
音乐相对简单些,现在主流做法是转成M4A或MP3,配上DASH流媒体协议,按码率分几个档次,用户网络差就跳低码率档,网络好就听高音质档。但无论怎么转,这些音频文件同样得放在独立空间里,不能挤占网站程序的存储和带宽。
还有一件事很多人忽略,就是备份和容灾。网站程序小,打个快照几分钟搞定,费用也低。那些几十上百T的视频文件,要是只放在一处,遇到机房故障或者存储厂商跑路,可就全军覆没了。所以大文件往往需要做异地备灾,通常是另一个存储服务商的冷备,或者自建硬盘阵列做离线拷贝。这又是一笔空间和设备的开销,但干到一定规模,这是保命用的。
最近这两年情况又有点变化,很多站点开始用边缘节点存储,就是直接把视频文件分发到各个CDN节点的缓存里,存储空间由CDN服务商提供。用户请求视频时,边缘节点直接响应,没有回源压力。这种方式单价高一点,但省去了自己管理存储集群的麻烦,对中小站点是更省心的选择。我自己见过不少站长初期为了省钱,把电影直接往服务器硬盘里堆,最后不是带宽被拖死,就是硬盘被塞满,再要么就被服务商警告限流,最后还是得回归到用独立对象存储的路子上来。
说到底,网站程序是门面,视频音频文件是货品。门面可以小,但仓库必须大,而且得专业。两者分开管理,各用各的服务器,各走各的带宽通道,网站才能平稳跑起来,用户才能有流畅的观看体验。这个道理,越早想明白,后面走的弯路越少。