基于ftp和nignx的视频服务器的原理与实现

1.需要实现什么

一个基本的视频服务器需要具有以下几个功能

  • 能够支持视频文件的上传与存储
  • 能够实现视频等静态文件的远程访问

2.如何实现

  • 视频文件的上传与存储
    • 可以通过配置支持ftp协议的服务器实现,在这个服务器中允许用户上传视频或者图片文件到制定目录,用户可以通过ftp客户端或者语言的第三方库比如go-ftp连接到ftp服务器,视频文件上传到ftp服务器之后,会保持持久化的操作
  • 静态资源的访问
    • 可以通过nignx,tomcat等web服务器实现,通过修改nginx的配置文件,将nginx配置成为静态资源处理器,直接提供用户访问静态资源的能力。用户可以通过HTTP请求直接从nginx获取文件,不需要访问ftp服务器
  • 权限控制
    • ftp身份认证,只有授权的用户才能上传视频文件
    • 与nginx访问控制限制,限制特定用户或者特定ip的访问权限

问题难点

  • 用户怎么通过nginx,访问到ftp服务器上的静态资源

解决思路

  1. 写shell命令,每当ftp的资源出现变动,把资源同步到nginx下面

这一个方法对服务器资源消耗较大

  1. 内存共享

将ftp服务器存相关资源的内存指针与nginx解析资源的内存指针挂载到同一块内存地址上面,通过内存共享,能保证nginx可以获取到ftp服务器的静态文件

解决过程

我的服务器是centos7操作系统,为了实现内存共享,我使用了docker数据卷技术,通过数据卷挂载,实现docker数据持久化操作

  1. 创建用于挂载的目录,这个目录将同时用于nginx容器与ftp容器数据卷挂载
1
2
3
# 创建目录
cd ~
mkdir -f ftp/vedio ftp/image
  1. 创建容器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 拉取镜像
docker pull vsftpd
docker pull nginx
# 启动容器
docker run -it --name nginx bash
# 创建nginx的数据文件夹 用于挂载操作
cd ~
mkdir data/
# 保存容器镜像 --nginx是没有data文件夹的 所以需要先自定义一个文件夹
docker commit myNginx:0.1
# 创建ftp容器
docker run -d -p 200:20 -p 210:21 -p 21100-21110:21100-21110 -v /root/ftp/Ftpfile:/home/vsftpd -e FTP_USER=user -e FTP_PASS=123456 -e PASV_ADDRESS=39.101.72.240 -e PASV_MIN_PORT=21100 -e PASV_MAX_PORT=21110 --name cloudFtp --restart=always fauria/vsftpd
# 创建nginx容器
docker run -p 9002:80 --name cloudNginx -v /root/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/conf/conf.d:/etc/nginx/conf.d -v /root/nginx/log:/var/log/nginx -v /root/nginx/html:/usr/share/nginx/html -v /root/ftp/Ftpfile/user:/root/data -d myNginx:0.1
  1. 配置nginx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# /etc/nginx/nginx.conf

user root;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;

server {
listen 80;

server_name localhost;

# 处理静态资源的根目录是挂载到容器内的 /root/data
# root /root/data;

location /images/ {
# 当访问以 /images/ 开头的 URL 时,会去寻找 /root/data/images/ 目录下的文件
root /root/data;
autoindex on;
}

location /videos/ {
# 当访问以 /videos/ 开头的 URL 时,会去寻找 /root/data/videos/ 目录下的文件
root /root/data;
autoindex on;
}

# 其他配置...
}
}

  1. 开放对应端口