FastDFS-环境搭建

廉价感情. 提交于 2020-08-09 19:45:06

1. 安装 FastDFS

1.1 安装编译环境

yum install git gcc gcc-c++ make automake vim wget libevent -y

1.2 安装libfastcommon 基础库

#创建目录
mkdir /root/fastdfs
cd /root/fastdfs
#下载 基础库
git clone https://github.com/happyfish100/libfastcommon.git --depth 1
cd libfastcommon/
#编译安装基础库
./make.sh && ./make.sh install

1.3 安装FastDFS

cd /root/fastdfs
#下载 fdfs
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
tar -zxvf V5.11.tar.gz
cd fastdfs-5.11
#编译安装 fdfs
./make.sh && ./make.sh install

#配置文件准备(例子转化为具体配置)
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
cp /etc/fdfs/client.conf.sample /etc/fdfs/client.conf

#配置文件准备
cp /root/fastdfs/fastdfs-5.11/conf/http.conf /etc/fdfs
cp /root/fastdfs/fastdfs-5.11/conf/mime.types /etc/fdfs

1.4 修改 tracker server 配置

vim /etc/fdfs/tracker.conf
#服务端口   storage 和 client 连接 使用
port=22122
#日志数据目录
base_path=/home/fastdfs

1.5  修改 storage server 配置

vim /etc/fdfs/storage.conf
# storage server 端口设置
port=23000
# 数据和日志文件存储根目录
base_path=/home/fastdfs 
# 第一个存储目录
store_path0=/home/fastdfs 
#设置  tracker server 服务器端口(可多个)
tracker_server=192.168.211.136:22122
#tracker_server=192.168.211.136:22122
# http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
http.server_port=8888

1.6  启动

#创建 数据和日志文件存储根目录
mkdir /home/fastdfs -p
#添加权限
chmod -R 777 /home/fastdfs/data/

#启动 tracker server 服务
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
#启动 storage server 服务
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

1.7  检查

查看所有运行的端口
netstat -ntlp

查看 fdfs  可执行命令

ls -la /usr/bin/fdfs*

1.8  修改  client 配置

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/home/fastdfs
#tracker服务器IP和端口
tracker_server=192.168.211.136:22122
#保存后测试,返回ID表示成功 如:group1/M00/

1.9 常用命令

#上传文件
/usr/local/bin/fdfs_upload_file  <config_file> <local_filename>
#下载文件
/usr/local/bin/fdfs_download_file <config_file> <file_id> [local_filename]
#删除文件
/usr/local/bin/fdfs_delete_file <config_file> <file_id>

2. FDFS 添加 ngnix支持

2.1 安装fastdfs-nginx-module

cd /root/fastdfs
#下载  nginx-module
wget https://github.com/happyfish100/fastdfs-nginx-module/archive/V1.20.tar.gz
#解压
tar -xvf V1.20.tar.gz
cd fastdfs-nginx-module-1.20/src
vim config
修改第5 行 和 15 行 修改成
ngx_module_incs="/usr/include/fastdfs /usr/include/fastcommon/"
CORE_INCS="$CORE_INCS /usr/include/fastdfs /usr/include/fastcommon/"

2.2  修改 fastds 模块

# 模块配置
cp mod_fastdfs.conf /etc/fdfs/

vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.211.136:22122
url_have_group_name=true
store_path0=/home/fastdfs

2.3 安装 nginx

cd /root/fastdfs
#下载安装 nginx
wget http://nginx.org/download/nginx-1.15.6.tar.gz
tar -zxvf nginx-1.15.6.tar.gz
cd nginx-1.15.6/

yum -y install pcre-devel openssl openssl-devel

# 添加fastdfs-nginx-module模块
./configure --add-module=/root/fastdfs/fastdfs-nginx-module-1.20/src

编译安装
make && make install
查看模块是否安装上
/usr/local/nginx/sbin/nginx -V

2.4 nginx 配置

vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
listen 8888;
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
}

启动 nginx

  • start nginx:打开 nginx
  • nginx -t :测试配置文件是否有语法错误
  • nginx -s reopen:重启Nginx
  • nginx -s reload:重新加载Nginx配置文件,然后以优雅的方式重启Nginx
  • nginx -s stop:强制停止Nginx服务
  • nginx -s quit:优雅地停止Nginx服务(即处理完所有请求后再停止服务)
/usr/local/nginx/sbin/nginx

2.5 测试

3. fdfs 动态图片

3.1 lua

3.1.1 安装 lua

cd /root/fastdfs
#获取安装 luaJIT
wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz
tar -zxvf LuaJIT-2.0.4.tar.gz
cd LuaJIT-2.0.4
#编译
make && make install

#获取安装 ngx_devel_kit  lua-nginx-module
wget https://github.com/simpl/ngx_devel_kit/archive/v0.2.18.tar.gz
tar -zxvf v0.8.10.tar.gz 

wget https://github.com/openresty/lua-nginx-module/archive/v0.8.10.tar.gz
tar -zxvf v0.8.10.tar.gz 

#查看 lua 安装目录 和 命令 
ls /usr/local/lib
ls /usr/local/include/

#设置 环境变量 , 
#直接运行下列命令(终端关闭失效) 或者  vim /etc/profile 添加一下命令 source /etc/profile 重启!永久生效
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
#创建软连接 防止 nginx 启动 报错 找不到 libluajit-5.1.so.2
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

3.1.2 nginx 配置  lua

cd /root/fastdfs/nginx-1.15.6
./configure --prefix=/usr/local/nginx 
--add-module=/root/fastdfs/ngx_devel_kit-0.2.18 
--add-module=/root/fastdfs/lua-nginx-module-0.8.10
--add-module=/root/fastdfs/fastdfs-nginx-module-1.20/src

#重新编译 nginx
make -j2 make install

#查看模块是否安装上
/usr/local/nginx/sbin/nginx -V

参数说明:
./configure --prefix=/etc/nginx   #nginx的安装路径
--add-module=/root/fastdfs/ngx_devel_kit-0.2.18 \#ngx_devel_kit 的源码路径
--add-module=/root/fastdfs/lua-nginx-module-0.8.10 #nginx_lua_module 的源码路径

3.1.3 测试 lua

#添加
vim  /usr/local/nginx/conf/nginx.conf
#添加
location /lua {
  default_type 'text/plain';
  content_by_lua 'ngx.say("hello, lua")';
}

3.2 graphicsmagick

3.2.1 安装

cd /root/fastdfs
#获取 graphicsmagick
wget https://master.dl.sourceforge.net/project/graphicsmagick/graphicsmagick-history/1.3/GraphicsMagick-1.3.18.tar.gz
tar -zxvf GraphicsMagick-1.3.18.tar.gz
cd GraphicsMagick-1.3.18/
#运行配置
./configure --prefix=/usr/local/GraphicsMagick --enable-shared
#编译 安装
make && make install
#查看 GraphicsMagick 版本和支持
/usr/local/GraphicsMagick/bin/gm version

3.2.2 测试

#使用 GraphicsMagick 将 图片 1.jpg 转化 未 thumb.jpg
/usr/local/GraphicsMagick/bin/gm  convert -resize 100x80^ -gravity Center -crop 100x80+0+0 1.jpg thumb.jpg

问题: no decode delegate for this image format。     查看配置 是否支持 jpg,png

yum -y install libjpeg libjpeg-devel libpng libpng-devel

3.3  nginx-lua-fastdfs-GraphicsMagick

3.3.1  添加  nginx-lua-fastdfs-GraphicsMagick

#获取 nginx-lua-fastdfs-GraphicsMagick 
git clone https://github.com/hpxl/nginx-lua-fastdfs-GraphicsMagick.git
cd nginx-lua-fastdfs-GraphicsMagick/lua
#将 lua配置文件 移动到 nginx
cp ./* /usr/local/nginx/conf/lua

#修改配置
vim /usr/local/nginx/conf/lua/fastdfs.lua

#在46行
fdfs:set_tracker("你的ip", 22122)
#在72行
local command = "/usr/local/GraphicsMagick/bin/gm convert " .. originalFile  .. " -thumbnail " .. area .. " -background gray -gravity center -extent " .. area .. " " .. ngx.var.file;

3.3.2 配置 ngnix

vim /usr/local/nginx/conf/nginx.conf

location /group1/M00 {
   alias /home/fastdfs/data;
   set $image_root "/home/fastdfs/data";
   if ($uri ~ "/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/(.*)") {
       set $image_dir "$image_root/$3/$4/";
       set $image_name "$5";
       set $file "$image_dir$image_name";
   }
   if (!-f $file) {
       content_by_lua_file /usr/local/nginx/conf/lua/fastdfs.lua ;
   }
   ngx_fastdfs_module;
}

3.3.3. 启动

/usr/local/nginx/sbin/nginx

3.4  效果

原图

800x600 图片

4. 拓展

 其他配置

server {
      listen 8888;
      server_name localhost;


      set $img_thumbnail_root /home/fastdfs/data; #缩略图保存的根目录
      set $img_file $img_thumbnail_root$uri;   #缩略图路径

      location /lua {
	    default_type 'text/plain';
	    content_by_lua 'ngx.say("hello, lua")';
      }

      # like:/xx/xx/xx.jpg_100-.jpg or /xx/xx/xx.jpg_-100.jpg
      location ~* ^(\/(\w+)(\/M00)(.+\.(jpg|jpeg|gif|png)))_((\d+\-)|(\-\d+))\.(jpg|jpeg|gif|png)$ {
        root $img_thumbnail_root;    # root path for croped img
          set $fdfs_group_root /home/fastdfs/data; #图片存放目录
          if (!-f $img_file) {    # if thumb file not exists
                  add_header X-Powered-By 'Nginx+Lua+GraphicsMagick By Yanue';  #  header for test
                  add_header file-path $request_filename;    #  header for test
                  set $request_filepath $fdfs_group_root$4;    # origin_img full path:/document_root/1.gif
                  set $img_size $6;    # img width or height size depends on uri : img size like "-100" or "100-", "-" means auto size
                  set $img_ext $5;    # file ext
                  content_by_lua_file /usr/local/nginx/conf/lua/autoSize.lua;    # load auto width or height crop Lua file
          }
      }
      
      # like:/pic/M00/xx/xx/xx.jpg_200x100.jpg
      location ~* ^(\/(\w+)(\/M00)(.+\.(jpg|jpeg|gif|png))_(\d+)+x(\d+)+\.(jpg|jpeg|gif|png))$ {
          root $img_thumbnail_root;    # root path for croped img
          set $fdfs_group_root /home/fastdfs/data; #set fastdfs group path $2
      
          if (!-f $img_file) {   # if thumb file not exists
                  add_header X-Powered-By 'Nginx+Lua+GraphicsMagick By Yanue';  #  header for test
                  add_header file-path $request_filename;    #  header for test
                  set $request_filepath $fdfs_group_root$4;    # real file path
                  set $img_width $6;    #  img width
                  set $img_height $7;    #  img height
                  set $img_ext $5;     # file ext
                  content_by_lua_file /usr/local/nginx/conf/lua/cropSize.lua;    # load crop Lua file
          }
      }
      
      location ~/group[0-9]/ {
        ngx_fastdfs_module;
      } 

    }

corpSize.lua

-- 根据输入长和宽的尺寸裁切图片

--GM 路径
local gm_path = '/usr/local/GraphicsMagick/bin/gm'

-- 检测路径是否目录
local function is_dir(sPath)
    if type(sPath) ~= "string" then return false end

    local response = os.execute("cd " .. sPath)
    if response == 0 then
        return true
    end
    return false
end

-- 文件是否存在
function file_exists(name)
    local f = io.open(name, "r")
    if f ~= nil then io.close(f) return true else return false end
end

-- 获取文件路径
function getFileDir(filename)
    return string.match(filename, "(.+)/[^/]*%.%w+$") --*nix system
end

-- 获取文件名
function strippath(filename)
    return string.match(filename, ".+/([^/]*%.%w+)$") -- *nix system
end

--去除扩展名
function stripextension(filename)
    local idx = filename:match(".+()%.%w+$")
    if (idx) then
        return filename:sub(1, idx - 1)
    else
        return filename
    end
end

--获取扩展名
function getExtension(filename)
    return filename:match(".+%.(%w+)$")
end

-- 开始执行
-- ngx.log(ngx.ERR, getFileDir(ngx.var.img_file));

-- check image dir
if not is_dir(getFileDir(ngx.var.img_file)) then
    os.execute("mkdir -p " .. getFileDir(ngx.var.img_file))
end

    ngx.log(ngx.ERR,ngx.var.img_file);
    ngx.log(ngx.ERR,ngx.var.request_filepath);
-- 裁剪后保证等比缩图 (缺点:裁剪了图片的一部分)
-- gm convert input.jpg -thumbnail "100x100^" -gravity center -extent 100x100 output_3.jpg
if (file_exists(ngx.var.request_filepath)) then
    local cmd = gm_path .. ' convert ' .. ngx.var.request_filepath
    cmd = cmd .. " -thumbnail " .. ngx.var.img_width .. "x" .. ngx.var.img_height .. "^"
    cmd = cmd .. " -gravity center -extent " .. ngx.var.img_width .. "x" .. ngx.var.img_height
--  cmd = cmd .. " -quality 100"
    cmd = cmd .. " +profile \"*\" " .. ngx.var.img_file;
--  ngx.log(ngx.ERR, cmd);
    os.execute(cmd);
    ngx.exec(ngx.var.uri);
else
    ngx.exit(ngx.HTTP_NOT_FOUND);
end

autoSize.lua

-- 根据输入长或宽的尺寸自动裁切图片大小

--设置 GM 路径
local gm_path = '/usr/local/GraphicsMagick/bin/gm'

-- 检测路径是否目录
local function is_dir(sPath)
    if type(sPath) ~= "string" then return false end

    local response = os.execute("cd " .. sPath)
    if response == 0 then
        return true
    end
    return false
end

-- 文件是否存在
function file_exists(name)
    local f = io.open(name, "r")
    if f ~= nil then io.close(f) return true else return false end
end

-- 获取文件路径
function getFileDir(filename)
    return string.match(filename, "(.+)/[^/]*%.%w+$") --*nix system
end

-- 获取文件名
function strippath(filename)
    return string.match(filename, ".+/([^/]*%.%w+)$") -- *nix system
end

--去除扩展名
function stripextension(filename)
    local idx = filename:match(".+()%.%w+$")
    if (idx) then
        return filename:sub(1, idx - 1)
    else
        return filename
    end
end

--获取扩展名
function getExtension(filename)
    return filename:match(".+%.(%w+)$")
end

function getImgSize(img)

end

-- 开始执行
-- ngx.log(ngx.ERR, getFileDir(ngx.var.img_file));

-- check image dir
if not is_dir(getFileDir(ngx.var.img_file)) then
    os.execute("mkdir -p " .. getFileDir(ngx.var.img_file))
end

-- 获取高宽 100!或!100模式
local uri = ngx.var.img_size
local width = string.sub(uri,1,1)
local height = 0

if width == "-" then
  width = 0
  height = string.sub(uri,2,string.len(uri))
else
  width = string.sub(uri,1,string.len(uri)-1)
  height = 0
end
ngx.log(ngx.ERR,uri)
ngx.log(ngx.ERR,width)
ngx.log(ngx.ERR,height)
    ngx.log(ngx.ERR,ngx.var.img_file);
    ngx.log(ngx.ERR,ngx.var.request_filepath);
-- 裁剪后保证等比缩图 (缺点:裁剪了图片的一部分)
-- gm convert input.jpg -thumbnail "100x100^" -gravity center -extent 100x100 output_3.jpg
if (file_exists(ngx.var.request_filepath)) then
    local cmd = gm_path .. ' convert ' .. ngx.var.request_filepath
    if height == 0 then
        cmd = cmd .. " -resize " .. width .. "x" ..  ""
    else
        cmd = cmd .. " -resize " .. "x" .. height .. ""
    end

    cmd = cmd .. " +profile \"*\" " .. ngx.var.img_file;
    ngx.log(ngx.ERR, cmd);
    os.execute(cmd);
    ngx.exec(ngx.var.uri);
else
    ngx.exit(ngx.HTTP_NOT_FOUND);
end

以上配置也可以

5. 集群配置

5.1 描述

192.168.202.128 192.168.202.129 192.168.202.131
tracker tracker tracker
storage(group1) storage(group1) storage(group2)
nginx nginx nginx

5.2 配置

        先按照单机配置完成,如果以下面文档进行配置 。三台相同

5.2.1 配置tracker集群

vi /etc/fdfs/tracker.conf

5.2.2 配置storage集群

vi /etc/fdfs/storage.conf

tracker_server=192.168.202.128:22122
tracker_server=192.168.202.129:22122
tracker_server=192.168.202.131:22122
group_name=group1 #注意组名 192.168.202.131 配置是 group2
port=23000 #storage 的端口号,同一个组的 storage 端口号必须相同

重启服务

/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart

5.2.3 查看storage的日志 查看tracker集群信息

cat /home/fastdfs/logs/storaged.log

访问FastDFS时 可以把Tracker 理解成对等的,但实际底层多个Tracker时在运行过程中会选择其中一个作为Leader,由该Leader执行一些唯一性的操作。在早期版本中Tracker-Leader有两个作用,分别是:为新加入的Storage分配一个源Storage;为开启合并存储的Group选择Trunk-Server。但是在最新的版本中实际上只有第二个作用,也就是选择Trunk-Server。查看之后 如果连接不上 注意防火墙。

systemctl stop firewalld

5.2.4 查看存储集群信息

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

5.2.5 配置 client

vim /etc/fdfs/client.conf
tracker_server=192.168.202.128:22122
tracker_server=192.168.202.129:22122
tracker_server=192.168.202.131:22122

5.2.6 使用Nginx 和 FastDFS集群结合

vi /etc/fdfs/mod_fastdfs.conf
tracker_server=192.168.211.130:22122
tracker_server=192.168.211.136:22122
tracker_server=192.168.211.135:22122
group_name=group1 #注意组名 如果是group2 则一定要改

5.2.7 测试

  与单机相同

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!