分别介绍基于源码进行单机版搭建,和基于Docker进行分布式搭建。
一般实际开发中可以选择使用后者,这里介绍前者的作用是为了熟悉FastDFS的架构设计。
1.基于源码单机版搭建
- 配置依赖环境
第一步:FastDFS是源码安装,先从官网下载源码,进行编译,编译依赖gcc环境,所以首先安装gcc。使用yum可以不管所依赖的库,自动寻找依赖关系。
yum –y install gcc-c++
第二步:FastDFS依赖libevent库,所以需要安装这个库。
yum –y install libevent
第三步:上传安装包
Fast-nginx-model.tar.gz
fastDFS.tar.gz
libfastcommon.tar.gz
nginx.tar.gz
- 安装libfastcommon
第四步:Libfastcommon是FastDFS提供的,包含了FastDFS所需的基础库。
tar –zxvf libfastcommon.tar.gz
cd libfastcommon
./make.sh
./make.sh install
第五步:将编译出来的libfastcommon拷贝到/usr/lib目录下,因为FastDFS默认从这个目录查找。
cp /usr/lib64/libfastcommon.so /usr/lib
- 安装FastDFS
第六步:此处不考虑分布式,如果要分布式部署,tracker和storage应该分别占一台服务器。
tar –zxvf FastDFS.tar.gz
cd FastDFS
./make.sh
./make.sh install
安装成功后,将安装目录下conf的文件拷贝到/etc/fdfs下,用于nginx。
cp /FastDFS/conf/*.* /etc/fdfs
- 安装Tracker服务
第七步:修改Tracker的配置
vim /etc/fdfs/tracker.conf
base_path=/opt/fastdfs/tracker#配置tracker存储数据的目录
base_path中设置文件的存储位置。
第八步:启动Tracker服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
//重启如下
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
第九步:配置开机自启动Tracker服务
vim /etc/rc.d/rc.local
将启动tracker命令加进来。
- 安装Storage服务
第十步:修改Storage配置
vim /etc/fdfs/storage.conf
group_name=group1
base_path=/usr/local/fastdfs/FastDFS/storage #storage存储数据目录
store_path0=/usr/local/fastdfs/FastDFS/storage/files #真正存放文件的目录,对应生成url中的M0,可以设置多个
tracker_server=ip:prot #配置跟踪器的ip地址和端口号22122
storage中需要保存数据和日志文件,所以配置路径。此外storage需要向tracker上报状态,所以需要配置tracker的ip和端口号。storage中需要配置group_name,表示本storage server所属的group名。
第十一步:启动Storage服务,服务启动时间较久,原因是在base_path/store_path0路径下创建一堆文件夹,用于存储文件。
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf
#重启使用
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
第十二步:配置开机自启动Storage服务
vim /etc/rc.d/rc.local
将启动storage命令加进来
- 配置客户端
第十三步:将libfdfsclient.so库拷贝到/usr/lib目录下
cp /usr/local/fastdfs/FastDFS/client/libfdfsclient.so /usr/lib
第十四步:修改配置文件/etc/fdfs/client.conf
vim /etc/fdfs/client.conf
base_path=…修改存储数据和日志文件路径
tracker_server=ip:port,因为需要跟tracker交互
- 测试验证
第十五步:执行命令/usr/bin/fdfs_test /etc/fdfs/client.conf upload 上传文件名,执行成功之后,返回url。
至此,文件上传可以正常使用,然而还无法通过url来访问文件,原因可能有两点:①防火墙没有开放80端口;②FastDFS并不具备处理http访问的能力,需要Nginx来配合才行。
加入Nginx,整个系统组成如下所示:
注意点:上传文件到FastDFS后获取到“storageGroup1/M00/03/4B/wKgC6F7WAHCALk3lAAMZFZE3Mdc320.png”,将这个地址与Nginx服务器的ip、监听的端口和这个地址进行拼装,送到前端展示。
client端通过URL访问,首先到达Nginx,Nginx中配置监听到Http访问路径为访问FastDFS文件时,交给Nginx_FastDFS插件处理,插件负责分别访问tracker和storage,返回图片。
可以先安装Nginx-FastDFS插件,配置好与FastDFS的连接;再安装Nginx,配置Nginx到Nginx-FastDFS插件的连接。
第一步:安装Nginx-FastDFS插件
解压:
tar –zxvf fastdfs-nginx-module.tar.gz
修改config配置文件:vim src/config
修改CORE_INCS和CORE_LIBS目录,跟前面的usr/lib保持一致。
修改fastdfs-nginx-module/src/mod_fastdfs.conf,先将本文件复制到/etc/fdfs目录下,编辑如下:
nginx插件既要和tracker交互,又要和storage交互,所以需要配置tracker的ip和端口,配置storage的端口和文件存放目录(storage ip地址由tracker返回)。
第二步:安装Nginx
①Nginx也是源码安装,首先需要配置依赖环境
②解压Nginx
③进入Nginx目录,对Nginx重新配置,将fastdfs-nginx插件编译进去,下面命令到src目录
此处一直到src目录,这样就将fastdfs-nginx插件编译到Nginx中,生成新的nginx。
④编译,Nginx默认安装到/usr/local/nginx目录下
make
make install
⑤配置Nginx,修改如下,表示监听到访问路径为/group1/M00时,交给ngx_fastdfs_module来处理,这里就是配置Nginx到Nginx插件的连接。
cd /usr/local/nginx/conf
vim nginx.conf
⑥启动Nginx
cd /usr/local/nginx/sbin
./nginx
至此,可以通过url就可以访问文件了。
2.基于Docker分布式搭建
搭建步骤如下所示:
第一步:拉取镜像
docker pull morunchang/fastdfs
第二步:运行tracker
docker run -d --restart=always --name back-server-fdfs-tracker --net=host morunchang/fastdfs sh tracker.sh
第三步:运行storage
docker run -d --restart=always --name back-server-fdfs-storage --net=host -v /data/fast_data:/data/fast_data -e TRACKER_IP=<your tracker server address>:22122 -e GROUP_NAME=storageGroup1 morunchang/fastdfs sh storage.sh
-v表示挂载宿主机的目录,冒号":"前面的目录是宿主机目录,后面的目录是容器内目录;
使用的网络模式是-net=host;
GROUP_NAME是组名,如果要备份,可以创建相同组名的docker;如果要扩容,创建新的组名的docker。
第四步:修改storage容器内部的nginx.conf
storage镜像内部运行了nginx进程。
可以直接将新的nginx.conf拷贝过去,其中最重要的部分如下所示:
Nginx监听8080端口,监听到访问路径为/M00时,交给ngx_fastdfs_module来处理。
nginx.conf拷贝命令如下:
docker cp nginx.conf back-server-fdfs-storage:/etc/nginx/conf/
nginx.conf内容如下:
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
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;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server {
listen 8080;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
location ~ /M00 {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
root /data/fast_data/data;
ngx_fastdfs_module;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
第五步:重启storage
docker restart back-server-fdfs-storage