Уменьшения изображений при помощи nginx
-
11 мая 2009 13:56
-
Комментарии

В этом посте я хочу рассказать про интересный, на мой взгляд, модуль ngx_http_image_filter_module, который появился в начале этого месяца в nginx. Появился он как раз в тот момент когда я думал что же делать с кучей рисунков используемых в сообщениях блога.
Первая проблема состояла в том что при загрузке рисунка создавались ещё два рисунка т.е. одна уменьшенная копия (чтобы рисунок влезал в колонку с сообщением) и thumbinal для просмотра в админке. Плохо было то, что довольно большая часть из сохранённых изображений не использовалась. Хотя до нехватки места на диске было ещё далеко, но оставлять проблему на самотёк не хотелось.
Вторая проблема состояла в том что хотелось загружать не только файлы с изображениями. Однако используемый плагин file_column не позволял смешивать файлы изображении с другими типами файлов.
Я видел три варианта решения этой проблемы:
- “Допилить” используемый мною плагин до состояния когда можно будет управлять тем, какие файлы для изображения создавать, а какие нет.
- Попробовать найти готовый плагин дающий описанную в первом пункте функциональность.
- Динамически создавать уменьшенные копии изображений.
Изучить пункты 1 и 2 мне не удалось, так что если кто-нибудь располагает интересной информацией о них, то большая просьба отписаться в комментариях. А вот динамическое создание уменьшенных копий изображений стало реальностью благодаря модулю ngx_http_image_filter_module. Стоит заметить что до этого третий вариант хоть и выглядел более привлекательным, но не устраивал меня т.к. в той реализации которую я себе представлял он был требователен к ресурсам.
Что же из себя представляет модуль ngx_http_image_filter_module?
Модуль ngx_http_image_filter_module позволяет обрабатывать изображения в форматах JPEG, GIF и PNG при поступлении запросов к nginx серверу. Пока количество преобразований которые можно делать над изображениями мало, но судя по всему в следующих версиях их станет больше.
Для уменьшения изображений можно использовать преобразования resize или crop (их описание можно найти по ссылке указанной выше). В моём случае потребовалось добавить следующие секции в nginx.conf (от создания thumb-иналов я позже отказался так что их здесь нет):
location ~* \/medium\/.*\.(jpg|jpeg|gif|png)$ {
rewrite ^(.*)\/medium\/(.*)\.(jpg|jpeg|gif|png)$ $1/$2.$3 break;
image_filter resize 530 480;
error_page 415 = /empty;
}
location = /empty {
empty_gif;
}
В указанной конфигурации обращение по URL:
http://maksd.info/attachment/file/51/medium/Russia.jpg
возвращает уменьшенную копию изображения, оригинал которого доступен по адресу:
http://maksd.info/attachment/file/51/Russia.jpg
Собственно это всё что нужно сделать чтобы получать уменьшенные копии изображений :)
Что качается производительности и расхода памяти, то изменений заметных на глаз в моём случае я не заметил. Более подробное обсуждение производительности этого модуля можно найти здесь.
в формате RSS. Присоединяйся!
Комментарии
Добавить новый комментарий
Вы можете использовать следующие BBCode теги в комментариях:
| BBCode тег | Результат |
|---|---|
| [b]Жирный текст[/b] | Жирный текст |
| [i]Курсив[/i] | Курсив |
| [u]Подчёркнутый текст[/u] | Подчёркнутый текст |
| [url]http://example.com[/url] | http://example.com |
| [url=http://example.com]Example[/url] | Example |
|
[code]for message in @messages puts message.name end[/code] |
|
|
[quote] IE6 must die! [/quote] |
IE6 must die! |


Я думаю, при высокой посещаемости такой вариант абсолютно неприменим. Вот если бы nginx умел делать превью и класть его на диск, чтобы потом читать с диска - вот это дааа.
P.S. У вас ужасная каптча на комментах.
Да, такой вариант я тоже рассматривал. И даже думаю nginx вполне можно научить его делать используя ngx_http_perl_module, возможно когда-нибудь даже попробую и такой способ.
P.S.
Спасибо, эта каптча мой небольшой эксперимент :) Мне она тоже не особо нравится, так что скорее всего в ближайшем будущем её не станет.