安装FastDFS
FastDFS开发者的GitHub地址为:https://github.com/happyfish100
打开上述链接,我们点击fastdfs–>release,发现最新版的FastDFS为2017年上传的V5.11,接下来我们来安装最新版的FastDFS。
在安装前,我们新建一个目录,用来存储所有下载文件:mkdir /download,进入download目录完成接下来操作:cd /download
1. 下载安装 libfastcommon
libfastcommon是从 FastDFS 和 FastDHT 中提取出来的公共 C 函数库,是FastDFS的基础环境,安装即可 。
1.1 下载 libfastcommon 压缩包:wget https://github.com/happyfish100/libfastcommon/archive/V1.0.36.tar.gz
1.2 解压 libfastcommon 压缩包:tar -zxvf V1.0.36.tar.gz
1.3 进入解压目录编译安装:
cd libfastcommon-1.0.36/
编译:./make.sh
在上面这步中报错:gcc: 未找到命令,即没有gcc命令,那就安装gcc命令:sudo yum -y install gcc gcc-c++,然后重新编译。
安装:sudo ./make.sh install
从安装日志中可以找到 usr/include/fastcommon common_define.h 两个路径,先记录下来(之后用)
2. 下载安装FastDFS
2.1 下载FastDFS压缩包:wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
2.2 解压:tar -zxvf V5.11.tar.gz
2.3 进入解压目录编译安装:
cd fastdfs-5.11/
编译:./make.sh (注意:需要perl的支持,否则不能运行,可以参考此文章https://blog.csdn.net/wtwshui/article/details/79415799安装)
安装:sudo ./make.sh install
从安装日志中可以找到 /usr/include/fastdfs fdfs_define.h 两个路径,先记录下来(之后用)
2.4 查看安装后的相应文件与目录
2.4.1 服务脚本:ll /etc/init.d/ | grep fdfs
2.4.2 配置文件(这四个是开发者给的样例配置文件):ll /etc/fdfs/
2.4.3 命令工具:ll /usr/bin/ | grep fdfs
3. 配置FastDFS跟踪器(Tracker)
首先,将 /etc/fdfs/目录下开发者给的样例配置文件复制并重命名:
进入目录:cd /etc/fdfs/
复制文件:
sudo cp client.conf.sample client.conf
sudo cp storage.conf.sample storage.conf
sudo cp tracker.conf.sample tracker.conf
sudo cp storage_ids.conf.sample storage_ids.conf
1. 编辑配置文件: vim tracker.conf
2. 修改配置文件:其余的默认即可
配置文件是否不生效,false 为生效,不变即可:
disabled=false
提供服务的端口,不变即可:
port=22122
Tracker 数据和日志目录地址,该目录必须手动创建:
base_path=/root/data/fastdfs/tracker
HTTP 服务端口,修改为80:
http.server_port=80
3. 创建tracker基础数据目录,即base_path对应的目录
mkdir -p /root/data/fastdfs/tracker
4. 防火墙中打开跟踪端口(默认的22122):
sudo firewall-cmd --permanent --zone=public --add-port=22122/tcp
5. 重启防火墙:
sudo firewall-cmd --reload
6. 查看防火墙中开启的端口:
sudo firewall-cmd --list-port
注意:CentOS7以上使用4.5.6方式开启防火墙,CentOS6版本参考http://www.mamicode.com/info-detail-971703.html做相应操作
7. 启动Tracker,初次成功启动,会在 /home/bdc/data/fastdfs/ (配置的base_path)下创建 data、logs 两个目录。
sudo service fdfs_trackerd start
8. 查看 FastDFS Tracker 是否已成功启动 ,22122端口正在被监听,则算是Tracker服务安装启动成功。
sudo netstat -ntlp | grep 22122 或 sudo lsof -i:22122
9. 关闭Tracker命令:
sudo service fdfs_trackerd stop
10. 设置Tracker开机启动
sudo chkconfig --add fdfs_trackerd
11. 查看开机启动任务:
sudo chkconfig --list
4.配置 FastDFS 存储器(Storage)
编辑配置文件:sudo vim storage.conf
修改配置文件:其余的默认即可
配置文件是否不生效,false 为生效,不变即可:
disabled=false
指定此 storage server 所在组(卷),根据自身需求更改:
group_name=group1
指定storage server 服务端口,默认即可:
port=23000
心跳间隔时间,单位为秒 (这里是指主动向 tracker server 发送心跳),默认即可:
heart_beat_interval=30
Storage 数据和日志目录地址,该目录必须手动创建:
base_path=/root/data/fastdfs/storage
存放文件时 storage server 支持多个路径。这里配置存放文件的基路径数目,通常只配一个目录。
store_path_count=1
逐一配置 store_path_count 个路径,索引号基于 0。如果不配置 store_path0,那它就和 base_path 对应的路径一样。
store_path0=/root/data/fastdfs/storage
FastDFS 存储文件时,采用了两级目录。这里配置存放文件的目录个数。 如果本参数只为 N(如: 256),那么 storage server 在初次运行时,会在 store_path 下自动创建 N * N 个存放文件的子目录。
subdir_count_per_path=256
tracker_server 的列表 ,会主动连接 tracker_server,有多个 tracker server 时,每个 tracker server 写一行。
tracker_server=bdcTracker:22122
允许系统同步的时间段 (默认是全天) 。一般用于避免高峰同步产生一些问题而设定。
sync_start_time=00:00
sync_end_time=23:59
访问端口
http.server_port=80
注意:需要重启tracker后,配置才会生效
创建Storage基础数据目录,对应base_path目录及store_path0路径
mkdir -p /root/data/fastdfs/storage
防火墙中打开存储器端口(默认的 23000)
sudo firewall-cmd --permanent --zone=public --add-port=23000/tcp
重启防火墙:
sudo firewall-cmd --reload
查看防火墙中开启的端口:
sudo firewall-cmd --list-port '
补充:由于上面tracker地址配置的不是ip地址,所以我们要修改host文件,使之与ip对应:
sudo vim /etc/hosts
添加如下内容,下面ip为虚拟机ip:
192.168.105.133 bdcTracker
启动 Storage,启动Storage前确保Tracker是启动的。初次启动成功,会在/root/data/fastdfs/storage 目录下创建 data、 logs 两个目录。
sudo service fdfs_storaged start
查看 Storage 是否成功启动,23000 端口正在被监听,则 Storage 启动成功。
sudo netstat -ntlp | grep 23000 或 sudo lsof -i:23000或sudo netstat -ntlp | grep fdfs
关闭 Storage:
sudo service fdfs_storaged stop
查看Storage和Tracker是否在通信:
fdfs_monitor /etc/fdfs/storage.conf
在打印结果中,看到 ip_addr = 192.168.105.133 (bdcTracker) ACTIVE ,表示正在通信。
设置 Storage 开机启动
sudo chkconfig fdfs_storaged on
Storage 目录,同 Tracker,Storage 启动成功后,在base_path 下创建了data、logs两个目录,记录着 Storage Server 的信息。在 store_path0 目录下,创建了N*N个子目录,用于存储文件。
5. 文件上传测试
修改 Tracker 服务器中的客户端配置文件:sudo vim client.conf
修改配置,未列出的默认即可:
Client 的数据和日志目录,该目录必须手动创建:
base_path=/root/data/fastdfs/client
Tracker端口
tracker_server=bdcTracker:22122
Http访问端口
http.tracker_server_port=80
创建Client数据目录:
mkdir -p /root/data/fastdfs/client
上传测试
在linux内部执行如下命令上传 02.jpg 图片
fdfs_upload_file /etc/fdfs/client.conf /home/bdc/图片/02.jpg
上传成功后返回文件ID号:group1/M00/00/00/wKhphVrwGUmAduGXAAHjhVtVRZw426.jpg,返回的文件ID由group、存储目录、两级子目录、fileid、文件后缀名(由客户端指定,主要用于区分文件类型)拼接而成。
查看文件:
ll /root/data/fastdfs/storage/data/00/00
安装Nginx
前言:Nginx安装环境准备工作
1) gcc准备:安装nginx需要先将官网下载的源码进行编译,编译依赖gcc环境,查看是否安装gcc:
yum list installed | grep gcc
如果没有gcc环境,需要安装gcc,执行命令安装:
sudo yum -y install gcc gcc-c++
2) PCRE准备:PCRE是一个Perl库,包括 Perl 兼容的正则表达式库。nginx的http模块使用PCRE来解析正则表达式,所以需要在Linux上安装PCRE库,执行安装命令:
sudo yum -y install pcre pcre-devel
3) zlib准备:zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库,运行安装命令:
sudo yum -y install zlib zlib-devel
4) openssl准备:OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库。运行安装命令:
sudo yum -y install openssl openssl-devel
正式安装Nginx
目前版本的FastDFS还不支持http访问文件,所以要想通过http来访问已经上传成功的文件,需要安装Nginx支持;Nginx只需要安装到StorageServer所在的服务器即可,用于支持http访问文件。
1. 下载Nginx:
wget https://nginx.org/download/nginx-1.14.0.tar.gz
2. 解压
tar -zxvf nginx-1.14.0.tar.gz
3. 进入解压目录编译安装:
3.1 进入目录:
cd nginx-1.14.0
3.2 配置Nginx:启用 openssl密码库,并使用当前用户启动nginx,其余默认即可
./configure --with-http_ssl_module --user=root
3.3 编译 Nginx:
make -j 4
3.4 安装:
sudo make install
3.5 创建软链接(类似快捷方式),并启动 Nginx:
sudo ln -s /usr/local/nginx/sbin/nginx /usr/bin/
sudo nginx
其他命令:
sudo nginx -s stop
sudo nginx -s reload
3.6 查看是否启动成功:
sudo netstat -anp | grep nginx
3.7 设置nginx开机启动
sudo vim /etc/rc.local
添加下面一行:
/usr/local/nginx/sbin/nginx
然后更改文件权限
sudo chmod 744 /etc/rc.d/rc.local
3.8 查看nginx的版本及模块
nginx -V
3.9 访问刚刚上传的图片
1)修改nginx.conf配置
编辑文件:sudo vim /usr/local/nginx/conf/nginx.conf
注:原配置文件中有很多注释掉的内容,这里不再粘贴,,并且需要改动的地方已经加注释标示出来了
#修改nginx启动用户,和系统启动用户一致,nginx默认启动用户为nobody,在nginx安装的时候已经指定为root用户
user root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
server {
#侦听端口
listen 80;
server_name localhost;
#修改映射地址,将http中的地址/group1/M00/映射为系统实际地址/home/bdc/data/fastdfs/storage/data/
location /group1/M00/ {
alias /root/data/fastdfs/storage/data/;
}
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
重启nginx:sudo nginx -s reload
访问文件:
方式一:http://ip:80/group1/M00/00/00/wKhphVrwGUmAduGXAAHjhVtVRZw426.jpg
注意这里可能出现问题:Centos7自带的最初版火狐浏览器解析上面地址的时候可能解析为一个目录,即:http://bdctracker:8081/group1/M00/00/00/wKhphFrhIVuADqfzAASB-wpUaac425.jpg/这种形式,导致访问不到文件,问题出在wKhphFrhIVuADqfzAASB-wpUaac425.jpg这个位置,把文件和访问地址的后缀名改为.jpeg就可以访问到,具体原因不太清楚,不过谷歌浏览器或者更新后的火狐浏览器又不会出现问题,按上面地址又可以访问到文件,学艺不精,不再研究。。。。
另外注意:防火墙要放行80端口
方式二:wget http://bdc:80/group1/M00/00/00/wKhphVrwGUmAduGXAAHjhVtVRZw426.jpg,可以获取到文件则nginx配置成功。
FastDFS 配置 Nginx 模块
前言: fastdfs-nginx-module 模块说明
FastDFS 通过 Tracker 服务器,将文件放在 Storage 服务器存储, 但是同组存储服务器之间需要进行文件复制, 数据同步有延迟的问题。
假设 Tracker 服务器将文件上传到了 Stroage1,上传成功后文件 ID已经返回给客户端。此时 FastDFS 存储集群机制会将这个文件同步到同组存储 Stroage2,在文件还没有复制完成的情况下,客户端如果用这个文件 ID 在 Stroage2 上取文件,就会出现文件无法访问的错误。而 fastdfs-nginx-module 可以重定向文件链接到源服务器取文件,避免客户端由于复制延迟导致的文件无法访问错误。
安装配置fastdfs-nginx-module模块
1) 下载 fastdfs-nginx-module
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/master.zip
2) 解压
unzip master.zip
3) 停止nginx服务
sudo nginx -s stop
4) nginx添加fastdfs-nginx-module模块重新编译安装
进入nginx解压目录
cd nginx-1.14.0/
nginx配置fastdfs-nginx-module模块
./configure --with-http_ssl_module --user=root --add-module=../fastdfs-nginx-module-master/src/
编译
make
注意:编译时可能会出现错误,如出现,解决方式如下:
cd fastdfs-nginx-module-master/src/
vim config
修改文件内容如下:
ngx_module_incs="/usr/include/fastcommon /usr/include/fastdfs" 说明:里面两个路径是上文中记录的
CORE_INCS="$CORE_INCS /usr/include/fastcommon /usr/include/fastdfs"
修改后重新 nginx配置fastdfs-nginx-module模块
安装
sudo make install
5) 查看Nginx的模块
nginx -V
若有下面配置则证明模块添加成功:
configure arguments: --add-module=../fastdfs-nginx-module-master/src/
6) 修改配置文件1
复制 fastdfs-nginx-module 源码中的配置文件mod_fastdfs.conf,并修改配置
sudo cp ~/download/fastdfs-nginx-module-master/src/mod_fastdfs.conf /etc/fdfs/
编辑mod_fastdfs.conf文件:
sudo vim /etc/fdfs/mod_fastdfs.conf
修改如下配置,其余默认即可:
#连接超时时间
connect_timeout=15
# TrackerServer的IP和端口
tracker_server=bdcTracker:22122
# StorageServer端口
storage_server_port=23000
# 如果文件ID的uri中包含group分组信息,则要设置为true
url_have_group_name = true
# Storage配置的store_path0路径,必须和storage.conf中的一致
store_path0=/root/data/fastdfs/storage
7) 修改配置文件2
复制 FastDFS 源码中的配置文件到/etc/fdfs 目录:
cd ~/download/fastdfs-5.11/conf/
sudo cp anti-steal.jpg http.conf mime.types /etc/fdfs/
8) 修改配置文件3
修改nginx的配置文件nginx.conf,修改下面配置,其它不变:
sudo vim /usr/local/nginx/conf/nginx.conf
#location /group1/M00/ {
#alias /home/bdc/data/fastdfs/storage/data/;
#}
#添加fastdfs-nginx-module模块
location ~/group([0-9])/M00/ {
ngx_fastdfs_module;
}
注意:
1) nginx.conf 配置中的 listen 80端口值要与/etc/fdfs/storage.conf中的http.server_port=80 (前面配置为80了)端口值相对应;如果改成其它端口,则需要统一,同时在防火墙中打开该端口。
2) location 的配置,在集群模式中,有多个group,所以这里以正则的方式配置,如果是单一节点可以只配置指定group。
9) 启动Nginx
sudo nginx
打印类似如下信息,则配置成功:
ngx_http_fastdfs_set pid=119826
10) http访问
能获取到文件,则nginx配置成功;注意和前面中直接使用nginx路由访问不同的是,这里配置 fastdfs-nginx-module 模块,可以重定向文件链接到源服务器取文件。
http://bdc:80/group1/M00/00/00/wKhphVrwGUmAduGXAAHjhVtVRZw426.jpg
wget http://bdc:80/group1/M00/00/00/wKhphVrwGUmAduGXAAHjhVtVRZw426.jpg
好了,到此FastDFS单节点安装配置成功,接下来我们使用Java操作FastDFS实现文件上传和下载,最后将单节点模式改为集群模式
JAVA代码上传
package com.fdfs.demo; import org.csource.fastdfs.ClientGlobal; import org.csource.fastdfs.StorageClient; import org.csource.fastdfs.StorageServer; import org.csource.fastdfs.TrackerClient; import org.csource.fastdfs.TrackerServer; public class Demo1 { public static void main(String[] args) throws Exception { //加载配置文件,配置文件中的内容就是tracker服务的地址 ClientGlobal.init("fdfs_client.conf"); //创建一个TrackerClient对象 TrackerClient trackerClient = new TrackerClient(); //使用TrackerClient对象创建连接,获得一个TrackerServer对象 TrackerServer trackerServer = trackerClient.getConnection(); // 定义存储服务器对象句柄 StorageServer storageServer = null; StorageClient storageClient = new StorageClient(trackerServer, storageServer); String[] strings = storageClient.upload_file("D:/log.txt", "txt", null); for (String str : strings) { System.out.println(str); } } }
connect_timeout = 2 network_timeout = 30 charSet = UTF-8 http.tracker_http_port = 80 http.anti_steal_token = no http.secret_key = FastDFS1234567890 tracker_server = 192.168.220.128:22122