介绍

thumbor 是一个智能图像服务,已经在Github开源,支持按需裁剪、调整大小、应用过滤器和优化图像。用过对象存储服务的朋友可能知道,一般对象存储服务商会同时提供额外的图像处理服务(比如图像裁剪、图像水印等功能),有了thumbor之后我们完全可以自建搭建一个与之类似的图像处理服务。

thumbor是用Python 3开发的,官方也提供了多种安装方式,这篇文章分享下使用Docker搭建一个开源的图像裁剪服务thumbor

准备工作 & 安装Docker

还没有安装Docker服务的朋友可以参考我之前的文章安装Docker服务:Linux安装Docker与Docker常用命令

同时建议安装Docker compose方便后续的维护:

1
2
3
4
5
6
#下载docker-compose
curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#添加执行权限
chmod +x /usr/local/bin/docker-compose
#创建软连接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

Docker安装thumbor

官方文档中给出的命令非常简单,只需要一行命令即可运行Docker thumbor:

1
docker run -p 8888:80 minimalcompact/thumbor

运行成功后便可访问http://IP:8888/unsafe/275x0/https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
进行裁剪图像,其中:

  • 275指的是裁剪后的宽度(像素)
  • 0指的是裁剪后的高度,0则代表自适应
  • 最后末尾给了一个需要裁剪的图像地址,这里用的百度的logo
    不过正常的用途xiaoz是不建议直接使用上面的命令的,虽然简单,但缺少了很多自定义参数设置,接下来我会将我用到的一些参数整理出来供大家参考。

docker-compose安装thumbor

为了方面后续维护,建议使用docker-compose来进行安装。首先新建一个目录mkdir thumbor

然后在这个目录新建一个thumbor配置文件,命名为thumbor.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
#裁剪最大宽度,意味着裁剪的图片不会超过此像素,默认是0(不限制)
MAX_WIDTH = 1200
#裁剪最大高度,意味着裁剪的图片不会超过此像素,默认是0(不限制)
MAX_HEIGHT = 800
#裁剪最小宽度,意味着裁剪的图片不会低于此像素,默认是1
MIN_WIDTH = 50
#裁剪最小高度,意味着裁剪的图片不会低于此像素,默认是1
MIN_HEIGHT = 50
#允许裁剪的图片的域名,支持正则表达式,支持多个图片
ALLOWED_SOURCES = ['.+\.baidu\.com', '.+\.bmp\.ovh']
#裁剪图像的质量,默认为80
QUALITY = 80
#图像应保留在浏览器缓存中的秒数。它与 Expires 和 Cache-Control 标头直接相关
MAX_AGE = 7 * 24 * 60 * 60
#当图像在检测中出现错误或延迟排队时,为图像缓存设置一个低得多的过期时间会很方便。这样浏览器将更快地请求正确的图像。
MAX_AGE_TEMP_IMAGE = 60
#裁剪后的图像保存到哪个引擎,下方指的是保存到本地存储,从而进行缓存
RESULT_STORAGE = 'thumbor.result_storages.file_storage'
#原始图像保存时间
STORAGE_EXPIRATION_SECONDS = 864000
#裁剪后的图像保存时间
RESULT_STORAGE_EXPIRATION_SECONDS = 864000
#裁剪后的图片保存到哪个位置
RESULT_STORAGE_FILE_STORAGE_ROOT_PATH = '/tmp/thumbor/result_storage'
#开启结果缓存(裁剪图像的缓存)
RESULT_STORAGE_STORES_UNSAFE = True

thumbor还有其它很多配置,有兴趣的朋友可以参考官方文档:https://thumbor.readthedocs.io/en/latest/configuration.html

继续在thumbor目录下新建一个docker-compose.yml,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
version: '3.3'
services:
thumbor:
ports:
- '8888:80'
restart: always
container_name: thumbor
volumes:
- './thumbor.conf:/app/thumbor.conf'
- './result_storage:/tmp/thumbor/result_storage'
- './storage:/tmp/thumbor/storage'
image: minimalcompact/thumbor

输入命令启动容器

1
docker-compose up -d

这样我们可以继续使用上面提到的方法裁剪图片了,可访问http://IP:8888/unsafe/275x0/https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png

Nginx反向代理

上述方法部署完毕后,是通过IP + 端口访问的,显然不符合生产要求,我们可以使用nginx反向代理,并通过域名镜像访问,示例配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server {
listen 80;
server_name youdomain.com;

access_log /data/wwwlogs/youdomain.com_nginx.log combined;

location / {
proxy_http_version 1.1;
proxy_set_header Connection "";
#chunked_transfer_encoding off;
proxy_pass http://127.0.0.1:8888;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

总结

thumbor提供了多种安装方式,通过Docker部署简单且易于维护
正式用途请根据自己的场景自定义thumbor参数
可通过nginx反向代理配置域名访问和防盗链限制