背景
自己搭建的图片服务器,有图片缩放的需求,大致思路是可以使用nginx调用lua,使用GraphicMagick的命令来做图片缩放
说明
文件夹规划
lua.jaychang.cn(如/var/filebase)
1 | jaychang@nginx:~$ 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
- nginx-1.14.2.tar.gz
- nginx模块:lua-nginx-module-0.10.15.tar.gz
lua-nginx-module 依赖于 LuaJIT 和 ngx_devel_kit。LuaJIT 需要安装,ngx_devel_kit 只需下载源码包,在 Nginx 编译时指定 ngx_devel_kit 目录
- nginx模块:nginx-http-concat
- nginx模块:ngx_devel_kit
- nginx模块:nginx-http-concat
1 | curl -R -O http://www.lua.org/ftp/lua-5.3.5.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 | apt install -y graphicsmagick |
直接用apt来安装的话,可以免去安装 jpg,png 等图片库依赖
创建用户及相应目录
1 | groupadd nginx && useradd nginx -g nginx -s /sbin/nologin -M |
创建用户也可以用以下命令:1
groupadd nginx && useradd nginx -g nginx -s /bin/false -M
编译安装nginx
1 | ./configure --prefix=/usr/local/nginx \ |
1 | make -j 2 && make install |
注意:动态加载模块,Nginx官方的load_module指令,详细文档参考1
和 参考2
还有–with-http_spdy_module 已经改为–with-http_v2_module了
,如果不用geo的话,编译的时候可以不加–with-http_geoip_module,可以不安装libgeoip-dev
测试nginx
1 | nginx -t |
如果出现以下错误(没有报错就不用做以下操作了)1
2root@ubuntu:/usr/local/src/nginx-1.14.2# nginx -t
nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: No such file or directory
执行以下命令即可1
2echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
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
52
53user nginx;
worker_processes 4;
worker_cpu_affinity 1000 0100 0010 0001;
error_log /var/log/nginx/error.log error;
pid /usr/local/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;
events
{
use epoll;
worker_connections 65535;
}
http
{
lua_load_resty_core off;
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;
}
注意:lua_load_resty_core off;如果不加会有以下错误
1 | nginx: [alert] detected a LuaJIT version which is not OpenResty's; many optimizations will be disabled and performance will be compromised (see https://github.com/openresty/luajit2 for OpenResty's LuaJIT or, even better, consider using the OpenResty releases from https://openresty.org/en/download.html) |
创建放图片的目录
目录规划
- /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://www.fanhaobai.com/2017/09/lua-in-nginx.html
https://github.com/openresty/lua-nginx-module/issues/1533
https://github.com/openresty/lua-nginx-module/pull/1501#issuecomment-486123650
https://github.com/openresty/lua-resty-core/issues/248
https://segmentfault.com/a/1190000011093243
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