目标

linux 搭建FastDFS图片服务器、Nginx服务器,通过http请求访问服务器中图片时,显示动态缩略图

思路分析

  • 在Linux系统中安装FastDFS服务器
  • 可以使用FastDFS自带的工具将文件上传到FastDFS
  • 通过http访问某个图片时,FastDFS通过GraphicsMagick工具生成缩略图,将动态缩略图响应输出

本文所需要的安装软件

链接:https://pan.baidu.com/s/1sbKCt74LV-OQcCPL1NcbHQ  提取码:v0gm

搭建步骤

搭建FastDFS

我们采用源码方式安装,为了能够顺利安装我们首先需要安装编译环境

1 安装编译环境

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

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

3 安装FastDFS

cd /root/fastdfs
wget https://github.com/happyfish100/fastdfs/archive/V5.11.tar.gz
tar -zxvf V5.11.tar.gz
cd fastdfs-5.11
./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
vim /etc/fdfs/tracker.conf
#需要修改的内容如下
port=22122
base_path=/home/fastdfs
vim /etc/fdfs/storage.conf
#需要修改的内容如下
port=23000
base_path=/home/fastdfs # 数据和日志文件存储根目录
store_path0=/home/fastdfs # 第一个存储目录
tracker_server=192.168.126.128:22122
# http访问文件的端口(默认8888,看情况修改,和nginx中保持一致)
http.server_port=8888

4.启动

mkdir /home/fastdfs -p
/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
查看所有运行的端口
netstat -ntlp

nginx 优化图片访问速度_nginx

5.测试上传

vim /etc/fdfs/client.conf
#需要修改的内容如下
base_path=/home/fastdfs
#tracker服务器IP和端口
tracker_server=192.168.211.136:22122
#保存后测试,返回ID表示成功 如:group1/M00/00/00/xxx.png
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /root/236336-106.jpg
group1/M00/00/00/wKh-gF9SVwyATIqlAAgBcVdRhz8147.jpg

nginx 优化图片访问速度_lua_02

6.安装fastdfs-nginx-module

nginx 优化图片访问速度_fastdfs_03

cd /root/fastdfs
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/"
cp mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf
#需要修改的内容如下
tracker_server=192.168.126.128:22122
url_have_group_name=true
store_path0=/home/fastdfs
mkdir -p /var/temp/nginx/client

nginx 优化图片访问速度_linux_04

7.安装nginx

cd /root/fastdfs
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
vim /usr/local/nginx/conf/nginx.conf
#添加如下配置
server {
listen 8888;
server_name localhost;
location ~/group[0-9]/ {
ngx_fastdfs_module;
}
}
/usr/local/nginx/sbin/nginx

8.测试下载

http://192.168.126.128:8888/group1/M00/00/00/wKh-gF9SW62AACgmAAgBcVdRhz8114.jpg

nginx 优化图片访问速度_lua_05

搭建Lua +GraphicsMagick实现缩略图

GraphicsMagick简介

GraphicsMagick是一个短小精悍的的图片处理工具和库集合。对于Java开发者来说,常用的图片处理工具有3个,JDK自带的图片处理库,ImageMagick,GraphicsMagick。JDK自带的图片处理库,虽稳定简单,性能却比较差;ImageMagick是目前最流行的图片处理工具,它的功能非常丰富;GraphicsMagick的功能略逊于ImageMagick,但是它的效率更强悍,但大多数情况下,GM的功能已经足够使用了。

功能特色:

(1)使用OpenMP进行多线程图片处理,增强了通过扩展CPU提高处理能力。 

(2)支持大图片的处理,并且已经做过GB级别的图像处理实验。

(3)能够动态的生成图片,特别适用于互联网的应用。

支持格式:超过88种图像格式,包括重要的DPX、GIF、JPEG、JPEG-2000、PNG、PDF、PNM和TIFF。

支持平台:Linux、Mac、Windows。

使用方式:GaphicsMagick支持命令行的模式,同时也支持C、C++、Perl、PHP、Tcl、 Ruby等的调用。

1 安装 GraphicsMagick

  • 上传下载的GraphicsMagick包

安装相关依赖

yum install -y gcc gcc-c++ zlib zlib-devel openssl openssl-devel pcre pcre-devel gd-devel
  yum install -y libpng libjpeg libpng-devel libjpeg-devel ghostscript libtiff libtiff-devel freetype freetype-devel readline-devel ncurses-devel

安装LuaJIT

LuaJIT&Lua

lua(www.lua.org)其实就是为了嵌入其它应用程序而开发的一个脚本语言,luajit(www.luajit.org)是lua的一个Just-In-Time也就是运行时编译器,也可以说是lua的一个高效版。

下载地址 http://luajit.org/download.html 本次使用的是2.0.4版本

# 上传解压
cd /opt/mgk/LuaJIT-2.0.4
make && make install

// 安装成功!
share/luajit-2.0.4/jit
ln -sf luajit-2.0.4 /usr/local/bin/luajit
==== Successfully installed LuaJIT 2.0.4 to /usr/local ====

#配置lua环境
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.0
ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.2

安装lua

cd /usr/local/src/lua-5.3.1
make linux && make install

 安装GraphicsMagick

cd /usr/local/src/GraphicsMagick-1.3.18
./configure --prefix=/usr/local/GraphicsMagick-1.3.18 --enable-shared
make && make install
ln -s /usr/local/GraphicsMagick-1.3.18 /usr/local/GraphicsMagick

 

安装nginx插件

共需要安装lua-nginx-module和ngx_devel_kie这2个插件

我们采用wget方式的进行下载

cd /root/fastdfs 

wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz
 tar -xzvf v0.3.0.tar.gz
 
 https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz
 tar -zxvf v0.10.9rc7.tar.gz

nginx插件安装

#首先切换到nginx源码目录下
 cd /root/fastdfs/nginx-1.15.6
 ./configure --prefix=/usr/local/nginx --add-module=/root/fastdfs/lua-nginx-module-0.10.9rc7 --add-module=/root/fastdfs/ngx_devel_kit-0.3.0
 #编译
 make && make install
 
 #查看模块是否安装上
 /usr/local/nginx/sbin/nginx -V

 [root@localhost nginx-1.15.6]# /usr/local/nginx/sbin/nginx -V
 nginx version: nginx/1.15.6
 built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
 configure arguments: --prefix=/usr/local/nginx --add-module=/root/fastdfs/fastdfs-nginx-module-1.20/src --add-module=/root/fastdfs/lua-nginx-module-0.10.9rc7 --add-module=/root/fastdfs/ngx_devel_kit-0.3.0

安装lua脚本

此脚本专门用月nginx代理fastdfs缩略图时,使用的,网上已开源,开源万岁!

下载lua脚本

git clone https://github.com/hpxl/nginx-lua-fastdfs-GraphicsMagick.git
   cd nginx-lua-fastdfs-GraphicsMagick/lua
  # 将脚本复制到nginx的conf目录下
 cp ./* /root/fastdfs/nginx-1.15.6/conf/lua

修改lua脚本配置

修改脚本中的tracker ip信息和gm的命令变量

vim /usr/local/nginx/conf/fastdfs.lua
#在46行
fdfs:set_tracker("192.168.126.128", 22122)
#在72行
local command = "/usr/local/GraphicsMagick-1.3.18/bin/gm convert " .. originalFile  .. " -thumbnail " .. area .. " -background gray -gravity center -extent " .. area .. " " .. ngx.var.file;

nginx 优化图片访问速度_linux_06

修改Nginx配置文件

vim /usr/local/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       8888;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location ~/group1/ {
           
                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) {
                 # 关闭lua代码缓存,方便调试lua脚本
                                   #lua_code_cache off;
                    #指定lua脚本的位置
                    content_by_lua_file "/usr/local/nginx/conf/fastdfs.lua";
                 }        


    ngx_fastdfs_module;
        }      
}

赋予GraphicMagick对fastdfs存储目录写的权限

chmod +777 /home/fastdfs/data/

缺失此步骤,会导致lua脚本转换缩略图失败

缩略图测试

重启nginx 

/usr/local/nginx/sbin/nginx -s reload

正常图片访问

http://192.168.126.128:8888/group1/M00/00/00/wKh-gF9SVwyATIqlAAgBcVdRhz8147.jpg

nginx 优化图片访问速度_lua_07

访问缩率图80×80

http://192.168.126.128:8888/group1/M00/00/00/wKh-gF9SVwyATIqlAAgBcVdRhz8147.jpg_80x80.jpg

nginx 优化图片访问速度_nginx 优化图片访问速度_08

我们来到fastdfs系统进行查看,发现多了一张80×80的图片

nginx 优化图片访问速度_nginx 优化图片访问速度_09

遇到的问题汇总

1 fatal: unable to access 'https://github.com/happyfish100/libfastcommon.git/': Peer reports incompatible or unsupported protocol version.

yum update -y nss curl libcurl

2  -bash: http://192.168.126.128:8888/group1/M00/00/00/wKh-gF9SVwyATIqlAAgBcVdRhz8147.jpg: No such file or directory

经过查看nginx日志,

得出以下错误信息

 ERROR - file: ../common/fdfs_global.c, line: 52, the format of filename "group1/M00/00/00/wKh-gF9SZAeADJGgAAgBcVdRhz8460.jpg" is invalid
解决办法

vim /etc/fdfs/mod_fastdfs.conf

url_have_group_name = true

更改配置过后,重启fastdfs和nginx即可

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


/usr/local/nginx/sbin/nginx -s reload

3 Lua安装报错:编译 Lua 报错:error: readline/readline.h: No such file or directory

缺少readline依赖导致,重新安装即可

yum install -y readline-devel

4  /usr/local/GraphicsMagick-1.3.18/bin/gm convert: Unable to open file (/home/fastdfs/data/00/00/wKh-gF9SVwyATIqlAAgBcVdRhz8147.jpg_80x80.jpg) [Permission denied].

GrahicsMagick缺少对fastdfs脚本写的权限,赋予即可

chmod +777 /home/fastdfs/data/