fastdfs安装及nginx整合

先简单介绍一下FastDfs

他是一个文件存储服务器,可以对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。
特别适合以文件为载体的在线服务,如相册网站、视频网站、电商网站等等。特别适合以中小文件(建议范围:4KB < file_size <500MB)为载体的在线服务。

FastDFS 系统有三个角色:跟踪服务器(Tracker Server)、存储服务器(Storage Server)和客户端(Client)。

这里主要讲一下安装的过程以及fastdfs可以实现的一些图片的处理的功能

tracker和storage共同需要安装的部分:

1.安装gcc环境

yum install -y gcc-c++

2.安装libevent,FastDFS依赖libevent库

yum install -y libevent

3.安装libfastcommon,libfastcommon是FastDFS官方提供的包,包含了FastDFS运行所需要的一些基础库。

wget https://github.com/happyfish100/libfastcommon/archive/V1.0.39.tar.gz
tar -zxvf V1.0.39.tar.gz
cd libfastcommon-1.0.39
./make.sh && ./make.sh install

4.拷贝libfastcommon.so文件至/usr/lib目录

cp /usr/lib64/libfastcommon.so /usr/lib/

5.下载安装FastDFS,进入FastDFS目录,编译安装

wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
tar -zxvf V5.11.tar.gz
cd cd fastdfs-5.11
./make.sh && ./make.sh install

6.拷贝/root/fastdfs-5.11/conf目录下的文件到/etc/fdfs目录下

cp /software/fastdfs-5.11/conf/* /etc/fdfs   这个目录按照自己的安装路径替换

tracker server配置

1.修改/etc/fdfs/tracker.conf

vim /etc/fdfs/tracker.conf
修改内容如下:
base_path=/kkb/server/fastdfs/tracker   ## 就是为trackServer创建一个目录以存放他的data和logs

2.创建tracker服务器上面的目录

mkdir /kkb/server/fastdfs/tracker -p

storage server配置

1.修改/etc/fdfs/storage.conf

vim /etc/fdfs/storage.conf
修改内容如下:
#指定storage的组名
group_name=group1
base_path=/kkb/server/fastdfs/storage   ## 创建一个存储图片和日志的地方
store_path0=/kkb/server/fastdfs/storage  ## 图片存储的位置
#如果有多个挂载磁盘则定义多个store_path,如下
#store_path1=.....
#store_path2=......
#配置tracker服务器IP和端口
tracker_Server=192.168.96.147:22122
#如果有多个则配置多个tracker
#tracker_Server=192.168.101.4:22122

2.创建storage服务器上面的目录

mkdir /kkb/server/fastdfs/storage -p

启动

1.trackServer启动

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf

2.storageServer启动

/usr/bin/fdfs_storaged /etc/fdfs/storage.conf

3.可以使用命令看一下服务器进程

ps -ef | grep fdfs

上传图片测试

1.修改client.conf

vim /etc/fdfs/client.conf
修改内容如下:
base_path=/kkb/server/fastdfs/client   ## 数据目录
tracker_Server=111.231.106.221:22122  

2.创建client的数据目录

mkdir -p /kkb/server/fastdfs/client

3.使用fdfs_test命令将/home下的xxx.png上传到FastDFS中

/usr/bin/fdfs_test /etc/fdfs/client.conf upload /etc/fdfs/anti-steal.jpg

avator
这里面会显示当前下载的图片的路径: http://192.168.96.148/group1/M00/00/00/wKhglFzNPWGAGOQ1AABdrSqbHGQ948.jpg
这个不能直接访问肯定要通过nginx来整合访问 对应的磁盘文件在
/kkb/server/fastdfs/storage/data/00/00/wKhglFzNPWGAGOQ1AABdrSqbHGQ948.jpg

nginx的安装

Nginx需要每一台storage server都需要安装
1.上传nginx压缩包

yum install -y lrzsz
rz

2.安装PCREPCRE:(Perl Compatible Regular Expressions)是一个Perl库,包括 perl 兼容的正则表达式库。Nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库

yum install –y pcre-devel

3.安装ZLIB:zlib库提供了很多种压缩和解压缩的方式,Nginx使用zlib对http包的内容进行gzip,所以需要在linux上安装zlib库。

yum install –y zlib-devel

4.安装OPENSSL,OpenSSL 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
Nginx不仅支持http协议,还支持https(即在ssl协议上传输http),所以需要在linux安装openssl库

yum install –y openssl-devel

5.解压缩

tar -xf nginx-1.15.6.tar.gz

6.执行configure配置 切到cd nginx-1.15.6/(由个人安装位置而定)

./configure \
--prefix=/kkb/server/nginx \    ## nginx安装目录  确保目录存在
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_gzip_static_module \

7.创建临时目录
上面执行的configure命令,设置了一些配置参数,其中的一些参数指定的目录一定要存在。

mkdir /var/temp/nginx -p

8.编译安装

make && make install

9.启动Nginx(目录取决于个人的安装目录)

cd /kkb/server/nginx/sbin
./nginx

nginx和fastdfs的整合

为什么要使用Nginx的扩展模块来访问存储的文件,原因有两个:

  • 如果进行文件合并,那么不使用FastDFS的nginx扩展模块,是无法访问到具体的文件的,因为文件合并之后,多个小文件都是存储在一个trunk文件中的,在存储目录下,是看不到具体的小文件的。
  • 如果文件未同步成功,那么不使用FastDFS的nginx扩展模块,是无法正常访问到指定的文件的,而使用了FastDFS的nginx扩展模块之后,如果要访问的文件未同步成功,那么会解析出来该文件的源存储服务器ip,然后将该访问请求重定向或者代理到源存储服务器中进行访问。

1.下载文件

wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz

2.解压缩

tar -zxvf V1.20.tar.gz

3.修改config文件(特别关键的一步)
修改 fastdfs-nginx-module/src/config 文件

cd fastdfs-nginx-module-1.20/src
vim config

修改前的内容是:

ngx_addon_name=ngx_http_fastdfs_module
if test -n "${ngx_module_link}"; then
ngx_module_type=HTTP
ngx_module_name=$ngx_addon_name
ngx_module_incs="/usr/local/include"
ngx_module_libs="-lfastcommon -lfdfsclient"
ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
ngx_module_deps=
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -
DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
. auto/module
else
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/local/include"
CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -
DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
fi

其中第5行和第15行要进行修改,修改后的内容如下

ngx_addon_name=ngx_http_fastdfs_module
if test -n "${ngx_module_link}"; then
ngx_module_type=HTTP
ngx_module_name=$ngx_addon_name
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
ngx_module_libs="-lfastcommon -lfdfsclient"
ngx_module_srcs="$ngx_addon_dir/ngx_http_fastdfs_module.c"
ngx_module_deps=
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -
DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
. auto/module
else
HTTP_MODULES="$HTTP_MODULES ngx_http_fastdfs_module"
NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_fastdfs_module.c"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"
CORE_LIBS="$CORE_LIBS -lfastcommon -lfdfsclient"
CFLAGS="$CFLAGS -D_FILE_OFFSET_BITS=64 -DFDFS_OUTPUT_CHUNK_SIZE='256*1024' -
DFDFS_MOD_CONF_FILENAME='\"/etc/fdfs/mod_fastdfs.conf\"'"
fi

4.拷贝mod_fastdfs.conf
将 fastdfs-nginx-module-1.20/src/mod_fastdfs.conf 拷贝至 /etc/fdfs/ 下

cp mod_fastdfs.conf /etc/fdfs/

5.修改mod_fastdfs.conf

vim /etc/fdfs/mod_fastdfs.conf
base_path=/kkb/server/fastdfs/storage
tracker_Server=192.168.96.147:22122 #url中是否包含group名称
url_have_group_name=true #指定文件存储路径,访问时使用该路径
store_path0=/kkb/server/fastdfs/storage

6.创建nginx/client目录

mkdir -p /var/temp/nginx/client

7.因为这里需要nginx与fastdfs的整合模块必须安装在nginx目录
(1)cd nginx-1.15.6/ 执行

./configure \
--prefix=/kkb/server/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_gzip_static_module \
--add-module=/software/nginx/fastdfs-nginx-module-1.20/src \  ## 加了此模块

(2)make && make install
怎样看这个模块是否安装成功呢 可以

/kkb/server/nginx/sbin/nginx -V

avator可在图片中查看已经安装的模块
8.修改nginx的conf文件

vim /kkb/server/nginx/conf/nginx.conf
修改内容如下:
server {
    listen 80;
    server_name localhost;
    location /group1/M00/{
    ngx_fastdfs_module;
    }
}

9.重启nginx

/kkb/server/nginx/sbin/nginx -s relaod

就可以通过fastdfs的扩展模块访问存储在fastdfs上面的图片了

fastdfs存储生成缩略图

这里主要演示是如何生成缩略图的
image_filter模块
nginx_http_image_filter_module 在 nginx 0.7.54 以后才出现的,用于对 JPEG, GIF和PNG 图片进行转换处理( 压缩图片、裁剪图片、旋转图片 )。这个模块默认不被编译,所以要在编译nginx源码的时候,加入相关配置信息(下面会给出相关配置)
1.安装gd,HttpImageFilterModule模块需要依赖gd-devel的支持

yum -y install gd-devel

2.将http_image_filter_module包含进来

cd /root/nginx-1.15.6

./configure \
--prefix=/kkb/server/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_gzip_static_module \
--add-module=/software/nginx/fastdfs-nginx-module-1.20/src \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module    ## 主要新加模块

make && make install

3.重启Nginx:由于添加了新的模块,所以nginx需要重新启动,不需要重新加载reload

/kkb/server/nginx/sbin/nginx -s stop
/kkb/server/nginx/sbin/nginx

4.修改nginx的conf文件

location ~ group1/M00/(.+)_(\d+)x(\d+)\.(jpg|gif|png) {
        # 设置别名(类似于root的用法,和下面的方式选择其中一个) 
        alias /kkb/server/fastdfs/storage/data/;
        # fastdfs中的ngx_fastdfs_module模块
        ngx_fastdfs_module;
        set $w $2;
        set $h $3;
        if ($w != "0") {
        rewrite group1/M00(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ group1/M00$1.$4
        break;
        }
        if ($h != "0") {
        rewrite group1/M00(.+)_(\d+)x(\d+)\.(jpg|gif|png)$ group1/M00$1.$4
        break;
        }
        #根据给定的长宽生成缩略图
        image_filter resize $w $h;
        #原图最大2M,要裁剪的图片超过2M返回415错误,需要调节参数image_filter_buffer
        image_filter_buffer 2M;
        #try_files group1/M00$1.$4 $1.jpg;
}

5.重新加载nginx

/kkb/server/nginx/sbin/nginx -s reload

6.这样就可以实现缩略图得访问
http://192.168.96.148/group1/M00/00/00/wKhglFzNSICADAHKABS7Otr-Ve0058_300x300.jpg
image_filter 模块详细配置说明:

image_filter off;
#关闭模块
image_filter test;
#确保图片是jpeg gif png否则返415错误
image_filter size;
#输出有关图像的json格式:例如以下显示{ "img" : { "width": 100, "height": 100, "type":
"gif" } } 出错显示:{}
image_filter rotate 90|180|270;
#旋转指定度数的图像,參数能够包括变量,单独或一起与resize crop一起使用。
image_filter resize width height;
#按比例降低图像到指定大小,公降低一个能够还有一个用"-"来表示,出错415,參数值可包括变量,能够与
rotate一起使用,则两个一起生效。
image_filter crop width height;
#按比例降低图像比較大的側面积和还有一側多余的载翦边缘,其他和rotate一样。没太理解
image_filter_buffer 10M;
#设置读取图像缓冲的最大大小,超过则415错误。
image_filter_interlace on;
#假设启用,终于的图像将被交错。对于JPEG,终于的图像将在“渐进式JPEG”格式。
image_filter_jpeg_quality 95;
#设置变换的JPEG图像的期望质量。可接受的值是从1到100的范围内。较小的值通常意味着既降低图像质量,降低
数据传输,推荐的最大值为95。參数值能够包括变量。
image_filter_sharpen 100;
#添加了终于图像的清晰度。锐度百分比能够超过100。零值将禁用锐化。參数值能够包括变量。
image_filter_transparency on;
#定义是否应该透明转换的GIF图像或PNG图像与调色板中指定的颜色时,能够保留。透明度的损失将导致更好的图
像质量。在PNG的Alpha通道总是保留透明度。

Nginx Image模块
本nginx模块主要功能是对请求的图片进行缩略/水印处理,支持文字水印和图片水印。
支持自定义字体,文字大小,水印透明度,水印位置。
判断原图是否是否大于指定尺寸才处理。 …等等
支持 jpeg / png / gif (Gif生成后变成静态图片)
1.安装nginx image模块 编译nginx前请确认您的系统已经安装了libcurl-dev libgd2-dev libpcre-dev 依赖库

yum install -y gd-devel pcre-devel libcurl-devel

2.下载nginx image模块,并解压缩

wget https://github.com/oupula/ngx_image_thumb/archive/master.tar.gz
tar -xf master.tar.gz

3.添加nginx image模块

cd /root/nginx-1.15.6

./configure \
--prefix=/kkb/server/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--with-http_gzip_static_module \
--add-module=/software/nginx/fastdfs-nginx-module-1.20/src \
--add-module=/software/fastdfs-nginx-module-1.20/src \  新增模块
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_realip_module \
--with-http_image_filter_module

make && make  install

4.添加新模块后需重新加载nginx配置文件

/kkb/server/nginx/sbin/nginx -s stop
/kkb/server/nginx/sbin/nginx

5.访问Fastdfs图片

location /group1/M00/{
            alias /kkb/server/fastdfs/storage/data/;
            image on;
            image_output on;
            2.2.4 配置参数说明
            image_jpeg_quality 75;
            image_water on;
            image_water_type 0;
            image_water_pos 9;
            image_water_transparent 80;
            image_water_file "/kkb/data/logo.png";   水印文件的位置
            # image_backend off;
            #配置一个不存在的图片地址,防止查看缩略图时图片不存在,服务器响应慢
            # image_backend_server http://www.baidu.com/img/baidu_jgylogo3.gif;
}

配置参数说明

image on/off 是否开启缩略图功能,默认关闭
image_backend on/off 是否开启镜像服务,当开启该功能时,请求目录不存在的图片(判断原图),将自动从
镜像服务器地址下载原图
image_backend_server 镜像服务器地址
image_output on/off 是否不生成图片而直接处理后输出 默认off
image_jpeg_quality 75 生成JPEG图片的质量 默认值75
image_water on/off 是否开启水印功能
image_water_type 0/1 水印类型 0:图片水印 1:文字水印
image_water_min 300 300 图片宽度 300 高度 300 的情况才添加水印
image_water_pos 0-9 水印位置 默认值9 0为随机位置,1为顶端居左,2为顶端居中,3为顶端居右,4为中部居
左,5为中部居中,6为中部居右,7为底端居左,8为底端居中,9为底端居右
image_water_file 水印文件(jpg/png/gif),绝对路径或者相对路径的水印图片
image_water_transparent 水印透明度,默认20
image_water_text 水印文字 "Power By Vampire"
image_water_font_size 水印大小 默认 5
image_water_font 文字水印字体文件路径
image_water_color 水印文字颜色,默认 #000000

此模块也可以实现图片缩略图的功能,访问格式如下:
http://192.168.96.148/group1/M00/00/00/wKhglFzNSICADAHKABS7Otr-Ve0058.jpg!c200x200.jpg 不过这不是等比压缩,是裁剪压缩的哪一种,所以图片压缩的话还是会采用image_filter模块,此模块主要还是实现图片加水印的功能,这个一些配置可以在nginx配置文件里面配置,当图片的格式大于多少的时候就会加水印 如下图
avator

Java客户端访问fastdfs 实现文件的上传

package com.kkb;

import org.csource.common.NameValuePair;
import org.csource.fastdfs.ClientGlobal;
import org.csource.fastdfs.StorageClient1;
import org.csource.fastdfs.StorageServer;
import org.csource.fastdfs.TrackerClient;
import org.csource.fastdfs.TrackerServer;

import java.net.URLDecoder;

/**
 * @Author: ZhangYang
 * @Date: 2019/4/29 16:16
 */
public class FastDFSClient {
    private static TrackerClient trackerClient = null;
    private static TrackerServer trackerServer = null;
    private static StorageServer storageServer = null;
    private static StorageClient1 client = null;
    // fdfsclient的配置文件的路径
    private static String CONF_NAME = "/fdfs/fdfs_client.conf";

    static {
        try {
            // 配置文件必须指定全路径
            String confName = FastDFSClient.class.getResource(CONF_NAME).getPath();
            // 配置文件全路径中如果有中文,需要进行utf8转码
            confName = URLDecoder.decode(confName, "utf8");
            System.out.println(confName);
            ClientGlobal.init(confName);
            trackerClient = new TrackerClient();
            trackerServer = trackerClient.getConnection();
            storageServer = null;
            client = new StorageClient1(trackerServer, storageServer);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public static String uploadFile(String fileName, String extName, NameValuePair[] metas) throws Exception {
        String result = client.upload_file1(fileName, extName, metas);
        System.out.println(result);
        return result;
    }

    public static void main(String[] args) {
        try {
            uploadFile("C:/logo.jpg","jpg",null);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

fastdfs合并存储

FastDFS提供的合并存储功能,默认创建的大文件为64MB,然后在该大文件中存储很多小文件。大文件中容纳一个小文件的空间称为一个Slot,规定Slot最小值为256字节,最大为16MB,也就是小于256字节的文件也需要占用256字节,超过16MB的文件不会合并存储而是创建独立的文件。
FastDFS提供了 合并存储 功能的实现,所有的配置都在 tracker.conf 文件之中
开启合并存储只需要设置 use_trunk_file = true 和 store_server=1

# which storage server to upload file
# 0: round robin (default)
# 1: the first server order by ip address
# 2: the first server order by priority (the minimal)
# Note: if use_trunk_file set to true, must set store_server to 1 or 2
store_server = 0
#是否启用trunk存储
use_trunk_file = false
#trunk文件最小分配单元
slot_min_size = 256
#trunk内部存储的最大文件,超过该值会被独立存储
slot_max_size = 16MB
#trunk文件大小
trunk_file_size = 64MB
#是否预先创建trunk文件
trunk_create_file_advance = false
#预先创建trunk文件的基准时间
trunk_create_file_time_base = 02:00
#预先创建trunk文件的时间间隔
trunk_create_file_interval = 86400
#trunk创建文件的最大空闲空间
trunk_create_file_space_threshold = 20G
#启动时是否检查每个空闲空间列表项已经被使用
trunk_init_check_occupying = false
#是否纯粹从trunk-binlog重建空闲空间列表
trunk_init_reload_from_binlog = false
#对trunk-binlog进行压缩的时间间隔
trunk_compress_binlog_min_interval = 0

配置就是这么简单具体的日后分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值