使用 Express 提供动态生成的图像或保存的图像
Serve dynamically generated image or saved image with Express
我构建了一个图像传送应用程序,可以按需提供图像和 resize/change 图像扩展。
我使用 Express 进行路由,使用 Sharp 处理图像。
当使用新的 size/extension 请求图像时,我想将生成的图像保存在文件系统中,并在下次使用相同的参数请求相同的图像时检索保存的图像(有点像缓存)。
我构建的一切都运行良好,但在生产中 CPU 使用率很高。我怀疑这是因为我 return 将图像保存到文件系统后 res.sendFile()
。
目前这是我的工作流程:
- 我检查文件系统是否已使用所需参数保存图像 (
fs.access()
)
- 如果存在,我
res.sendFile
本地图片路径
- 如果不存在,我使用 Sharp 生成它,将其保存在文件系统中,然后
res.sendFile
生成的图像路径
我读到 res.sendFile
不使用系统 sendfile 调用,而且 CPU-很重。
如何替换它?
这是我在谷歌搜索时发现的:
- 当我生成新图像时,我可以
res.send()
Sharp 生成的缓冲区而不是res.sendFile
保存的图像
- 当图像已经保存时,也许我应该使用静态快速中间件(http://expressjs.com/en/starter/static-files.html)但我不知道如何动态调用它并告诉它图像路径(基于参数在请求中提供 URL).
不幸的是,使用 static
中间件会产生相同的性能特征,因为它在后台使用与 res.sendFile
相同的方法。看起来您想要做的是在您的应用程序前面提供来自 Nginx 或类似反向代理 运行 的图像。
有几种方法可以做到这一点。最简单的方法可能是从您的 Node.js 应用发送重定向,指向反向代理将服务的位置。
基本上,当收到 /imageID/toto.jpg?quality=80
的请求时,您希望将其重定向到 /static-images/imageID_80.jpg
。
// ...
const imageName = ${req.params.imageId}_${req.query.quality}.jpg
if (!(await pathExists(imageName))) {
await generateFileUsingSharp(req.params.imageId, req.query.quality)
}
res.redirect(`/static-images/${imageName}`)
然后让 Nginx 在 /static-images
位置下提供文件:
location /static-images {
alias /var/www/generated-images;
}
我构建了一个图像传送应用程序,可以按需提供图像和 resize/change 图像扩展。
我使用 Express 进行路由,使用 Sharp 处理图像。
当使用新的 size/extension 请求图像时,我想将生成的图像保存在文件系统中,并在下次使用相同的参数请求相同的图像时检索保存的图像(有点像缓存)。
我构建的一切都运行良好,但在生产中 CPU 使用率很高。我怀疑这是因为我 return 将图像保存到文件系统后 res.sendFile()
。
目前这是我的工作流程:
- 我检查文件系统是否已使用所需参数保存图像 (
fs.access()
) - 如果存在,我
res.sendFile
本地图片路径 - 如果不存在,我使用 Sharp 生成它,将其保存在文件系统中,然后
res.sendFile
生成的图像路径
我读到 res.sendFile
不使用系统 sendfile 调用,而且 CPU-很重。
如何替换它?
这是我在谷歌搜索时发现的:
- 当我生成新图像时,我可以
res.send()
Sharp 生成的缓冲区而不是res.sendFile
保存的图像 - 当图像已经保存时,也许我应该使用静态快速中间件(http://expressjs.com/en/starter/static-files.html)但我不知道如何动态调用它并告诉它图像路径(基于参数在请求中提供 URL).
不幸的是,使用 static
中间件会产生相同的性能特征,因为它在后台使用与 res.sendFile
相同的方法。看起来您想要做的是在您的应用程序前面提供来自 Nginx 或类似反向代理 运行 的图像。
有几种方法可以做到这一点。最简单的方法可能是从您的 Node.js 应用发送重定向,指向反向代理将服务的位置。
基本上,当收到 /imageID/toto.jpg?quality=80
的请求时,您希望将其重定向到 /static-images/imageID_80.jpg
。
// ...
const imageName = ${req.params.imageId}_${req.query.quality}.jpg
if (!(await pathExists(imageName))) {
await generateFileUsingSharp(req.params.imageId, req.query.quality)
}
res.redirect(`/static-images/${imageName}`)
然后让 Nginx 在 /static-images
位置下提供文件:
location /static-images {
alias /var/www/generated-images;
}