DEV Community

DD
DD

Posted on

通过 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"
Enter fullscreen mode Exit fullscreen mode

访问 MinIO 控制台:

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
Enter fullscreen mode Exit fullscreen mode

构建并运行

docker build -t weserv/images .
docker run -d -p 8080:80 --shm-size=1gb --name=weserv weserv/images
Enter fullscreen mode Exit fullscreen mode

示例处理 URL:

http://localhost:8080?url=https://example.com/a.jpg&w=200&h=200
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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;        
    }
}
Enter fullscreen mode Exit fullscreen mode

重启 OpenResty:

docker restart openresty
Enter fullscreen mode Exit fullscreen mode

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)