Web服务图片压缩,nginx+lua生成缩略图
背景
目前而言,用移动端访问Web站点的用户越来越多,图片对流量的消耗是比较大的,之前一个用户用我们网站的app浏览的时候,2个小时耗去了2个G的流量,这是个很严重的问题,需要对图片进行压缩,减少对用户带宽的损耗。
方法
用户访问网站,上传图片,app端一律使用jpg格式压缩,不用png格式。
Niginx+lua+graphicsmagick
NIGINX配置:
location /images{
#图片防盗链配置
#valid_referers none blocked localhost *.mydomain.com;
#if ($invalid_referer)
#{
# return 403;
#}
set $image_root /home/images;
set $file "$image_root$uri";
if (!-f $request_filename) {
rewrite_by_lua '
local index = string.find(ngx.var.uri, "([0-9]+)x([0-9]+)");
local originalUri = string.sub(ngx.var.uri, 0, index-2);
local area = string.sub(ngx.var.uri, index);
index = string.find(area, "([.])");
area = string.sub(area, 0, index-1);
function Split(szFullString, szSeparator)
local nFindStartIndex = 1
local nSplitIndex = 1
local nSplitArray = {}
while true do
local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
if not nFindLastIndex then
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
break
end
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
nFindStartIndex = nFindLastIndex + string.len(szSeparator)
nSplitIndex = nSplitIndex + 1
end
return nSplitArray
end
local size_list = Split(area, "x");
function table.isLegal(table)
for _, value in pairs(table) do
if value % 10 ~= 0 then
return false
end
end
return true
end
local extend = string.sub(ngx.var.uri, -3,-1);
if table.isLegal(size_list) and extend == "png" then
local command = [[/usr/local/GraphicsMagick-1.3.24/bin/gm convert -compress Lossless -quality 90 -density 72 -background none +profile "*" ]] .. ngx.var.image_root .. originalUri .. " -geometry " .. area .. "^ -gravity center -extent " .. area .. " " .. ngx.var.file;
os.execute(command);
elseif table.isLegal(size_list) and extend ~= "png" then
local command = [[/usr/local/GraphicsMagick-1.3.24/bin/gm convert -compress Lossless -quality 90 -density 72 +profile "*" ]] .. ngx.var.image_root .. originalUri .. " -resize " .. area .. "^ -gravity center -extent " .. area .. " " .. ngx.var.file;
os.execute(command);
else
ngx.exit(404);
end;
';
}}
/usr/local/GraphicsMagick-1.3.24/bin/gm convert -compress Lossless -quality 50 -background none +profile "*" /home/image/1.png -geometry 400^ -gravity center -extent 400 /home/image/2.jpg
用这种方法,可以将2M的png格式的大图片,压缩成为200KB的大小,非常有效。
之后我又对程序进行了优化,图片后面加上后缀.200x200.png,图片则会被压缩成200x200的png格式图片,如果加上.x.jpg,则会压缩成等比的jpg格式图片。
同时,nginx配置修改为
location /images {
set $image_root /home;
set $file "$image_root$uri";
if (!-f $request_filename) {
rewrite_by_lua_file /home/software/nginx-server/conf/image.lua;
}
alias /home/images;
expires max;
}
下面附上image.lua优化后的代码:
local extend = tostring(string.sub(ngx.var.uri, -3,-1));
local index = string.find(ngx.var.uri, "([0-9]+)x([0-9]+)");
local command;
if index == nil then
index = string.find(ngx.var.uri, "(%.x%.)")
if index == nil then
ngx.exit(404);
return;
end
local originalUri = string.sub(ngx.var.uri, 0, index-1);
if extend == "png" then
ngx.header.b="rr";
ngx.exit(404);
return;
elseif entend ~= "png" then
command = [[/usr/local/GraphicsMagick-1.3.24/bin/gm convert -quality 50 -density 72 +profile "*" ]] .. ngx.var.image_root .. originalUri .. " -gravity center " .. ngx.var.file;
end
ngx.header.a=command;
os.execute(command)
return
end
originalUri = string.sub(ngx.var.uri, 0, index-2);
local area = string.sub(ngx.var.uri, index);
index = string.find(area, "([.])");
area = string.sub(area, 0, index-1);
function Split(szFullString, szSeparator)
local nFindStartIndex = 1
local nSplitIndex = 1
local nSplitArray = {}
while true do
local nFindLastIndex = string.find(szFullString, szSeparator, nFindStartIndex)
if not nFindLastIndex then
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, string.len(szFullString))
break
end
nSplitArray[nSplitIndex] = string.sub(szFullString, nFindStartIndex, nFindLastIndex - 1)
nFindStartIndex = nFindLastIndex + string.len(szSeparator)
nSplitIndex = nSplitIndex + 1
end
return nSplitArray
end
local size_list = Split(area, "x");
function table.isLegal(table)
for _, value in pairs(table) do
if value % 10 ~= 0 then
return false
end
end
return true
end
if table.isLegal(size_list) and extend == "png" then
command = [[/usr/local/GraphicsMagick-1.3.24/bin/gm convert -quality 50 -density 72 -background none +profile "*" ]] .. ngx.var.image_root .. originalUri .. " -geometry " .. area .. "^ -gravity center -extent " .. area .. " " .. ngx.var.file;
os.execute(command);
elseif table.isLegal(size_list) and extend ~= "png" then
command = [[/usr/local/GraphicsMagick-1.3.24/bin/gm convert -quality 50 -density 72 +profile "*" ]] .. ngx.var.image_root .. originalUri .. " -resize " .. area .. "^ -gravity center -extent " .. area .. " " .. ngx.var.file;
os.execute(command);
else
ngx.exit(404);
end;
Web服务图片压缩,nginx+lua生成缩略图的更多相关文章
- 【Nginx】面试官竟然问我Nginx如何生成缩略图,还好我看了这篇文章!!
写在前面 今天想写一篇使用Nginx如何生成缩略图的文章,想了半天题目也没想好,这个题目还是一名读者帮我起的.起因就是这位读者最近出去面试,面试官正好问了一个Nginx如何生成缩略图的问题.还别说,就 ...
- yii php 图片上传与生成缩略图
今天需要做图片上传与生成缩略图的功能,把代码进行记录如下: html 视图 ($pic_action_url = $this->createAbsoluteUrl('h ...
- nginx实时生成缩略图到硬盘上
现在随着各终端的出现(手机,ipad等平板),以及各种终端的手机分辨率和尺寸都不同,现在手机用户流量都是宝,网上出现了各种各样的生成缩略图功能的架构,有使用php实时生成缩略图的,也有用nginx + ...
- java图片裁剪和java生成缩略图
一.缩略图 在浏览相冊的时候.可能须要生成相应的缩略图. 直接上代码: public class ImageUtil { private Logger log = LoggerFactory.getL ...
- Web服务(Apache、Nginx、Tomcat、Jetty)与应用(LAMP、CMS-WordPress&Ghost、Jenkins、Gitlab)
Web服务和应用是目前信息技术领域的热门技术.如何使用Docker来运行常见的Web服务器(包括Apache.Nginx.Tomcat等),以及一些常用应用(LAMP.CMS等).包括具体的镜像构建方 ...
- php 图片操作类,支持生成缩略图,添加水印,上传缩略图
<?php class Image { //类开始 public $originimage = ""; //源图片文件地址 public $image ...
- nginx自动生成缩略图
网站上常常一张图片,多个地方需要使用不同的尺寸,一般的方案是上传的时候,根据不同的尺寸用程序生成多张图片. 这么做有两个缺点: 1.如果需要新的尺寸图片的话,只能遍历下数据库,重新生成一次图片. 2. ...
- ASP.NET Web服务(ASMX)学习和代理生成
第一步:按照http://www.c-sharpcorner.com/article/getting-started-with-asp-net-web-services-part-one/ 建立项目和 ...
- nginx 作为静态资源web服务
Nginx作为静态资源web服务 静态资源web服务-CDN场景 Nginx资源存储中心会把静态资源分发给“北京Nginx”,“湖南Nginx”,“山东Nginx”. 然后北京User发送静态资源请求 ...
随机推荐
- [OpenGL]VS2010配置OpenGL开发环境
opengl概述 OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口. OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任 ...
- mysql安装2
linux下安装mysql-5.1.51.tar.gz (2010-10-27 10:59:26) 转载▼ 标签: mysql 数据库 tar.gz安装 杂谈 分类: Mysql数据库 MySQL h ...
- socket编程:客户端与服务器间的连接以及各函数的用法
在认真的看UNP之前,一直被socket编程说的云里雾里,今天我要让大家从整天上认识socket编程,让我们知道socket编程的整个流程和各个函数的用法.这样:我们在写一些简单的socket编程时就 ...
- bzoj3043
这道题完全没想出来,引自 http://blog.csdn.net/willinglive/article/details/38419573的题解 对于带有“将一段区间内的每个数全部加上某个值”这种操 ...
- COJ 0601&0602 动态规划(二)及加强
未加强传送门0601:http://oj.cnuschool.org.cn/oj/home/addSolution.htm?problemID=571 加强传送门0602:http://oj.cnus ...
- ab压测 apr_socket_recv: Connection reset by peer (104)错误解决方法
用apache自带ab命令进行压测,报了如下错误: 原因是在ab的程序源码中对并发数有限制. 解决办法:修改apache源码support下面的ab.c源代码,然后重新编译.修改内容如下:
- 【转】【Android】使用BaseAdapter实现复杂的ListView
原文网址:http://blog.csdn.net/jueblog/article/details/11857281 使用BaseAdapter实现复杂的ListView的步骤: 1. 数据你要准备好 ...
- hdoj3351-stack
Problem Description I'm out of stories. For years I've been writing stories, some rather silly, just ...
- 区别assign VS weak,__block VS __weak
在objective-c中,类中的全局变量经常使用如下的方式申明. @property(nonatomic(1),strong(2))UIImageView *imageView; 其中的1,2处是对 ...
- MySQL的InnoDB表如何设计主键索引-转自淘宝MySQL经典案例
创建a表 id主键 CREATE TABLE `a` (`id` bigint(20) NOT NULL AUTO_INCREMENT ,`message_id` int(11) NOT NULL,` ...