Как эффективно хранить и обслуживать множество небольших изображений на веб-сайте? - PullRequest
3 голосов
/ 10 марта 2010

На моем веб-сайте я хочу предоставить пользователю страницу с множеством маленьких картинок, вроде миниатюр в Windows.
Все изображения представляют собой файлы размером от 1 КБ до 300 КБ, но обычно не больше 5 КБ.

В настоящее время все эти изображения находятся в папке на веб-сервере (linux + apache), но я не думаю, что это лучшее решение, особенно если мне придется расширить на несколько веб-серверов, и когда У меня их будет тысячи.

Итак, я должен поместить эти файлы в базу данных (могу ли я)? Или есть отдельный файловый сервер? Другие предложения?

Ответы [ 2 ]

4 голосов
/ 10 марта 2010

Несколько вещей для рассмотрения:

  • Не помещайте изображения в базу данных, если вы не можете сохранить их в памяти. Обычные файлы часто являются идеальным решением для двоичных данных, и вы все равно будете отправлять отдельные HTTP-запросы для каждого из них.
  • Если вы можете зеркально отображать изображения на нескольких серверах и балансировать между ними, прекрасно.
  • Если у вас нет дополнительных серверов, попробуйте подделать его с помощью виртуальных поддоменов, чтобы обойти ограничения одновременных подключений. См. эту статью . Также имеет отношение к этому: распространение изображений на каждой странице по вашим поддоменам, 2 или более на каждом.
  • Не пытайтесь сжимать трафик. Вы будете тратить только процессорное время.
  • Убедитесь, что вы используете правильное кэширование (например, срок действия в будущем) для статических изображений. Вы всегда можете изменить адрес, если изображение обновлено.
  • Убедитесь, что вы обслуживаете весь статический контент с доменов без файлов cookie.
1 голос
/ 10 марта 2010

Вы хотите разместить как можно меньше процессорного времени / изображения.Я бы предложил использовать прокси для показа этих картинок (в качестве статического контента).У меня есть хороший опыт работы с nginx , это быстро и надежно.

Ваша конфигурация может выглядеть примерно так:

worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  300;

    server {
        listen       8080;
        server_name  localhost;

        location /static/ {root static/pictures/;}

        location / { proxy_pass http://127.0.0.1:8081; }
    }
}

Там, где у вас есть сервер на порту 8081, и вы напрямую обслуживаете свои изображения из папки / static / pictures.(Обратите внимание, что все URL, начинающиеся с '/ static', будут обслуживаться из этой папки.)

...