golang高效图片存储转换缓存服务插件webp-server的使用

Golang高效图片存储转换缓存服务插件webp-server的使用

webp-server简介

webp-server是一个基于libvips、bimg和fasthttp构建的动态图片调整大小和格式转换服务器。它能够高效地存储、调整大小、转换和缓存图片。

Flowchart

快速开始

运行webp-server的docker容器:

docker run -d -v webp_server_volume:/var/lib/webp-server --name webp-server -e TOKEN='MY_STRONG_TOKEN' -p 127.0.0.1:8080:8080 ms68/webp-server

上传图片:

curl -H 'Token: MY_STRONG_TOKEN' -X POST -F 'image_file=@/path/to/image.jpg' http://127.0.0.1:8080/upload/
# 这个API会返回一个image_id

在浏览器中打开这些URL:

http://127.0.0.1:8080/image/width=500,height=500,fit=contain,quality=100/{image_id}
http://127.0.0.1:8080/image/width=300,height=300,fit=cover,quality=90/{image_id}

常见问题

什么是webp-server?

webp-server是一个基于libvips、bimg和fasthttp构建的动态图片调整大小和格式转换服务器。后端开发者可以在他们的服务器机器上运行这个程序并上传图片到它,而不是存储它们。它将返回一个image_id,需要由后端应用程序保存在数据库中。

为什么要使用WebP格式提供图片?

根据Google Developers网站:

WebP是一种现代图像格式,可为网络上的图像提供卓越的无损和有损压缩。使用WebP,网站管理员和Web开发人员可以创建更小、更丰富的图像,使网络更快。

webp-server如何处理不支持WebP的浏览器?

当浏览器请求图片时,它们会发送一个包含支持的图像格式的accept头。webp-server会查找该头以查看浏览器是否支持WebP。如果不支持,它将发送JPEG格式的图片。

安装方法

Docker方式

docker run -d -v webp_server_volume:/var/lib/webp-server --name webp-server -e TOKEN='MY_STRONG_TOKEN' -p 127.0.0.1:8080:8080 ms68/webp-server

下载二进制文件

在Ubuntu 20.04上安装依赖:

sudo apt install libvips

检查libvips版本:

vips -v

下载二进制文件:

wget https://github.com/mehdipourfar/webp-server/releases/download/v1.0.0/webp-server_1.0.0_linux_amd64.tar.gz

从源码构建

sudo apt install libvips-dev git

# 如果你系统上没有安装Golang
wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.15.6.linux-amd64.tar.gz
export GOPATH=$HOME/go
export PATH=$PATH:/usr/local/go/bin

go get -u -v github.com/mehdipourfar/webp-server
sudo cp $HOME/go/bin/webp-server /usr/bin/

# 下载并编辑example-config.yml为你的配置
wget https://raw.githubusercontent.com/mehdipourfar/webp-server/master/example-config.yml

# 运行服务器:
webp-server -config example-config.yml

配置

配置参数包括:

  • data_dir: 存储图片和缓存图片的数据目录
  • server_address: ip:port组合,默认127.0.0.1:8080
  • token: 后端应用程序应发送的请求头令牌
  • default_image_quality: 默认图片质量
  • valid_image_qualities: 接受的图片质量值列表
  • valid_image_sizes: 接受的图片尺寸列表
  • max_uploaded_image_size: 最大上传图片大小(MB)
  • debug: 调试模式

后端API

  • /upload/ [Method: POST]: 上传图片

    curl -H 'Token: 456e910f-3d07-470d-a862-1deb1494a38e' -X POST -F 'image_file=@/path/to/image.png' http://127.0.0.1:8080/upload/
    
  • /delete/(image_id) [Method: DELETE]: 删除图片

    curl -H 'Token: 456e910f-3d07-470d-a862-1deb1494a38e' -X DELETE "http://localhost:8080/delete/lulRDHbMg";
    
  • /health/ [Method: GET]: 健康检查

前端API

  • /image/(image_id) [Method: GET]: 获取原始图片
  • /image/(filter_options)/(image_id) [Method: GET]: 获取过滤后的图片

示例URL:

http://example.com/image/w=500,h=500/lulRDHbMg
http://example.com/image/w=500,h=500,q=95/lulRDHbMg
http://example.com/image/w=500,h=500,fit=cover/lulRDHbMg
http://example.com/image/w=500,h=500,fit=contain/lulRDHbMg
http://example.com/image/w=500,fit=contain/lulRDHbMg

反向代理配置

webp-server不支持SSL或域名验证。建议在其前面使用反向代理(如nginx)。以下是一个最小化的nginx配置:

upstream webp_server {
    server 127.0.0.1:8080 fail_timeout=0;
}

server {
   # ...

   location /image/ {
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Protocol $scheme;
        proxy_pass http://webp_server;
    }
}

安全清单

  • 在生产环境中将debug配置设置为false
  • 将valid_image_qualities和valid_image_sizes缩小到你真正需要的值
  • 从服务器外部,webp-server地址不应可访问,用户应只能通过反向代理看到/image/路径

更多关于golang高效图片存储转换缓存服务插件webp-server的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高效图片存储转换缓存服务插件webp-server的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用webp-server实现高效的图片存储转换缓存服务

webp-server是一个用Go语言编写的高性能图片转换和缓存服务,它能够实时将各种格式的图片转换为WebP格式并缓存结果,显著提升网站图片加载速度。

webp-server的核心特性

  1. 自动转换:支持JPEG、PNG等格式自动转换为WebP
  2. 智能缓存:转换后的图片会自动缓存,避免重复转换
  3. 高性能:基于Go语言开发,处理速度快
  4. 轻量级:资源占用低,部署简单

安装webp-server

# 使用go install安装最新版
go install github.com/webp-sh/webp_server_go@latest

# 或者下载预编译二进制
wget https://github.com/webp-sh/webp_server_go/releases/latest/download/webp-server-linux-amd64 -O webp-server
chmod +x webp-server

基本使用示例

package main

import (
	"log"
	"net/http"
	
	"github.com/webp-sh/webp_server_go/helper"
	"github.com/webp-sh/webp_server_go/server"
)

func main() {
	// 配置选项
	config := helper.Config{
		Host:       "127.0.0.1",
		Port:       "3333",
		ImgPath:    "/path/to/your/images",  // 原始图片目录
		ExhaustPath: "/path/to/cache",      // 缓存目录
		Quality:    80,                     // WebP质量 (1-100)
		EnableWebP: true,                   // 启用WebP转换
		EnableAVIF: false,                  // 是否启用AVIF转换
	}
	
	// 创建服务器实例
	srv := server.NewServer(config)
	
	// 启动HTTP服务
	log.Printf("Starting webp-server on %s:%s", config.Host, config.Port)
	log.Fatal(http.ListenAndServe(config.Host+":"+config.Port, srv))
}

高级配置示例

package main

import (
	"log"
	"net/http"
	"time"
	
	"github.com/webp-sh/webp_server_go/helper"
	"github.com/webp-sh/webp_server_go/server"
)

func main() {
	config := helper.Config{
		Host:        "0.0.0.0",
		Port:        "3333",
		ImgPath:     "/var/www/images",
		ExhaustPath: "/var/cache/webp",
		Quality:     85,
		EnableWebP:  true,
		EnableAVIF:  true,
		
		// 高级选项
		ReadTimeout:      10 * time.Second,
		WriteTimeout:     10 * time.Second,
		MaxBytesReader:   10 << 20, // 10MB
		AllowedTypes:     []string{"jpg", "jpeg", "png"},
		EnableExtraParam: true,
	}
	
	// 自定义中间件
	srv := server.NewServer(config)
	wrappedHandler := loggingMiddleware(srv)
	
	log.Printf("Starting enhanced webp-server on %s:%s", config.Host, config.Port)
	log.Fatal(http.ListenAndServe(config.Host+":"+config.Port, wrappedHandler))
}

// 示例日志中间件
func loggingMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		start := time.Now()
		next.ServeHTTP(w, r)
		log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
	})
}

Nginx集成配置

server {
    listen 80;
    server_name example.com;
    
    location /images/ {
        # 原始图片目录
        root /var/www;
        
        # 传递给webp-server处理
        try_files $uri @webp;
    }
    
    location @webp {
        proxy_pass http://127.0.0.1:3333;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

性能优化建议

  1. 调整缓存策略:根据图片更新频率设置合适的缓存时间
  2. 启用AVIF支持:AVIF格式比WebP更高效,但转换耗时更长
  3. 批量预转换:对常用图片预先转换,减少实时转换压力
  4. 监控指标:添加Prometheus监控指标跟踪服务性能

监控集成示例

package main

import (
	"log"
	"net/http"
	
	"github.com/prometheus/client_golang/prometheus/promhttp"
	"github.com/webp-sh/webp_server_go/helper"
	"github.com/webp-sh/webp_server_go/server"
)

func main() {
	config := helper.DefaultConfig()
	config.ImgPath = "/var/www/images"
	config.ExhaustPath = "/var/cache/webp"
	
	// 创建服务器
	srv := server.NewServer(config)
	
	// 添加Prometheus监控端点
	http.Handle("/metrics", promhttp.Handler())
	http.Handle("/", srv)
	
	log.Println("Starting webp-server with metrics on :3333")
	log.Fatal(http.ListenAndServe(":3333", nil))
}

webp-server是一个强大而灵活的工具,可以显著提升网站图片加载性能。通过合理配置和优化,它能够处理高并发的图片转换请求,同时保持较低的资源占用。

回到顶部