FTP:(FTP是文件服务器,不要片面的理解为图片服务器)
1.为什么要有FTP:
1.常规的上传会经常导致用户的图片和文件丢失
2.当用户量过大的时候,导致最终硬盘支撑不住,无法再让用户进行上传
2.什么是FTP
FTP是一个协议,和http/tcp/udp..这些协议一样
http是网络协议,可以进行上网
FTP叫做文件传输协议,也就是说可以通过这个协议,让服务器和服务器之间实现文件的传输
(文件的传输无非就包含了两种:上传,下载)
3.在实际开发工作中所遇到的问题
3.1.如果头像更改了,多余出来的头像图片怎么处理?
3.2.文件名有没有可能重复?
文件名重复可以上传,默认会覆盖
张三上传了一张头像:123.jpg
李四上传了一张头像:123.jpg
李四就把张三的覆盖了-->这就是代码事故
3.3.随着头像/文件越来越多,如果客户端想要加载其中某一个图片/文件,需要消耗大量的查找时间,不方便寻找,如何处理?
3.4.把图片存放到ftp服务器上,需要记录图片的地址,如何处理?
存入到数据库中
3.5.用户上传的图片过大,如何处理?(后期去讲(kafka))
最好的结果使用压缩(zip,snappy...)
4.Linux搭建ftp
重点注意:
ftp服务器的名称不能叫ftp(在创建Linux服务器的时候,无论是全名还是用户名都不能叫ftp,因为会和ftp这个关键字名称冲突,导致ftp下载失败)
以后只要使用到Linux服务器的时候,绝对不能和关键字冲突(redis,zookeeper,nginx,es....)
配置Linux服务器的时候,尽可能的不要使用安装版(mysql,redis,nginx...)(绿色版/免安装版/解压版)
什么时候使用安装版来安装框架:
只要Linux自带的有,但是在安装Linux的时候你安装的一个纯净的一个环境,这个时候就可以直接使用yum -y install进行安装
否则其他的所有的框架都必须要使用免安装版本
在windows你如果想把一个软件运行起来,就必须要去注册列表进行注册
安装版会自动的去注册列表进行注册,免安装版本还得手动自己去注册列表中进行注册,会非常麻烦
4.1.因为ftp是Linux本来就自带的,所以要先检测ftp是否存在
检测已经开始运行的程序的时候:
ps -ef | grep xxx--->就可以检测当前正在运行的框架/软件/项目pid,端口号。。。
检测已经安装了,但是没有运行的程序:
rpm -qa | grep xxx--->vsftpd(在Linux上ftp叫vsftpd)
如果什么都没有显示,则说明没有安装
4.2.安装ftp
yum -y install vsftpd
看到以下信息说明安装成功:
Running Transaction
Installing : vsftpd-2.2.2-24.el6.x86_64 1/1
Verifying : vsftpd-2.2.2-24.el6.x86_64 1/1
Installed:
vsftpd.x86_64 0:2.2.2-24.el6
Complete!
4.3.启动ftp
和防火墙启动一模一样
service vsftpd start/stop/restart/status
4.4.开启ftp的开机启动
和防火墙也一模一样
chkconfig vsftpd on/off/--list
4.5.配置ftp
Linux在安装ftp的时候,默认会直接安装在etc目录
vim /etc/vsftpd/vsftpd.conf
# 禁止匿名访问ftp服务器
anonymous_enable=YES-->NO
# 允许本地用户直接登录(方便程序员的操作)
local_enable=YES
# 让已经登录的用户可以拥有写的权限(上传权限)
write_enable=YES
# 默认umask端口号(远程用户连接ftp服务器的时候,端口号默认是022,但是对于本地用户端口号默认就是077端口号,让本地用户也使用022端口号,禁用掉077端口号)
local_umask=022
# ftp上传的时候也有可能报错(比如硬盘已经满了,无法继续上传),于是就把这些错误和上传日志信息记录下来
# 默认保存上传和下载的日志记录
xferlog_enable=YES
# 会把日志存放在/var/log/xferlog中(不需要手动创建,当上传/下载的时候,ftp如果检测没有该目录则会自动生成)
xferlog_file=/var/log/xferlog
# 当上传/下载的时候会记录日志,这些日志有可能是json格式(默认是自动格式化)
# 不让ftp自动格式化这些日志信息(因为会占用比较高的内存)
xferlog_std_format=YES--->NO
# 允许ASCII码模式的上传和下载
ascii_upload_enable=YES
ascii_download_enable=YES
# 在ftp这个框架中,连接的端口号和上传以及下载所使用的端口号是不同的(连接的时候用的022,上传和下载的时候使用的20端口号)
connect_from_port_20=YES
# 开启ftp的欢迎标语(无所谓的)
ftpd_banner=Welcome to blah FTP service.
# 以下的三个配置非常非常重点,如果配置不好,导致java连接ftp的时候连接不上,还有可能导致java连接ftp成功后创建文件夹的时候创建不了
chroot_local_user=YES-->NO(有坑:如果使用YES这个值,最终在java连接ftp后创建文件夹的时候无法创建)
chroot_list_enable=YES
# chroot_list需要自己手动在Linux服务器上进行创建
touch chroot_list
chroot_list_file=/etc/vsftpd/chroot_list
# 使用standalone模式在ipv4下运行
listen=YES
# 在Linux上所显示的名称,默认就是vsftpd(可以修改,但是不推荐)
pam_service_name=vsftpd
4.6.重启ftp服务(让4.5步的配置加载进ftp中)
service vsftpd restart
4.7.执行以下5个命令,让第4.5步的配置生效
getsebool -a | grep ftpd(可以不执行,就是来查看的)
以下的4个命令执行起来比较慢,ftp需要自动重启加载,并不是Linux死机了
setsebool -P(大写) ftp_home_dir 1
setsebool -P allow_ftpd_full_access 1
setsebool -P allow_ftpd_use_cifs 1
setsebool -P allow_ftpd_use_nfs 1
4.8.因为最终要确保ftp的安全性,所以需给ftp创建账号和密码
ftp规定默认是不能使用Linux的root用户进行连接的,所以需要创建用户
useradd ftpuser(用户名) -s /sbin/nologin -d /home/ftp(需要自己手动输入,默认是没有该文件夹的)
/home/ftp:就是以后文件上传的目录
4.9.为ftp用户创建密码
passwd ftpuser
4.10.测试ftp服务器是否搭建成功
filazilla工具(免费的,可以直接从百度下载)
打开站点管理器-->点击新站点-->不需要更改协议和端口号
主机:
ftp服务器的ip地址
登录类型:
使用默认的(正常)
用户名:
刚才搭建ftp服务器的时候所创建用户
密码:
同样是创建的用户密码
4.11.但是在使用浏览器进行访问的时候,突然访问不到
但是使用ftp协议
ftp://192.168.23.155可以直接访问
需求是直接使用http协议,然后输入192.168.23.155/1.txt--->可以直接在浏览器上显示刚才所上传的文件内容(图片)
这个原因其实就是ftp根本就不会支持http协议,因为ftp只支持ftp协议
5.虽然ftp服务器已经搭建完毕,也可以成功的上传文件和下载文件,但是并没有办法做到直接通过浏览器显示文件内容,这一块就需要代理来进行搞定(nginx)
把nginx和ftp配置在同一台服务器上
192.168.23.155:
ftp-->最终没有办法直接显示在浏览器上(只有上传和下载)
nginx来做路径的映射(咱们现在已经知道ftp最终就会把文件上传到/home/ftp目录中)
在浏览器中只要输入192.168.23.155/1.txt就能直接访问到1.txt文件中的内容
实际开发中的分布式是这样的:
192.168.23.155:
ftp
192.168.23.156:
nginx
当去访问192.168.23.156/1.txt直接其实访问的是192.168.23.155/home/ftp/1.txt文件
这种配置方法需要免秘钥,所以咱们放到项目中实现,今天的主要内容讲ftp,我不想在这浪费时间
nginx的配置:
略
5.1.虽然nginx的配置我不写了,但是需要修改nginx.conf(/user/local/nginx-1.17.9/conf)中内容:
user nobody--->root;
而且配置一定要顶格完成,否则不生效
location / {
root html-->ftp的上传路径(/home/ftp);
index index.html index.htm;
}
5.2.启动nginx
./nginx