阿里云Centos一步一步搭建FastDFS

在网上看到过很多关于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!

<dependency>
   <groupId>net.oschina.zcx7878</groupId>
   <artifactId>fastdfs-client-java</artifactId>
   <version>1.27.0.0</version>
</dependency>

添加上面的依赖,嗯就是开源中国自己搞了个封装!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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 8
    点赞
  • 3
    评论
  • 17
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值