fastdfs是开源的高性能分布式文件系统。本文不会全面介绍fastdfs,仅仅介绍在ubuntu18.04上安装fastdfs的流程和注意事项,并列出参考文章的链接。fastdfs从 V4.05 以后去除了对http服务的支持,同时以nginx模块的形式通过nginx提供http服务。所以需要同步安装fastdfs和nginx。参考文章:https://www.cnblogs.com/chiangchou/p/fastdfs.html
fastdfs需要自己下载源代码并编译安装。fastdfs依赖libfastcommon。nginx可以由于需要集成fastdfs-nginx-module,也需要下载源代码并编译安装。
1、通过命令行安装C语言及C++通用编译工具。
#编译C及C++项目需要的编译工具
sudo apt-get install build-essential
#pcre支持正则表达式,nginx中会用到
sudo apt-get install libpcre3 libpcre3-dev
#zlib用于对http数据包做gzip格式的压缩。
sudo apt-get install lib1g-dev
#如果nginx需要https协议,则需要安装openssl
sudo apt-get install openssl libssl-dev
2、下载libfastcommon,并编译安装.
下载地址:https://github.com/happyfish100/libfastcommon
下载到本地,进入到代码目录,编译及安装
#进入到主目录
cd libfastcommon
#编译及安装
./make.sh
./make.sh install
3、下载fastdfs,并编译安装
下载地址:https://github.com/happyfish100/fastdfs
下载到本地,进入到代码目录,编译及安装
#进入到主目录
cd fastdfs
#编译及安装
./make.sh
./make.sh install
4、跟踪服务器和存储服务器可以分别安装到相同的服务器上,也可以安装到同一个服务器上。下面是跟踪服务器配置。
#在Tracker Server电脑上创建数据存储目录
mkdir -p /data/fastdfs/tracker
#编辑配置文件tracker.conf
cd /etc/fdfs
cp tracker.conf.sample tracker.conf
vim tracker.conf
#以下是修改tracker.conf的内容
#日志数据路径
base_path=/data/fastdfs/tracker
#上传文件时选择group的方法
#0:轮询,1:指定组,2:选择剩余空间最大
store_lookup=2
#如果上面的配置是1,那么这里必须指定组名。否则指定也不生效
store_group=group2
#上传文件时选择server的方法
#0:轮询,1:按IP地址排序,2:通过权重排序
store_server=0
#storage上预留空间
reserved_storage_space=10%
http.server_port=8080
#保存并退出
配置完成后,启动Tracker Server
#启动服务命令。此服务脚本存储在/etc/init.d/,是通过init启动的服务。后面会介绍配置通过systemctl管理服务的方法。
service start fdfs_trackerd
#查看Tracker Server端口的命令
netstat -unltp | grep gdfs
5、存储节点配置
#在Storage服务器上,创建数据存储目录
mkdir -p /data/fdfs_storage/base
mkdir -p /data/fdfs_storage/storage0
mkdir -p /data/fdfs_storage/storage1
#编辑配置文件
cd /etc/fdfs
cp storage.conf.sample storage.conf
vim storage.conf
#如下编辑各项配置
#storage server 所属组名
group_name=group1
#绑定IP,默认为本机IP
bind_addr=
#storage server 的端口
port=23000
#日志数据路径
base_path=/data/fdfs_storage/base
#storage path的个数
store_path_count=2
#根据store_path_count的值,部署从storage0到storage(N-1)个存储路径
store_path0=/data/fdfs_storage/storage0
store_path1=/data/fdfs_storage/storage1
#跟踪服务器地址及端口,可以配置多个服务器,一行一个
tracker_server=10.74.7.242:22122
tracker_server=10.74.7.243:22122
#编辑完成后,保存
:wq
保存配置文件后,启动存储节点
#启动存储服务。此服务脚本存储在/etc/init.d/,是通过init启动的服务。后面会介绍配置通过systemctl管理服务的方法。
service fdfs_storaged start
#检查服务运行状态
/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
6、配置客户端
回到Tracker Server服务器上,修改客户端配置文件
#修改客户端配置文件
cd /etc/fdfs
cp client.conf.sample client.conf
vim client.conf
#修改的内容如下:
#tracker 服务器文件路径
base_path=/data/fastdfs/tracker
#tracker服务器IP地址和端口
tracker_server=10.74.7.242:22122
#tracker服务器的http端端口号,必须和tracker的设置一样
http.tracker_server_port=8080
配置完成后,可以通过命令上传文件
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf image.png
上传成功后,返回文件路径:group1/M00/00/00/CkoH8lxBni2AMLyqAADwGJmQPlE106.jpg
7、配置fdfs_trackerd和fdfs_storaged开机启动
通过指令./make install 安装fastdfs时,会在/etc/init.d/目录下生成启动脚本fdfs_trackerd和fdfs_fdfs_storaged。但这两个指令需要工具chkconfig来配置开机启动,或者在文件local.rd中配置。但这两种配置方式在最新的linux操作系统特别是ubuntu 18.04中已经不建议使用。而建议使用systemctl方式管理应用程序的启动。
首先,把/etc/init.d/下的启动脚本fdfs_trackerd和fdfs_fdfs_storaged移动到工作目录下。
然后,在目录/lib/systemd/system/下创建两个服务文件
cd /lib/systemd/system/
touch fdfs_trackerd.service
touch fdfs_storaged.service
fdfs_trackerd.service的内容如下:
[Unit]
Description=fastdfs tracker daemon
After=initrd.target
[Service]
Type=forking
ExecStart=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
ExecReload=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
ExecStop=/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop
[Install]
WantedBy=multi-user.target
fdfs_storaged.service的内容如下:
[Unit]
Description=fastdfs storaged daemon
After=initrd.target
[Service]
Type=forking
PIDFile=/home/walson/data/fdfs_storage/base/data/fdfs_storaged.pid
ExecStart=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
ExecReload=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
ExecStop=/usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop
[Install]
WantedBy=multi-user.target
配置完成后,启动服务:
#刷新配置文件
systemctl daemon_reload
systemctl start fdfs_trackerd
systemctl start fdfs_storaged
#开启开机自启动
systemctl enable fdfs_trackerd
systemctl enable fdfs_storaged
8、安装nginx
下载已发布的nginx源码:https://github.com/nginx/nginx/releases
下载已发布的fastdfs-nginx-module源码:https://github.com/happyfish100/fastdfs-nginx-module/releases
把下载的压缩包移动到/opt/目录下,并分别解压。
修改fastdfs-nginx-module的配置文件fastdfs-nginx-module-1.20/src/config,否则编译时会报错:/usr/local/include/fastdfs/fdfs_define.h:15:27: 致命错误:common_define.h:没有那个文件或目录。
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
编译并安装nginx:
#进入nginx文件夹
cd /nginx-release-1.14.2
#配置编译参数,生成Makefile文件
./auto/configure --/data/nginx \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_stub_status_module \
--add-module=/opt/fastdfs-nginx-module-1.20/src
make
make install
安装完成后,通过命令复制相关文件
cp /opt/fastdfs-nginx-module-1.20/src/mod_fastdfs.conf /etc/fdfs/
cd /opt/fastdfs-5.11/conf
cp anti-seal.jpg http.conf mime.types /etc/fdfs/
修改配置文件mod_fastdfs.conf
#通过vim修改配置文件
vim /etc/fdfs/mod_fastdfs.conf
#修改内容如下
#日志目录
base_path=/tmp
#跟踪服务器,可以配置多个
tracker_server=10.74.7.242:22122
#url中是否有group名称
url_have_group_name=true
#storage path的个数
store_path_count=2
#根据storage_path_count的值,设置从storage0到storage[N-1]个路径
store_path0=/data/fdfs_storage/storage0
store_path1=/data/fdfs_storage/storage1
然后修改nginx.conf
worker_processes 2;
worker_rlimit_nofile 1024;
events {
use epoll;
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 65;
gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ /group[0-9]/M00 {
#root html;
#index index.html index.htm;
ngx_fastdfs_module;
}
}
}
使用命令创建两个软链接
ln -s /dta/fdfs_storage/storage0 /data/fdfs_storage/storage0/M00
ln -s /dta/fdfs_storage/storage1 /data/fdfs_storage/storage1/M00
9、配置开机启动
#创建服务管理文件
cd /lib/systemd/system/
touch nginx.service
vim nginx.service
nginx.service内容如下:
[Unit]
Description=Nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
刷新并启动
systemctl daemon-reload
systemctl start nginx.service
#开机自启动
systemctl enable nginx.service
9、通过客户端访问fastdfs
若想通过客户端远程访问fastdfs,需要在开通防火墙的22122接口。iptables的使用请参考:https://blog.csdn.net/sanve/article/details/80881380
iptables -A INPUT -p tcp --dport 22122 -j ACCEPT
fastfs客户端java版源码地址:https://github.com/happyfish100/fastdfs-client-java
参考官方中的指引生成jar包,不再累述。
客户端代码如下:
package org.demo.fastdfs;
import java.io.IOException;
import org.csource.common.MyException;
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 ClientConfig {
public static void main(String[] args){
try {
config();
System.out.println("ClientGlobal.configInfo(): " + ClientGlobal.configInfo());
testUpload();
}catch (Exception e) {
e.printStackTrace();
}
}
public static void config() throws IOException, MyException {
ClientGlobal.initByProperties("fastdfs-client.properties");
}
private static void testUpload() {
TrackerClient trackerClient = new TrackerClient();
TrackerServer trackerServer;
try {
trackerServer = trackerClient.getConnection();
StorageServer storageServer = null;
StorageClient storageClient = new StorageClient(trackerServer, storageServer);
String localFilename = "D:/mysqlpeizhi.JPG";
String[] fileNames = storageClient.upload_file(localFilename, "jpg", null);
for(String fileName : fileNames) {
System.out.println(fileName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
通过nginx服务器访问生成页面如下: