
通过 OpenResty+ MinIO + weserv/images 搭建自己的阿里云OSS
下面是一套可操作的方案,基于 OpenResty + MinIO + weserv/images 搭建一个可自托管、支持图片处理能力的“类阿里云 OSS” 服务。整体目标是: MinIO 作为对象存储(兼容 S3 API) OpenResty 提供反向代理、鉴权、图片处理网关 weserv/images 提供图片缩放、裁剪、格式转换等能力(类似阿里云 OSS 图片处理) 1. 安装 MinIO docker run -d --name minio \ -p 9000:9000 -p 9001:9001 \ -e...
通过 OpenResty+ MinIO + weserv/images 搭建自己的阿里云OSS
下面是一套可操作的方案,基于 OpenResty + MinIO + weserv/images 搭建一个可自托管、支持图片处理能力的“类阿里云 OSS” 服务。整体目标是:
MinIO 作为对象存储(兼容 S3 API)
OpenResty 提供反向代理、鉴权、图片处理网关
weserv/images 提供图片缩放、裁剪、格式转换等能力(类似阿里云 OSS 图片处理)
1. 安装 MinIO
docker run -d --name minio \ -p 9000:9000 -p 9001:9001 \ -e "MINIO_ROOT_USER=admin" \ -e "MINIO_ROOT_PASSWORD=admin123" \ minio/minio server /data --console-address ":9001"
访问 MinIO 控制台:
管理后台:http://localhost:9001
S3 接口:http://localhost:9000
2. 安装 weserv/images(图片处理服务)
weserv/images 本质是一个支持 URL 参数的图片处理服务器。
创建 Dockerfile 文件
FROM ghcr.io/weserv/images:5.x
RUN sed -i '/weserv_deny_ip/d' /etc/nginx/nginx.conf
构建并运行
docker build -t weserv/images . docker run -d -p 8080:80 --shm-size=1gb --name=weserv weserv/images
示例处理 URL:
http://localhost:8080?url=https://example.com/a.jpg&w=200&h=200
3. 安装 OpenResty
docker run -d --name openresty \ -p 80:80 \ -v /opt/openresty/conf/nginx.conf:/usr/local/openresty/nginx/conf/nginx.conf \ openresty/openresty:latest
4. 配置 OpenResty 作为代理(核心 OSS 功能)
编辑文件:/opt/openresty/conf/nginx.conf
server { listen 80; server_name img.example.com;# minio
# 图片处理 location ~* \.(jpg|jpeg|png|gif|webp)$ {
set $upstream ""; rewrite_by_lua_block { local args = ngx.req.get_uri_args() local process = args["x-image-process"] if not process then -- 没有 x-image-process 参数,直接代理到 minio ngx.var.upstream = "http://127.0.0.1:9000" .. ngx.var.uri else -- 有 x-image-process 参数,直接代理到 weserv/images local new_query = process:gsub("_", "="):gsub(",", "&") ngx.var.upstream = "http://127.0.0.1:8080/?url=127.0.0.1:9000" .. ngx.var.uri .. "&" .. new_query end } proxy_pass $upstream; }
# 其他资源 location / { proxy_pass http://127.0.0.1:9000; } }
重启 OpenResty:
docker restart openresty
5. 测试访问
① 原图访问(MinIO) http://img.example.com/path/to/img.jpg
② 缩略图(weserv/images) http://img.example.com/path/to/img.jpg?x-image-process=w_100
内部转发到weserv/images处理 http://127.0.0.1:8080/?url=img.example.com/path/to/img.jpg&w=100
等同 OSS 的: ?x-oss-process=image/resize,w_100
📰Originally published at dev.to
Staff Writer