下面是一套可操作的方案,基于 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
Top comments (0)