背景
自己搭建的图片服务器,有图片缩放的需求,大致思路是可以使用nginx调用lua,使用GraphicMagick的命令来做图片缩放
说明
文件夹规划
lua.jaychang.cn(如/var/filebase)
1 | jaychang@tengine:~$ tree /var/filebase/ |
其中img.xyz.com为图片站点根目录
cache/thumb为缩略图存放目录
upload目录存放上传的图片
链接地址对应关系
原图访问地址:http://img.xyz.com/upload/1.png
缩略图访问地址:http://img.xyz.com/upload/1.png_100x100.png 即为宽100,高100
自动宽地址: http://img.xyz.com/upload/1.png_-400.png 用”-“表示自动,即为高400,宽自动
自动高地址: http://img.xyz.com/upload/1.png_800-.jpg 用”-“表示自动,即为宽800,高自动
访问流程
首先判断缩略图是否存在,如存在则直接显示缩略图;
缩略图不存在,则判断原图是否存在,如原图存在则拼接graphicsmagick(gm)命令,生成并显示缩略图,否则返回404
所需软件
- lua-5.3.5.tar.gz
- LuaJIT-2.0.5.tar.gz
- tengine-2.3.0.tar.gz
安装依赖
1 | apt-get install -y gcc g++ make |
编译安装Lua LuaJIT
编译安装Lua
1 | curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gz |
编译安装LuaJIT
1 | curl -R -O http://luajit.org/download/LuaJIT-2.0.5.tar.gz |
安装GraphicsMagick
1 | wget ftp://ftp.graphicsmagick.org/pub/GraphicsMagick/1.3/GraphicsMagick-1.3.31.tar.gz |
创建用户及相应目录
1 | groupadd nginx && useradd nginx -g nginx -s /sbin/nologin -M |
创建用户也可以用以下命令:1
groupadd nginx && useradd nginx -g nginx -s /bin/false -M
编译安装tengine
1 | ./configure --prefix=/usr/local/tengine \ |
1 | make -j 2 && make install |
注意:在Tengine-2.3.0版本后废弃Tengine的dso_tool工具以及dso配置指令,若之前有使用Tengine的dso功能、则可以切换到Nginx官方的load_module指令,详细文档参考1
和 参考2
还有–with-http_spdy_module 已经改为–with-http_v2_module了
,如果不用geo的话,编译的时候可以不加–with-http_geoip_module,可以不安装libgeoip-dev
测试tengine
1 | cd /usr/local/tengine |
如果出现以下错误(没有报错就不用做以下操作了)1
2jaychang@tengine:/usr/local/tengine/sbin$ ./nginx -t
./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
查找下位置1
2
3
jaychang@tengine:/usr/local/tengine/sbin$ sudo whereis libluajit-5.1.so.2
libluajit-5.1.so: /usr/local/lib/libluajit-5.1.so /usr/local/lib/libluajit-5.1.so.2
修改/etc/ld.so.conf,添加“/usr/local/lib”
vi /etc/ld.so.conf1
2include /etc/ld.so.conf.d/*.conf
/usr/local/lib
然后执行下ldconfig1
ldconfig
修改nginx.conf配置文件
将nginx.conf配置文件中的server{}段配置注释掉
加一行配置,以便读取/usr/local/tengine/conf.d目录下所有后缀为.conf的配置文件1
include ../conf.d/*.conf;
可以参考如下配置1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52user nginx;
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
error_log /var/log/tengine/error.log error;
pid /usr/local/tengine/logs/nginx.pid;
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
limit_conn_zone $binary_remote_addr zone=one:10m;
limit_conn_zone $server_name zone=perserver:10m;
include mime.types;
include fastcgi.conf;
default_type application/octet-stream;
charset utf-8;
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 64k;
sendfile on;
autoindex off;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 120;
fastcgi_connect_timeout 60;
fastcgi_send_timeout 60;
fastcgi_read_timeout 60;
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $http_x_forwarded_for';
client_max_body_size 10m;
include ../conf.d/*.conf;
}
创建放图片的目录
目录规划
- /var/www 放网页,css,js等资源
- /var/fielbase 放图片
- /var/filebase/upload 上传的图片放这里
1 | mkdir -p /var/filebase/upload |
配置站点配置文件
在/usr/local/tengine/conf.d目录下创建demo.conf
1 | # 定义lua缩略图支持的图片尺寸及开关 |
lua脚本
- /usr/local/tengine/lua/autoSize.lua
1 | -- 根据输入长或宽的尺寸自动裁切图片大小 |
- /usr/local/tengine/lua/cropSize.lua
1 | -- 根据输入长和宽的尺寸裁切图片 |
然后 nginx -s reload下
测试效果
在/var/filebase/upload目录,放1张图片
原图
100x100
由于我们开启了image_sizes_check,不支持的尺寸会返回404
固定定宽高自适应
查看服务器上生成的文件
PS:这里有个问题,就是图片缩放后,图片的方向跟原先不一致的问题,后来笔者查了下GraphicsMagick资料,关于图片缩放后改变图片方向的问题,可以用-auto-orient参数可以来解决的,可以写成”gm convert -auto-orient “
参考资料
https://github.com/botaozhao/nginx-lua-GraphicsMagick
https://github.com/yanue/nginx-lua-GraphicsMagick/blob/master/nginx-install.md
http://www.icode9.com/content-3-77987.html
https://my.oschina.net/ranhai/blog/1797454
https://www.twblogs.net/a/5bafdb372b7177781a0f64d7/zh-cn