1.安装GraphicsMagick
--使用yum安装GraphicsMagick
# yum install ImageMagick
--查看安装结果
# yum list installed | grep ImageMagick* ImageMagick.x86_64 6.5.4.7-7.el6_5 @base
--验证安装结果
# convert -sample 200x200 desktop.jpg desktop-200x200.jpg # convert -sample 200x200 desktop.png desktop-200x200.png
2.安装lua-nginx-module
--下载安装LuaJIT
# wget http://luajit.org/download/LuaJIT-2.0.4.tar.gz # tar -zxvf LuaJIT-2.0.4.tar.gz # cd LuaJIT-2.0.2 # make # make install
--安装lua-nginx-module
下载ngx_devel_kit,nginx_lua_module解压
// 先导入环境变量,告诉nginx去哪里找luajit # export LUAJIT_LIB=/usr/local/lib # export LUAJIT_INC=/usr/local/include/luajit-2.0 // 查看ngixn版本极其编译参数 # /usr/local/nginx/sbin/nginx -V // 添加ngx_devel_kit,lua-nginx-module模块,重新编译nginx // 切勿make install,否则就成了覆盖安装 # ./configure --prefix=/usr/local/nginx \ --add-module=/usr/local/src/fastdfs-nginx-module/src \ --add-module=/usr/local/src/ngx_devel_kit-0.2.19 \ --add-module=/usr/local/src/lua-nginx-module-0.9.16 # make // 备份旧的nginx程序,用新的nginx程序覆盖旧的 # cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak # cp ./objs/nginx /usr/local/nginx/sbin/nginx // 再次查看ngixn版本极其编译参数,确认安装成功 # /usr/local/nginx/sbin/nginx -V /usr/local/nginx/sbin/nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory // 将libluajit-5.1.so.2安装到/usr/lib中并重新加载 # ln -s /usr/local/lib/libluajit-5.1.so.2 /usr/lib/libluajit-5.1.so.2 # ldconfig # /usr/local/nginx/sbin/nginx -V // 测试lua-nginx-module模块 // nginx配置文件加入如下配置: location ~* ^/2328(/.*) { default_type 'text/plain'; content_by_lua 'ngx.say("hello, ttlsa lua")'; } # curl http://localhost/2328/ hello, ttlsa lua
--配置nginx实现简单自动生成缩略图
// 修改nginx配置文件nginx.conf location ~ '/images/([0-9a-z]+).jpg$' { root /var; } location ~ '/images/([0-9a-z]+)_([0-9]+)x([0-9]+).jpg$' { root /var; set $image_root '/var/images'; set $fileName $1; set $width $2; set $height $3; set $origin $image_root/$fileName.jpg; set $file $image_root/${fileName}_${width}x$height.jpg; if (!-f $file) { rewrite_by_lua ' local command = "convert -sample "..ngx.var.width.."x"..ngx.var.height.." "..ngx.var.origin.." "..ngx.var.file; os.execute(command); '; } } // nginx重新加载配置 # /usr/local/nginx/sbin/nginx -s reload // 在/var/images中上传desktop.jpg图片 访问 http://192.168.117.101/images/desktop_200x200.jpg 返回404 // 查看日志 # tail -f /usr/local/nginx/logs/error.log convert: unable to open image `/var/images/desktop_100x100.jpg': Permission denied @ blob.c/OpenBlob/2480. // nginx: worker process 的用户是nobody,没有root权限,无法操作/var/images的文件 // 修改/var/images的权限为所有人可修改# ps -ef | grep nginx root 10065 1 0 00:05 ? 00:00:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 12100 10065 0 11:35 ? 00:00:00 nginx: worker process root 12108 9959 0 11:37 pts/1 00:00:00 grep nginx 访问 http://192.168.117.101/images/desktop_200x200.jpg 返回缩略图,/var/images多了对应的缩略图
--配置nginx实现简单自动生成缩略图
--进阶,将缩略图文件和原图分开存储
location ~ '/images/thumbnail/([0-9a-z]+)_([0-9]+)x([0-9]+).jpg$' { root /var; } location ~ '/images/([0-9a-z]+)_([0-9]+)x([0-9]+).jpg$' { root /var; set $image_root '/var/images'; set $fileName $1; set $width $2; set $height $3; set $origin $image_root/$fileName.jpg; set $file $image_root/thumbnail/${fileName}_${width}x$height.jpg; set $uriNew /images/thumbnail/${fileName}_${width}x$height.jpg; if (-f $file) { rewrite ^ $uriNew; break; } if (!-f $origin) { return 404; } rewrite_by_lua ' local width = tonumber(ngx.var.height); local height = tonumber(ngx.var.height); if width and height then local command = "convert -sample "..ngx.var.width.."x"..ngx.var.height.." "..ngx.var.origin.." "..ngx.var.file; os.execute(command); ngx.req.set_uri(ngx.var.uriNew, true); else ngx.exit(ngx.HTTP_NOT_FOUND); end '; }
3.nginx + lua-nginx-module + fastdfs 实现动态缩略图
/usr/local/nginx
|-conf
|-lua
|-fastdfs.lua
|-restyfastdfs.lua
|-storage.lua
|-tracker.lua
|-utils.lua
|-nginx.conf
--主要的配置
nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
lua_package_path "/usr/local/nginx/conf/lua/?.lua;;";
server {
listen 80;
server_name localhost;
location ~ '/images/thumbnail/([0-9a-z]+)_([0-9]+)x([0-9]+).jpg$' {
root /var;
}
location ~ '/images/([0-9a-z]+)_([0-9]+)x([0-9]+).jpg$' {
root /var;
set $image_root '/var/images';
set $fileName $1;
set $width $2;
set $height $3;
set $origin $image_root/$fileName.jpg;
set $file $image_root/thumbnail/${fileName}_${width}x$height.jpg;
set $uriNew /images/thumbnail/${fileName}_${width}x$height.jpg;
if (-f $file) {
rewrite ^ $uriNew;
break;
}
if (!-f $origin) {
return 404;
}
rewrite_by_lua '
local width = tonumber(ngx.var.height);
local height = tonumber(ngx.var.height);
if width and height then
local command = "convert -sample "..ngx.var.width.."x"..ngx.var.height.." "..ngx.var.origin.." "..ngx.var.file;
os.execute(command);
ngx.req.set_uri(ngx.var.uriNew, true);
else
ngx.exit(ngx.HTTP_NOT_FOUND);
end
';
}
location /group1/M00 {
alias /var/images;
#set $image_root "/usr/local/openresty/nginx/proxy_tmp/images";
set $image_root "/var/images";
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;
content_by_lua_file "conf/lua/fastdfs.lua";
}
#ngx_fastdfs_module;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
fastdfs.lua
-- 写入文件 local function writefile(filename, info) local wfile=io.open(filename, "w") --写入文件(w覆盖) assert(wfile) --打开时验证是否出错 wfile:write(info) --写入传入的内容 wfile:close() --调用结束后记得关闭 end -- 检测路径是否目录 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 -- 检测文件是否存在 local file_exists = function(name) local f=io.open(name,"r") if f~=nil then io.close(f) return true else return false end end local area = nil local originalUri = ngx.var.uri; local originalFile = ngx.var.file; local index = string.find(ngx.var.uri, "([0-9]+)x([0-9]+)"); if index then originalUri = string.sub(ngx.var.uri, 0, index-2); area = string.sub(ngx.var.uri, index); index = string.find(area, "([.])"); area = string.sub(area, 0, index-1); local index = string.find(originalFile, "([0-9]+)x([0-9]+)"); originalFile = string.sub(originalFile, 0, index-2) end -- check original file if not file_exists(originalFile) then local fileid = string.sub(originalUri, 2); -- main local fastdfs = require('restyfastdfs') local fdfs = fastdfs:new() fdfs:set_tracker("192.168.117.100", 22122) fdfs:set_timeout(1000) fdfs:set_tracker_keepalive(0, 100) fdfs:set_storage_keepalive(0, 100) local data = fdfs:do_download(fileid) if data then -- check image dir if not is_dir(ngx.var.image_dir) then os.execute("mkdir -p " .. ngx.var.image_dir) end writefile(originalFile, data) end end -- 创建缩略图 local image_sizes = {"80x80", "800x600", "40x40", "60x60"}; function table.contains(table, element) for _, value in pairs(table) do if value == element then return true end end return false end if table.contains(image_sizes, area) then local command = "convert " .. originalFile .. " -thumbnail " .. area .. " -background gray -gravity center -extent " .. area .. " " .. ngx.var.file; os.execute(command); end; if file_exists(ngx.var.file) then --ngx.req.set_uri(ngx.var.uri, true); ngx.exec(ngx.var.uri) else ngx.exit(404) end
参考资料:
https://github.com/openresty/lua-nginx-module
http://www.ttlsa.com/nginx/nginx-modules-ngx_lua/
http://www.2cto.com/os/201504/387948.html
http://houxiyang.com/archives/112/
https://github.com/hpxl/nginx-lua-fastdfs-GraphicsMagick
https://github.com/azurewang/lua-resty-fastdfs
相关推荐
Docker+FastDFS+Nginx+Lua实现图片缩略图1、FastDFS安装1.1、镜像下载1.2、开启tracker容器1.3、开启storage容器1.4、测试2、FastDFS集成Nginx+lua2.1、依赖包下载2.2、安装软件基础包2.3、依赖安装2.4、配置Lua脚本...
nginx-1.17.5 ngx_devel_kit lua-nginx-module-0.10.9rc7 fastdfs-nginx-module LuaJIT-2.0.4 ua-5.3.1 GraphicsMagick-1.3.18
《搭建FastDFS+Nginx+libfastcommon+fastdfs-nginx-module系统详解》 FastDFS是一个开源的、高性能的、轻量级的分布式文件系统,主要用于解决大容量存储和负载均衡的问题,尤其适合以文件为载体的在线服务,如图片...
本安装笔记将详细阐述如何在您的服务器环境中安装并配置FastDFS、Nginx和Redis这三款软件,以实现高效的数据存储、访问及缓存功能。 首先,我们来了解FastDFS。FastDFS是一个开源的、高性能的、轻量级的分布式文件...
本文将详细介绍如何在Linux环境中单机搭建FastDFS+nginx文件管理系统。 首先,我们需要了解FastDFS的基本架构。FastDFS分为Tracker Server和Storage Server两部分。Tracker Server主要负责调度任务,分配文件存储到...
未解决Fastdfs部署程序员找资源困难,特上传此附件,以解决部署时间,且带有使用说明、安装说明,此附件包含 Fastdfs、nginx安装包及nginx依赖包,openssl、zlib、pcre。并且包含Fastdfs使用文档,及安装说明。
【FastDFS+Nginx+Cache集群安装配置】是构建高效、稳定、可扩展的文件存储和Web服务解决方案的重要步骤。这个配置涉及到FastDFS分布式文件系统、Nginx反向代理服务器以及缓存服务的集成,旨在优化文件访问性能,提高...
标题 "nginx+fastDFS+libfastcommon+fastdfs-nginx-module" 涉及到的是一个集成的网络服务解决方案,用于高效地管理和分发文件。这个组合包括了以下几个关键组件: 1. **Nginx**: Nginx 是一款高性能的 HTTP 和反向...
基于FastDFS+Nginx+Redis+MySQL+FastCGI实现的共享网盘(毕业设计) 适用人群:学习不同技术领域的小白或进阶学习者;可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。
在本文中,我们将深入探讨如何在CentOS 7环境下搭建FastDFS+nginx+php的开发环境,这是一个常用的技术栈,适用于构建类似微信、京东、淘宝等大型应用的后端小文件服务器。首先,我们来看看所需的软件及其版本: 1. ...
4个源码文件,fastdfs-master.zip+fastdfs-nginx-module-master.zip+libfastcommon-master.zip+nginx-1.8.0.tar.gz
【标题】: "基于Python + Fastdfs + Nginx + Mysql 的分布式文件存储平台" 在当前的数字化时代,文件存储的需求日益增大,特别是在大数据、云计算等领域的快速发展下,传统的单机文件系统已经无法满足需求。因此,...
《FastDFS+nginx+_cache集群安装配置超详细步骤》 FastDFS是一款开源的高性能、轻量级的分布式文件系统,适用于互联网行业的大量小文件存储。它具有高可用性、高扩展性和低延迟等特点,常被用于图片、视频等多媒体...
在IT领域,构建高效、可扩展的Web服务是至关重要的,而FastDFS和Nginx的结合使用就是一种常见的解决方案。FastDFS是一个开源的、高性能的分布式文件系统,主要用于解决大容量存储和负载均衡的问题。Nginx则是一款...
fastdfs-5.05.tar.gz : FastDFS安装主文件包 libfastcommon-master.zip: FastDFS文件系统依赖包 nginx-1.8.1.tar.gz:...fastdfs-nginx-module_v1.16.tar.gz: nginx下fastdfs模块包 ngx_cache_purge-2.1.tar.gz:缓存
8. **配置Nginx**:修改Nginx配置文件,添加Fastdfs的相关配置,包括指向模块的路径和Fastdfs的连接信息。 9. **测试连接**:通过上传和下载文件测试Fastdfs与Nginx的集成是否成功。 在实际应用中,Fastdfs可以通过...
文件服务器(图片服务器)/自己看着网上的blog搭了许多遍,只能说~坑太多 在尝试了多次失败之后 较上劲了 不搞出来不sleep 终幸运的搭了出来 总结:版本兼容性(就是这个比较坑我) 并且我通过在Linux中history >>a...
在`nginx-lua-fastdfs`环境中,`GraphicsMagick`通常用于对从`fastdfs`中获取的原始图片进行缩放、裁剪等处理,生成不同规格的版本供前端展示。 配置`nginx-lua-fastdfs-GraphicsMagick`的过程主要包括以下几个步骤...
在IT行业中,Linux系统常被用于服务器环境,而FastDFS、nginx和FastDHT是构建高效、稳定分布式文件系统的常用组件。本教程将详细介绍如何在CentOS操作系统上安装和配置这些组件。 首先,FastDFS是一个开源的轻量级...