一、需求分析
上一篇简单写了如何搭建ftp和sftp服务器,还是很简单的,但是现在公司有了具体的需求,需要搭建一个ftp和sftp服务器,创建一个用户,能同时使用这两个服务,公司开发一个项目,有windows客户端(ftp上传)和Android的app(sftp上传),现在需要在这两个终端上通过这两个协议上传视频、图片等文件至服务器的指定文件夹下,然后apache能够访问到该文件夹,然后下载、播放和查看该视频/图片文件。总结起来就是,sftp和ftp共用一个用户,app和客户端上传文件时使用这一个用户上传,上传的路径是同一个文件夹,然后apache能够访问。画出图如下所示:
二、创建sftp服务器
进入root模式(下面的操作默认都是在root用户下)
-
#安装openssh-
server
-
apt-
get install -y openssh-
server
创建sftp的组sftp-users和用户user1
-
#创建sftp-users组
-
groupadd sftp-users
-
#创建sftp用户登录目录volume
-
mkdir /home/volume
-
#创建sftp用户user1,并且绑定其主目录为刚才创建的目录
-
useradd -d /home/volume user1
-
#设置用户user1的密码
-
passwd user1
-
#输入两次密码
-
#将用户user1添加到组sftp-users中,并且设置不能telnet
-
#注:-a参数表示append,linux在创建用户时会默认创建一个和用户同名的组
-
#加上-a参数表示alice不退出原来的名为alice的组的情况下,加入sftp-users组中
-
usermod -a -G sftp-users -s /bin/
false user1
创建ssh用户组及用户管理
-
#创建ssh-users组
-
groupadd ssh-users
-
#将当前的ubuntu系统管理员加入到ssh-users组中
-
usermod -a -G ssh-users admin
-
#创建sftp的根目录并修改相应权限(将admin改为管理员名字)
-
mkdir /home/volume
-
mkdir /home/volume/vod
-
chown admin:sftp-users /home/volume/vod
-
#因为要上传文件到vod目录,且所有用户共享,所以vod必须要给777权限
-
chmod
777 /home/volume/vod
-
#修改ssh的配置文件
-
vi /etc/ssh/sshd_config
-
#首先修改sftp的默认端口号(默认是22,现在需求13022),第一行就是
-
Port
13022
-
-
#然后在文件末尾添加下面内容:
-
AllowGroups ssh-users sftp-users
-
-
Match Group sftp-users
-
-
ChrootDirectory /home/volume
-
-
AllowTcpForwarding
no
-
-
X11Forwarding
no
-
-
ForceCommand internal-sftp
-
#保存退出
注意:上面有一行配置ChrootDirectory /home/volume就表示sftp用户登录进入的目录就是/home/volume,登录目录的权限不能是777,否则登录会失败。
这是修改sshd_config文件,如果修改端口号的话,还需要修改一个配置文件/etc/ssh/ssh_config,与上面的那个文件少了个字母,将里面# Port 22这一行的注释取消,22改为13022,保存退出,然后重启机器。
注意:sftp默认的端口是22,和ssh的端口一致,如果使用的是xshell之类的工具远程连接到服务器的话,在xshell设置里的端口号也要相应的做修改,否则xshell过去会失败,当然,如果你不改端口的话,这里就不需要在意。
测试:先在服务器的/home/volume下创建测试文件get1.test,在/home/volume/vod下创建测试文件get2.test,在另一台ubuntu机器的当前目录创建put1.test,然后连接上传测试:
-
#在另一台ubuntu上输入:
-
sftp -P
13022 user1@serverIP
-
#输入密码即可登录成功
测试图如下:登录成功后,首先ls看到当前目录下有vod和get.test,说明当前目录是在volume下,即配置文件ChrootDirectory 写入的目录,然后get命令下载文件get1.test,但是在volume目录下上传是不成功的(上传需要对文件夹有写权限),这是因为volume并不是共享目录,该目录是sftp-users用户组所有,如果要把这一个目录给777权限,那么sftp登录的时候就会失败,也就是说配置中的ChrootDirectory写成了这一级目录,就不能把这一级目录设为共享文件夹,但是要实现sftp和ftp用户共享一个目录,那就只能在该目录的下面再创建一个vod文件夹,这也是为什么最初画需求分析图的时候要求有一个vod目录,虽然多了一级目录,上传的时候需要切换到该目录下,让操作略微麻烦,但却是必须的,然后将vod目录设为777权限就可以了。
二、创建ftp服务器
安装vsftpd
apt-get install vsftpd
修改vsftpd配置文件
-
-
#先备份
-
cp /etc/vsftpd.conf /etc/vsftpd.conf.backup
-
#修改文件
-
vi /etc/vsftpd.conf
-
-
#具体配置如下
-
-
listen=
NO
-
listen_ipv6=
YES
-
-
#禁止匿名访问
-
anonymous_enable=
NO
-
-
#设定可以进行写操作
-
write_enable=
YES
-
-
#设定上传后文件的权限掩码
-
local_umask=
022
-
-
#禁止匿名用户上传
-
anon_upload_enable=
NO
-
-
#禁止匿名用户建立目录
-
anon_mkdir_write_enable=
NO
-
-
#设定开启目录标语功能
-
dirmessage_enable=
YES
-
-
#使用本地时间
-
use_localtime=
YES
-
-
#设定开启日志记录功能。
-
xferlog_enable=
YES
-
-
#设定端口20进行数据连接
-
connect_from_port_20=
YES
-
-
#设定禁止上传文件更改宿主
-
chown_uploads=
NO
-
-
#设定vsftpd的服务日志保存路径,该文件默认不存在,必须要手动touch出来
-
#必须注意给与该用户对日志的写入权限,否则服务将启动失败
-
xferlog_file=/var/log/vsftpd.log
-
-
#设定日志使用标准的记录格式
-
xferlog_std_format=
YES
-
-
#设定支撑vsftpd服务的宿主用户为手动建立的user1
-
nopriv_user=user1
-
-
#设定支持异步传输功能
-
async_abor_enable=
YES
-
-
#设定支持ASCII模式的上传和下载功能
-
ascii_upload_enable=
YES
-
ascii_download_enable=
YES
-
-
#设定Vsftpd的登陆标语
-
ftpd_banner=Welcome to blah FTP service.
-
-
#使用本地用户
-
local_root=/home/volume
chroot_local_user=
NO
-
-
#开启用户名单
-
chroot_list_enable=
YES
-
-
#指定用户目录列表文件
-
chroot_list_file=/etc/vsftpd.chroot_list
-
-
#禁用“ls -R”命令
-
ls_recurse_enable=
NO
-
-
#一个安全选项
-
secure_chroot_dir=/var/run/vsftpd/empty
-
-
#pam相关
-
pam_service_name=ftp
-
-
#加密相关
-
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
-
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
-
ssl_enable=
NO
-
-
#utf-8编码
-
utf8_filesystem=
YES
下面是用户和组管理
-
#创建ftp-users组
-
groupadd ftp-users
-
#由于已经创建了sftp用户user1,现在需要该用户也能使用ftp,则需要将user1加入ftp-users组中
-
usermod -a -G ftp-users -s /sbin/nologin user1
usermod -d /home/volume users1
-
#创建日志文件
-
touch /
var/log/vsftpd.log
-
#创建用户列表文件
-
vi /etc/vsftpd.chroot_list
-
#写入一行
-
user1
保存退出
重启ftp服务:service vsftpd restart
查看ftp服务状态:service vsftpd status
测试上传下载:服务器的vod目录下创建get_ftp.test文件,客户端当前目录下创建put_ftp.test文件,测试截图如下:首先登陆ftp以后ls看到当前目录下有vod和两个get.test文件,说明登陆的路径是volume,然后进入vod下,看到有get_ftp.test文件,使用get命令下载成功,使用put把本地的put_ftp.test上传,上传也成功了,退出ftp后发现客户端当前路径多了一个get_ftp.test,查看服务器同理。
三、创建apache服务器
-
#安装apache2
-
apt-
get install apache2
在浏览器上输入服务器地址+端口,要能进入volume/vod目录,那么几个对应的配置文件就要修改
修改配置文件/etc/apache2/apache2.conf
-
#第一个修改处:
-
#默认配置为:
-
<Directory />
-
Options FollowSymLinks
-
AllowOverride None
-
Require all denied
-
</Directory>
-
#修改为:
-
<Directory />
-
Options FollowSymLinks
-
AllowOverride None
-
allow from all
-
</Directory>
-
-
#第二个修改处:
-
#默认配置为:
-
<Directory /
var/www/>
-
Options Indexes FollowSymLinks
-
AllowOverride None
-
Require all granted
-
</Directory>
-
#修改为:
-
<Directory /home/volume>
-
Options Indexes FollowSymLinks
-
AllowOverride None
-
Require all granted
-
</Directory>
-
修改配置文件/etc/apache2/sites-available/000-default.conf
-
#第一个需要修改的地方
-
#默认配置是
-
<VirtualHost *:
80>
-
#修改为10801(根据不同的需求决定,我这里是10801):
-
<VirtualHost *:
10801>
-
-
#第二个需要修改的地方
-
#默认配置是
-
DocumentRoot /
var/www/html
-
#修改为
-
DocumentRoot /home/volume/vod
修改配置文件/etc/apache2/sites-available/default-ssl.conf,和上一个文件一样
改完之后,VirtualHost _default_:10801和DocumentRoot /home/volume
修改/etc/apache2/ports.conf文件
第一行的linsten 80改为listen 10801
这四个配置文件修改完毕后service apache2 restart重启服务
service apache2 status可查看状态
最后测试,在浏览器上输入IP:PORT访问服务器如图所示,可以看到进入的是服务器的volume/vod文件,刚才上传的几个测试文件还在。
写这个blog之前还搭过一个一样的服务器,ip地址稍微有点变化,用不同的账户信息登录客户端或者app上传文件,上传过程中会检测服务器vod目录下是否有与账户id同名的文件,如果有则按照视频录制的时间创建一系列子目录上传,如果没有检测到,那就新建一个与账户id同名的(账户id是一个唯一标识的数字,数据库中的主键)文件,然后再上传(不管客户端和app使用哪个账户登录,上传文件登录ftp时都使用的是user1):
进入其中一个文件夹下,会看到路径就是以账户id+日期命名(这一部分的功能就在客户端和app上实现了),点击对应的视频文件,可以正常播放,实际项目中的应用就是这样。