|
||
Ответить |
|
#1
|
|
Вес репутации:
0
Регистрация: 27.02.2009
Адрес: Москва
Сообщений: 7,302
Сказал(а) спасибо: 578
Спасибок 2,627
в 1,832 сообщениях |
Генератор миниатюрок из Nginx-а -
07.06.2010, 18:46
Давайте соберём генератор миниатюрок на базе любимого народом веб-сервера — nginx-а. Что примечательно, сделаем мы это без единого гвоздя, т.е. без единой строчки кода, не считая конфигурации.
Старая школа велит нам генерировать все необходимые миниатюрки сразу после загрузки базового изображения. Способ проверенный и надёжный, однако, мы живём в изменчивом новом мире, в котором нам может понадобится новый размер миниатюрок с утра в понедельник. Поэтому генерировать миниатюрки будем на лету, по запросу. Для дела нам понадобится ngx_http_image_filter_module, модуль, который умеет трансформировать изображения в форматах JPEG, GIF и PNG. Модуль стандартный, но по-умолчанию не собирается, поэтому перед сборкой нгинкса нужно добавить его: Теперь ставим libgd способом, принятым у нас в системе, и собираем нгинкс. Кстати, при сборке из портов FreeBSD достаточно выполнить make config и выбрать нужный модуль в списке. Просто пережимка Для простоты будем считать, что у нас есть домен images.domain.ru, с которого выдаются картинки лежащие в /path/to/images. Запросы к /some/image.jpg будут выдаваться напрямую, к /120x90/some/image.jpg или /120x-/some/image.jpg будут жаться в миниатюрки (во втором случае идёт масштабирование только по ширине). В таком случае получаем: Что тут происходит? Сначала мы определяем размеры миниатюрки и устанавливаем соответствующие переменные. Затем выдаём статику и переходим к выдаче миниатюрок, рассмотрим второй location по-подробнее: rewrite перенаправляет url на настоящий файл, image_filter уменьшает полученную картинку, break предотвращает внутренний редирект с выходом из location. Последнее важно иначе нгинкс пройдёт весь путь ещё раз с уже переписанным URL и выдаст полную картинку. Можно добавить предопределённые размеры: Этим можно уже пользоваться если не жалко процессора, к слову на FreeBSD 8/Core 2 Quad Q9550 @ 2.83GHz/DDR2-800 удавалось пережимать 200 картинок в секунду (jpeg, 640x480 -> 150x150). Но, конечно, нам процессор жалко, поэтому будем пережатые картинки кэшировать. Пережимка с кэшированием Кэшированием в нгинксе занимается ngx_http_proxy_module, кэширует он только то, что проксирует, поэтому нам понадобиться извернутся — будем слушать два порта и проксировать сами себя: Готово, теперь на вышеупомянутой системе нгинкс выдаёт 15000 картинок в секунду, если всё из кэша, — чертовски быстро. Я не буду расписывать настройки, они неплохо расписаны в документации модуля. А полный конфиг можно взять тут. Источник <!-- Вопросы задаем на форуме, не в ЛС --> |
Ответить |
Опции темы | |
Опции просмотра | |
|
|