基于ftp和nignx的视频服务器的原理与实现
1.需要实现什么
一个基本的视频服务器需要具有以下几个功能
- 能够支持视频文件的上传与存储
- 能够实现视频等静态文件的远程访问
2.如何实现
- 视频文件的上传与存储
- 可以通过配置支持ftp协议的服务器实现,在这个服务器中允许用户上传视频或者图片文件到制定目录,用户可以通过ftp客户端或者语言的第三方库比如go-ftp连接到ftp服务器,视频文件上传到ftp服务器之后,会保持持久化的操作
- 静态资源的访问
- 可以通过nignx,tomcat等web服务器实现,通过修改nginx的配置文件,将nginx配置成为静态资源处理器,直接提供用户访问静态资源的能力。用户可以通过HTTP请求直接从nginx获取文件,不需要访问ftp服务器
- 权限控制
- ftp身份认证,只有授权的用户才能上传视频文件
- 与nginx访问控制限制,限制特定用户或者特定ip的访问权限
问题难点
- 用户怎么通过nginx,访问到ftp服务器上的静态资源
解决思路
- 写shell命令,每当ftp的资源出现变动,把资源同步到nginx下面
这一个方法对服务器资源消耗较大
- 内存共享
将ftp服务器存相关资源的内存指针与nginx解析资源的内存指针挂载到同一块内存地址上面,通过内存共享,能保证nginx可以获取到ftp服务器的静态文件
解决过程
我的服务器是centos7操作系统,为了实现内存共享,我使用了docker数据卷技术,通过数据卷挂载,实现docker数据持久化操作
- 创建用于挂载的目录,这个目录将同时用于nginx容器与ftp容器数据卷挂载
1 2 3
| cd ~ mkdir -f ftp/vedio ftp/image
|
- 创建容器
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
cd ~ mkdir data/
docker commit myNginx:0.1
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
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
|
- 配置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; }
# 其他配置... } }
|
- 开放对应端口