Я создал приложение для доставки изображений, которое может обслуживать изображения и изменять размер/изменять расширение изображения по запросу.
Я использую Express для маршрутизации и Sharp для работы с изображениями.
Когда изображение запрашивается с новым размером/расширением, я хочу сохранить сгенерированное изображение в файловой системе и получить сохраненное изображение при следующем запросе того же изображения с теми же параметрами (вид кеша).
Все, что я построил, отлично работает, но в производстве потребление процессора велико. Я подозреваю, что это потому, что я возвращаю изображение с res.sendFile()
после сохранения его в файловой системе.
В настоящий момент мой рабочий процесс:
fs.access()
)res.sendFile
путь локального изображенияres.sendFile
сгенерированный путь к изображению Я читаю, res.sendFile
не использует системный вызов sendfile и тяжелый CPU.
Как я могу его заменить?
Вот что я нашел при поиске в Google:
res.send()
новое изображение, я могу res.send()
буфер, созданный Sharp, вместо res.sendFile
сохраненное изображение Использование static
промежуточного программного обеспечения, к сожалению, даст одни и те же характеристики производительности, поскольку он использует те же методы под капотом, что и res.sendFile
. Кажется, что вы хотите сделать, чтобы обслуживать изображения из Nginx или smilar обратного прокси, запущенного перед вашим приложением.
Это можно сделать несколькими способами. Проще всего, вероятно, отправить перенаправления из вашего приложения 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;
}
fs.access
быстрее, поскольку он не возвращает всю (в данном случае) несвязанную информацию. Я лично используюpath-exists
( github.com/sindresorhus/path-exists ), который используетfs.access
, но возвращаетPromise