在网上看到过很多关于FastDFS搭建的介绍,但是,到真正部署到正式服务器的时候就会出现各种各样的问题。基于各种可能出现的细节,把自己踩过的坑都写出来分享给大家,让其他人少走弯路。
环境:
CPU: 1核 |
内存: 2 GB |
实例类型: I/O优化 |
操作系统: CentOS 7.4 64位 |
公网IP: 120.79.178.190 |
弹性公网IP: - |
弹性网卡: eni-wz9izfdo... |
私有IP: 172.18.248.255 |
带宽计费方式: 按固定带宽 |
上面的公网IP和私有Ip本人处于安全考虑修改了的,不是笔者正真的IP地址,大家搭建时更换为自己真实IP地址即可。FastDFS官方地址,可点击参考。其他博客也介绍了FastDFS,大家也可作为参考学习。这里就不过多介绍FastDFS的相关原理了。
首先利用Shell连接阿里云服务器,进入命令界面。使用命令"cd /"进入到根目录下,然后可以自行选择一个自己下载的目录,用来存放下载资源。笔者是自己创建了个download目录,专门存放fastdfs相关的资源的。
# cd /usr
# mkdir download
# cd download
# wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz
创建好download目录后进入该目录,使用 “wget https://github.com/happyfish100/libfastcommon/archive/V1.0.7.tar.gz”命令下载fastdfs依赖包libfastcommon。.
然后解压:
# tar -zxvf V1.0.7.tar.gz
# cd libfastcommon-1.0.7
进入libfastcommon-1.0.7目录,然后对其进行编译和安装:
# ./make.sh
# ./make.sh install
安装好之后可以看到 libfastcommon.so 安装到了/usr/lib64/libfastcommon.so,但是FastDFS主程序设置的lib目录是/usr/local/lib,所以需要创建软链接,也可以自己创建/usr/local/lib,然后把libfastcommon.so复制到期目录下,但是推荐创建软连接。
使用命令创建软连接:
# ln -s /usr/lib64/libfastcommon.so /usr/local/lib/libfastcommon.so
# ln -s /usr/lib64/libfastcommon.so /usr/lib/libfastcommon.so
# ln -s /usr/lib64/libfdfsclient.so /usr/local/lib/libfdfsclient.so
# ln -s /usr/lib64/libfdfsclient.so /usr/lib/libfdfsclient.so
创建完成之后就可以下载FastDFS和安装了:
[root@iZwz9a191mdam4di3dozk3Z lib64]# cd /usr/download/
[root@iZwz9a191mdam4di3dozk3Z lib64]# wget https://github.com/happyfish100/fastdfs/archive/V5.05.tar.gz
使用命令ls查看,可以看到V5.05.tar.gz已经下下来,然后解压安装:
# tar -zxvf V5.05.tar.gz
# cd fastdfs-5.05
# cd fastdfs-5.05/
# ls
client common conf COPYING-3_0.txt fastdfs.spec HISTORY init.d INSTALL make.sh php_client README.md restart.sh stop.sh storage test tracker
可以看到目录中有make.sh,这是执行文件。
编译和安装:
# ./make.sh
# ./make.sh install
使用默认安装后可以看到有几个相应的文件:
# cd /etc/init.d
# ll
-rwxr-xr-x 1 root root 1186 Oct 30 10:18 fdfs_storaged
-rwxr-xr-x 1 root root 1186 Oct 30 10:18 fdfs_trackerd
1、服务脚本文件:
/etc/init.d/fdfs_storaged
/etc/init.d/fdfs_tracker
2、配置文件:
# cd /etc/fdfs
# ls
client.conf.sample storage.conf.sample tracker.conf.sample
3、命令工具:
# cd /usr/bin
fdfs_appender_test
fdfs_appender_test1
fdfs_append_file
fdfs_crc32
fdfs_delete_file
fdfs_download_file
fdfs_file_info
fdfs_monitor
fdfs_storaged
fdfs_test
fdfs_test1
fdfs_trackerd
fdfs_upload_appender
fdfs_upload_file
stop.sh
restart.sh
修改命令路径,由于FastDFS 服务脚本设置的 bin 目录是 /usr/local/bin, 但实际命令安装在 /usr/bin/ 下,所以,创建个软连接吧。
# ln -s /usr/bin/fdfs_trackerd /usr/local/bin
# ln -s /usr/bin/fdfs_storaged /usr/local/bin
# ln -s /usr/bin/stop.sh /usr/local/bin
# ln -s /usr/bin/restart.sh /usr/local/bin
当然,也可以把 /etc/init.d/fdfs_storaged 和 /etc/init.d/fdfs_tracker 两个脚本中的 /usr/local/bin 修改成 /usr/bin。
利用vi 命令编辑吧,在里面找到所有相关命令,然后改了。不推荐,麻烦!
然后开始配置tracker了,配置FastDFS跟踪器(Tracker):
# cd /etc/fdfs
# cp tracker.conf.sample tracker.conf
# vim tracker.conf
编辑tracker.conf,这里比较重要了。
# vim tracker.conf
is this config file disabled
# false for enabled
# true for disabled
# 配置文件是否不生效,false 为生效
disabled=false
# the tracker server port
# 提供服务的端口
port=22122
# the base path to store data and log files
# Tracker 数据和日志目录地址
base_path=/fastdfs/tracker
# HTTP port on this tracker server
# HTTP 服务端口
http.server_port=80
上面只展示了4个比较重要的信息。base_path地址属于自己要放fast相关数据的目录文件地址,可自己自定义。
首先“cd /”进入根目录,然后“mkdir fastdfs”,然后“cd fastdfs”,再创建“mkdir tracker”。
# cd /
# mkdir fastdfs
# cd fastdfs
# mkdir tracker
# mkdir storage
# mkdir file
# mkdir client
# ls
client file storage tracker
嗯,这几个目录后面都会用到,就一起创建了吧。
然后就需要去打开相应的阿里云服务器端口号了,这里必须重点提示,阿里云服务器端口号是需要到网页去手动开启的,不然会报各种各样的连接失败的错误。
先自己管理中心,登录账号后点击云服务器ECS实例,点击管理。然后到达下面这个页面。
然后选择“本实例安全组”,进入后点击“配置规则”。
然后选择“添加安全组规则”,配置你要开放的端口号。
授权对象指的是特定访问阿里云服务器该端口号的ip地址,上图中配置的“0.0.0.0/0”表示所有的ip都可以访问该端口号。针对22122端口号,不推荐使用,授权为你自己后台服务器的ip地址即可。就比如我自己配置的我访问的ip如下:
特别提醒,除了给自己后台服务开放访问权限外,还要针对阿里云服务器自己开放权限,点击克隆,输入阿里云服务器公网Ip地址。这里要提醒一下,由于后面storage访问缘由,比如配置他的tracker_server = 外网IP:22122,否则服务端后台是链接补上storage的。
然后一次性介绍完都要打开的端口号吧。
除了22122端口号,我们还需要开放80和23000端口号。
特别说明,80端口开放授权地址最好设置为“0.0.0.0/0”,让所有的都可以访问。为什么呢,这涉及到上传图片后访问的问题,如果只是针对后台服务器开放授权,那么后台服务器确实能访问到图片,也能看到,但是,用户用别的ip地址访问图片的时候看不到,笔者亲试!
嗯,如果在运行的时候发现连接超时,或者访问不了,基本上就是端口号没有用正确的打开方式,此时你就必须检查下端口好了,看看都什么需要打开。
好了,端口号都打开后就继续下面的配置了。
启动Tracker:
# service fdfs_trackerd start
查看 FastDFS Tracker 是否已成功启动 ,22122端口正在被监听,则算是Tracker服务安装成功:
# netstat -unltp|grep fdfs
然后可看到:
# netstat -unltp|grep fdfs
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 7790/fdfs_trackerd
如果看到上面显示的,则表明你tracker安装成功啦,端口号也打开啦。
关闭Tracker命令:
# service fdfs_trackerd stop
我只是说说关闭的命令,别在此真的关了!
tracker server 启动成功后,会在你创建的base_path目录下创建data和log两个目录。看到名字就知道会放什么了吧!
然后配置 FastDFS 存储 (Storage):
进入 /etc/fdfs 目录,复制 FastDFS 存储器样例配置文件 storage.conf.sample,并重命名为 storage.conf。
# cd /etc/fdfs
# cp storage.conf.sample storage.conf
# vim storage.conf
编辑storage.conf:
# 配置文件是否不生效,false 为生效
disabled=false
# 指定此 storage server 所在 组(卷)
group_name=group1
# storage server 服务端口
port=23000
# Storage 数据和日志目录地址(根目录必须存在,子目录会自动生成)
base_path=/fastdfs/storage
# 逐一配置 store_path_count 个路径,索引号基于 0。
# 如果不配置 store_path0,那它就和 base_path 对应的路径一样。
store_path0=/fastdfs/file
# tracker_server 的列表 ,会主动连接 tracker_server
# 有多个 tracker server 时,每个 tracker server 写一行
tracker_server=120.79.178.190:22122
# 访问端口
http.server_port=80
base_path就是前面一起创建的storage目录拉,自己配置吧。base_path0对应的file目录。
重点来啦:tracker_server=120.79.178.190:22122
这里填写你的外网ip地址,确保阿里云服务器自己给自己开放了权限(同一台服务器上装tracker和storage)。
配置好了保存!
然后启动 Storage:
# service fdfs_storaged start
用命令查看是否监听成功:# netstat -unltp|grep fdfs
# netstat -unltp|grep fdfs
tcp 0 0 0.0.0.0:23000 0.0.0.0:* LISTEN 7823/fdfs_storaged
tcp 0 0 0.0.0.0:22122 0.0.0.0:* LISTEN 7790/fdfs_trackerd
如果出现了上面所示,则表明你成功了!如果没出现,肯定就是端口号没开放,或者ip地址配置配置错了,或者没给阿里云服务器自己授权!
关闭Storage命令:
# service fdfs_storaged stop
不要关!
查看Storage和Tracker是否在通信:
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
出现了下面就表示真的通信成功啦!
Storage 启动成功后会自动在/fastdfs/storage目录下创建data和log两个目录。
在 store_path0 =/fastdfs/file目录下,创建了N*N个子目录:
00 06 0C 12 18 1E 24 2A 30 36 3C 42 48 4E 54 5A 60 66 6C 72 78 7E 84 8A 90 96 9C A2 A8 AE B4 BA C0 C6 CC D2 D8 DE E4 EA F0 F6 FC
01 07 0D 13 19 1F 25 2B 31 37 3D 43 49 4F 55 5B 61 67 6D 73 79 7F 85 8B 91 97 9D A3 A9 AF B5 BB C1 C7 CD D3 D9 DF E5 EB F1 F7 FD
02 08 0E 14 1A 20 26 2C 32 38 3E 44 4A 50 56 5C 62 68 6E 74 7A 80 86 8C 92 98 9E A4 AA B0 B6 BC C2 C8 CE D4 DA E0 E6 EC F2 F8 FE
03 09 0F 15 1B 21 27 2D 33 39 3F 45 4B 51 57 5D 63 69 6F 75 7B 81 87 8D 93 99 9F A5 AB B1 B7 BD C3 C9 CF D5 DB E1 E7 ED F3 F9 FF
04 0A 10 16 1C 22 28 2E 34 3A 40 46 4C 52 58 5E 64 6A 70 76 7C 82 88 8E 94 9A A0 A6 AC B2 B8 BE C4 CA D0 D6 DC E2 E8 EE F4 FA
05 0B 11 17 1D 23 29 2F 35 3B 41 47 4D 53 59 5F 65 6B 71 77 7D 83 89 8F 95 9B A1 A7 AD B3 B9 BF C5 CB D1 D7 DD E3 E9 EF F5 FB
然后进行文件上传测试:
修改 Tracker 服务器中的客户端配置文件:
# cd /etc/fdfs
# cp client.conf.sample client.conf
# vim client.conf
修改下面的配置即可,其它默认就行:
# Client 的数据和日志目录
base_path=/fastdfs/client
# Tracker端口(阿里云服务器公网IP地址)
tracker_server=120.79.178.190:22122
然后就做个图片上传测试:
//data目录是我自己在根目录下创建的一个存放图片的目录,我在里面放了张名为pic.jpg的图片
# cd data/
# ls
pic.jpg
进入到data目录下运行上传测试命令:
# /usr/bin/fdfs_upload_file /etc/fdfs/client.conf pic.jpeg
上传成功就会返回一个ID:group1/M00/00/00/rBL5_1vZTlGANIJPAABqgmoDdSo292.jpg
group1
M00/00/00/rBL5_1vZTlGANIJPAABqgmoDdSo292.jpg
在接口中他是返回一个String[]数组,index=0的表示组信息也就是group1,index=1的返回的地址信息也就是M00/00/00/rBL5_1vZTlGANIJPAABqgmoDdSo292.jpg。
然后安装nginx提供访问:
安装nginx需要前置环境,我们一步一步安装:
# yum install gcc-c++
# yum install -y pcre pcre-devel
# yum install -y zlib zlib-devel
# yum install -y openssl openssl-devel
然后安装nginx:
# cd /usr/download/
# wget -c https://nginx.org/download/nginx-1.12.1.tar.gz
把所有下载的东西都放在一个目录下,好统一管理,安装完就使用rm -rf *都给删了。免得占空间!
然后解压nginx:
# tar -zxvf nginx-1.12.1.tar.gz
# cd nginx-1.12.1
使用默认配置:
# ./configure
编译、安装:
# make
# make install
启动nginx:
# cd /usr/local/nginx/sbin/
# ./nginx
其它命令
# ./nginx -s stop
# ./nginx -s quit
# ./nginx -s reload
查看nginx的版本及模块:
# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.12.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
configure arguments:
nginx使用默认80端口号,这里特别说明,前面介绍授权端口号,对80端口要使用0.0.0.0/0的授权模式是特指所有的用户都可以访问到图片。如果不这样授权,图片只能特定授权的ip地址才能访问,其他的都访问不了。假如你要做个相册相关的服务网站,你就给后台服务器打开了授权,用户能上传图片,但弄死他就是看不到自己的图片,你信不信他锤死你!
当然,还有别的方式可以做到让用户也能访问,这就需要你自己去搞定了。这里就不说了!
访问文件:
修改nginx.conf:
# vim /usr/local/nginx/conf/nginx.conf
添加如下行,将 /group1/M00 映射到 /fastdfs/file/data
location /group1/M00 {
alias /fastdfs/file/data;
}
# 重启nginx
# /usr/local/nginx/sbin/nginx -s reload
然后在浏览器中访问图片:
http://120.79.178.190/group1/M00/00/00/rBL5_1vZTlGANIJPAABqgmoDdSo292.jpg
要输入自己的阿里云服务器外网IP哦,不要输入我的哦,我改了IP的,展示给你的Ip是假的!
如果能看到图片,就表明你搭建成功了!
然后简单介绍下java客户端的搭建吧
我使用的maven,毕竟习惯了,不习惯用gradle!
net.oschina.zcx7878
fastdfs-client-java
1.27.0.0
添加上面的依赖,嗯就是开源中国自己搞了个封装!fastdfs自己没有在中央仓库公开,没办法直接引入,就引入这个吧,完全没毛病!
然后在resources目录下建个fdfs_client.conf文件,当然名字是可以改的,也可以写成config.properties的形式,fastdfs自己实现了多种初始化方式,大家可以到git上去看,介绍的还是蛮多的!
然后fdfs_client.conf里面的内容其实就一句话就可以了:
tracker_server = 120.79.178.190:22122
上面的ip就是你的外网ip地址,如果搭建了分布式集群,多写几个就可以了。这里就不介绍了。
这里就贴一下upload的方法吧,页面相关的自己写去吧。
@Controller
public class UploadController {
@GetMapping("/index")
public String index() {
return "upload";
}
@PostMapping("/upload") //new annotation since 4.3
public String fileUpload(@RequestParam("file") MultipartFile file,
RedirectAttributes redirectAttributes) {
if (file.isEmpty()) {
redirectAttributes.addFlashAttribute("message", "选个文件啊!");
return "redirect:index";
}
try {
// 就用byte数组传输吧
byte[] file_buff = null;
InputStream inputStream=file.getInputStream();
if(inputStream!=null){
int len1 = inputStream.available();
file_buff = new byte[len1];
inputStream.read(file_buff);
}
inputStream.close();
String[] results=FastDFSUtils.upload(file_buff);
//拼接图片访问地址
String path =FastDFSClient.getUrl()+results[0]+ "/"+results[1];
redirectAttributes.addFlashAttribute("message",
"You successfully uploaded '" + file.getOriginalFilename() + "'");
redirectAttributes.addFlashAttribute("path",
path);
} catch (Exception e) {
logger.error("上传失败",e);
}
return "redirect:/index";
}
}
package com.neo.fastdfs;
import org.csource.common.MyException;
import org.csource.fastdfs.*;
import org.springframework.core.io.ClassPathResource;
import java.io.IOException;
public class FastDFSUtils {
public static String[] upload(byte[] fileBytes){
try {
// ClientGlobal.initByProperties("config.properties");
String filePath = new ClassPathResource("fdfs_client.conf").getFile().getAbsolutePath();
ClientGlobal.init(filePath);//初始化
TrackerClient trackerClient = new TrackerClient();//创建tracker
TrackerServer trackerServer = trackerClient.getConnection();//获取tracker服务
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer,storageServer);//存储连接
String[] results = storageClient.upload_file(fileBytes,"jpg",null);//上传返回结果
for (String str : results){
System.out.println(str);
}
//前面提到的返回的group1
//M00/00/00/rBL5_1vZTlGANIJPAABqgmoDdSo292.jpg
return results;
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
return null;
}
}
package com.neo.fastdfs;
import org.csource.fastdfs.*;
import java.io.*;
public class FastDFSClient {
//返回带端口号的图片服务器ip地址
public static String getTrackerUrl() throws IOException {
return "http://"+getTrackerServer().getInetSocketAddress().getHostString()+":"+ClientGlobal.getG_tracker_http_port()+"/";
}
//返回不带端口号的图片服务其ip连接地址
public static String getUrl() throws IOException {
return "http://"+getTrackerServer().getInetSocketAddress().getHostString()+"/";
}
private static TrackerServer getTrackerServer() throws IOException {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer = trackerClient.getConnection();
return trackerServer;
}
}
基本上诉就可以简单实现了,复杂的需要自己去优化理解了!
最后说一句,如果是局域网的话不是阿里云服务器,使用自己的linux电脑做服务器,要打开端口就使用一下命令:
# vim /etc/sysconfig/iptables
添加如下端口行:
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22122 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 23000 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
重启防火墙
# service iptables restart