分布式图片服务器——FastDFS
FastDFS由淘宝开发平台部资深架构师余庆开发。该开源项目的主页是 http://code.google.com/p/fastdfs
github:https://github.com/happyfish100
FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。
Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上,Storage server 没有实现自己的文件系统而是利用操作系统的文件系统来管理文件。可以将storage称为存储服务器。
Tracker:管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
Storage:实际保存文件 Storage 分为多个组,每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有主从的概念。
安装
安装libfastcommon
- 安装gcc yum install gcc
- 解压libfastcommon-1.0.39.tar
- 进入到解压好的目录编译 ./make.sh
- 安装编译好的库 ./make.sh install
libfastcommon默认会被安装到/usr/lib64/libfastcommon.so,且安装完后,会建立软链接到:/usr/lib/libfastcommon.so
可以查看,ll /usr/lib目录下:
安装FastDFS
- 解压fastdfs-5.11.tar
- 进入解压好的目录 ./make.sh 进行编译
- 安装编译好的类库 ./make.sh install(如果有错误信息就删除重新安装或者重启,最好安装在usr目录下)
- 修改配置文件格式(把/etc/fdfs下的.sample的配置文件修改为.conf)
cd /etc/fdfs/
cp client.conf.sample client.conf
cp storage.conf.sample storage.conf
cp tracker.conf.sample tracker.conf
安装tracker
- 创建tracker工作目录(用来保存tracker的data和log),这个目录可以根据个人习惯来创建目录的位置
mkdir -p /usr/fdfs/tracker
- 配置tracker
cd /etc/fdfs
vi tracker.conf
1.disabled=false #默认开启
2.port=22122 #默认端口号
3.base_path=/usr/fdfs/tracker #我刚刚创建的目录
4.http.server_port=6666 #默认端口是8080,容易冲突
- 启动tracker:service fdfs_trackerd start
- 如果不能启动或提示用systemctl可改用命令:systemctl start fdfs_trackerd
启动成功后可以看到Starting FastDFS tracker server:
进入创建的tracker目录,发现目录中多了data和log两个目录
查看进程:ps -ef | grep fdfs
查看一下tracker的端口监听情况(需要先安装net-tools网络工具包:yum install net-tools -y)
netstat -antp|grep fdfs
端口22122是否成功监听
设置tracker开机启动
1、查看开启启动文件权限:ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 220 11月 23 2013 /etc/rc.d/rc.local
2、有x执行权限(如果没有,需要加一下:chmod +x /etc/rc.d/rc.local)
3、修改rc.local
vi /etc/rc.d/rc.local
service fdfs_trackerd start
安装storage
- 创建storage工作目录(一个storage和一个storage_data用来存储数据),可以根据个人习惯来创建目录的位置
mkdir -p /usr/fdfs/storage
mkdir -p /usr/fdfs/storage_data
- 配置storage
vi /etc/fdfs/storage.conf
1.disabled=false #默认
2.group_name=group1 #组名,根据实际情况修改
3.port=23000 #设置storage的端口号,默认是23000,同一个组的storage端口号必须一致
4.base_path=/usr/fdfs/storage #设置storage数据文件和日志目录
5.store_path_count=1 #存储路径个数,需要和store_path个数匹配
6.store_path0=/usr/fdfs/storage_data #实际文件存储路径
7.tracker_server=192.168.188.138:22122 #我虚拟机的ip地址
8.http.server_port=8888 #设置 http 端口号
- 启动storage:service fdfs_storaged start
- 如果不能启动或提示用systemctl可改用命令:systemctl start fdfs_storaged
启动成功后可以看到Starting FastDFS storage server:
进入创建的tracker目录,发现目录中多了data和log两个目录
查看进程:ps -ef | grep fdfs
查看一下tracker的端口监听情况(需要先安装net-tools网络工具包:yum install net-tools -y)
netstat -antp|grep fdfs
端口22122是否成功监听
设置storage开机启动
1、查看开启启动文件权限:ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 220 11月 23 2013 /etc/rc.d/rc.local
2、有x执行权限(如果没有,需要加一下:chmod +x /etc/rc.d/rc.local)
3、修改rc.local
vi /etc/rc.d/rc.local
service fdfs_storaged start
校验整合
fastdfs的东西都已安装完成,最后我们还要确定一下,storage是否注册到了tracker中去
查看命令:/usr/bin/fdfs_monitor /etc/fdfs/storage.conf
如果输出截图所示,则整合成功
测试文件上传
fastdfs执行./make.sh install后,一些执行命令会被安装到/usr/bin/下
查看/usr/bin下的fastdfs执行命令:ls -la /usr/bin/fdfs*
配置客户端
修改客户端的配置文件:vi /etc/fdfs/client.conf
修改内容:
base_path=/usr/fdfs/tracker #tracker服务器文件路径
tracker_server=192.168.2.123:22122 #tracker服务器IP地址和端口号
http.tracker_server_port=6666 # tracker 服务器的http端口号,必须和tracker的设置对应起来
模拟上传
上传一张本地图片到usr目录
确定图片位置后,我们输入上传图片命令把图片上传到FastDFS服务器
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /usr/test.jpg
成功后会返回图片的路径:group1/M00/00/00/wKgCe162rfuAQjZfAADFbi0oR0A946.jpg
组名:group1
虚拟磁盘:M00
目录:00/00
文件名称:wKgCe162rfuAQjZfAADFbi0oR0A946.jpg
我们上传的图片会被上传到我们创建的storage_data目录的data目录下
fastdfs的nginx模块安装
安装nginx之前的准备:安装nginx所需的依赖lib(yum安装存在就覆盖,没有进行安装)
yum -y install pcre pcre-devel
yum -y install zlib zlib-devel
yum -y install openssl openssl-devel
安装nginx并添加fastdfs-nginx-module
准备工作
- 上传nginx、fastdfs-nginx-module至usr:
- 分别解压:tar -xvf
- 将nginx额外复制一份,形成nginx-1.14.2-1和nginx-1.14.2-2(因为tracker和storage各需一个nginx)
- 通过fastdfs-nginx-module将nginx-1.14.2-1和nginx-1.14.2-2粘合在一起
开始整合
- 修改fastdfs-nginx-module中的错误(路径)
- 配置storage-nginx
- 配置tracker-nginx
- 测试
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
上述路径是我们安装fastdfs自动配置好的路径,而fastdfs-nginx-module中配置文件的这两项路径与我们安装好后自动生成的路径不一致,如果不修改会造成整合错误
修改之前
修改好之后进入nginx-1.14.2-1,重新configure(配置,前缀内容为输出路径):
./configure --prefix=/usr/nginx-1 --add-module=/usr/fastdfs-nginx-module-1.20/src
配置完成后进行编译make:make
编译完成后进行安装:make install
回到usr目录下ls查看,可以看到nginx-1目录,说明第一个nginx和fastdfs-nginx-module粘合编译完成
配置storage-nginx
修改 vim /usr/nginx-1/conf/nginx.conf
修改监听端口 listen 9999, 新增location
server {
listen 9999;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
location ~/group1/M00 {
root /usr/fdfs/storage_data/data;
ngx_fastdfs_module;
}
location = /50x.html {
root html;
}
}
然后进入FastDFS安装时解压的目录,将http.conf和mime.types拷贝到/etc/fdfs目录下:
cd /usr/fastdfs-5.11/conf
cp http.conf /etc/fdfs/
cp mime.types /etc/fdfs/
把fastdfs-nginx-module安装目录中src目录下的mod_fastdfs.conf也拷贝到/etc/fdfs目录下:
cd /usr/fastdfs-nginx-module-1.20/src
cp mod_fastdfs.conf /etc/fdfs/
在/etc/fdfs/下 对mod_fastdfs.conf文件进行修改
vim /etc/fdfs/mod_fastdfs.conf
base_path=/usr/fdfs/storage #保存日志目录
tracker_server=192.168.188.138:22122 #tracker服务器的IP地址以及端口号
storage_server_port=23000 #storage服务器的端口号,默认即可
url_have_group_name = true #文件 url 中是否有 group 名,改为true
store_path0=/usr/fdfs/storage_data #存储路径
group_count = 1 #设置组的个数,事实上这次只使用了group1
在文件的最后,设置group
[group1]
group_name=group1
storage_server_port=23000
store_path_count=1
store_path0=/usr/fdfs/storage_data
启动nginx-1:/usr/nginx-1/sbin/nginx
设置开机自动启动nginx:
修改rc.local
vim /etc/rc.d/rc.local
在最后增加:/usrl/nginx-1/sbin/nginx
配置tracker-nginx
进入nginx-1.14.2-1-2,配置:
./configure --prefix=/usr/nginx-2 --add-module=/usr/fastdfs-nginx-module-1.20/src
配置完成后进行编译make:make
编译完成后进行安装:make install
修改nginx-2的nginx.conf,在http中做修改
upstream fdfs_group1 {
server 127.0.0.1:9999;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location /group1/M00 {
proxy_pass http://fdfs_group1;
}
#location / {
# root html;
# index index.html index.htm;
#}
#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;
}
}
启动测试,访问默认端口80
设置开机自启
修改rc.local
vim /etc/rc.d/rc.local
在最后增加:/usrl/nginx-2/sbin/nginx
测试访问tracker拿到storage中存储的数据