Лучший способ перенаправить запросы изображения на другой веб-сервер? - PullRequest
5 голосов
/ 16 декабря 2008

Я пытаюсь уменьшить нагрузку на мои веб-серверы, добавив к нему «Сервер изображений» (выделенный сервер для обработки запросов изображений) и перенаправляя на него все запросы для файлов .gif, .jpg, .png и т. Д.

Мой вопрос: как лучше всего справиться с перенаправлением?

  • На уровне брандмауэра? (Могу ли я сделать это с помощью iptables?)
  • На уровне балансировщика нагрузки? (может ли ldirectord справиться с этим?)
  • На уровне apache - используя правила перезаписи?

Спасибо за любые предложения о наилучшем способе сделать это.

- Обновление -

Я хотел бы добавить, что это домены, предназначенные для третьих лиц, поэтому я не могу ожидать, что все разработчики изменят свой код и направят свои изображения на другой сервер.

Ответы [ 2 ]

3 голосов
/ 16 декабря 2008

Чем дальше по цепочке, тем лучше.

В идеале, делайте это на уровне DNS, используя другой домен для ваших изображений (например, imgs.example.com)

Если вы можете себе это позволить, попросите кого-нибудь сделать это с помощью CDN (сети доставки контента).

-Update-

Есть также 2 функции apache mod_rewrite, на которые вы можете захотеть взглянуть. Все они хорошо описаны на http://httpd.apache.org/docs/1.3/misc/rewriteguide.html.

Первый находится под заголовком «Динамическое зеркало» в приведенном выше документе, в котором используется флаг прокси-модуля mod_rewrite [p]. Это позволяет вашему серверу молча извлекать файлы из другого домена и возвращать их.

Второе - просто перенаправить запрос в новый домен. Этот второй вариант создает меньшую нагрузку на ваш сервер, но запросы по-прежнему должны поступать, и он замедляет окончательный рендеринг страницы, так как каждый запрос должен сначала сделать по существу избыточный запрос к вашему серверу.

1 голос
/ 16 декабря 2008

Я согласен с Рихом. Если вы хотите, чтобы изображения обслуживались с другого веб-сервера, разместите их на другом веб-сервере. Например:

<IMG src="images/Brett.jpg">

становится

<IMG src="http://brettnesbitt.akamia-technologies.com/images/Brett.jpg">

Любой вид балансировщика нагрузки будет по-прежнему подавать изображение из канала веб-сервера, чего вы пытаетесь избежать.


Я, конечно, знаю, чего ты действительно хочешь. То, что вы действительно хотите, для любого запроса как:

GET images/Brett.jpg HTTP/1.1

для автоматического преобразования в:

HTTP/1.1 307 Temporary Redirect
Location: http://brettnesbitt.akamia-technologies.com/images/Brett.jpg

таким образом вам не нужно выполнять какую-либо работу, кроме копирования изображений на другой веб-сервер.

Что я действительно не знаю, как это сделать.


Использование фразы «NAT» означает, что брандмауэр / маршрутизатор получает HTTP-запросы, и вы хотите перенаправить запрос на другой внутренний сервер, если HTTP-запрос был для файлов изображений.

Тогда возникает вопрос о том, что вы на самом деле пытаетесь сохранить. Независимо от того, какой внутренний веб-сервер обслуживает HTTP-запрос, данные все равно должны будут проходить через канал брандмауэра / маршрутизатора.

Причина, по которой я привожу это, состоит в том, что общий сценарий, когда кто-то хочет обслуживать изображения с другого сервера, заключается в том, что он хочет отделить контент с высокой пропускной способностью, в основном статический, с низкими затратами ЦП, от его фактической логики. *

Только использование NAT для перезаписи пакета и отправки его на другой сервер не поможет решить эту распространенную проблему.

Другая причина может заключаться в том, что изображения не являются статическим содержимым в вашей системе, и запрос к

GET images/Brett.jpg HTTP/1.1

фактически создает образ на лету, с высокой стоимостью ЦП или используя только те данные, которые доступны (например, база данных SQL Server) для ServerB.

Если это так, то я все равно использовал бы другое имя сервера в запросе изображения:

GET http://www.brettsoft.com/default.aspx HTTP/1.1
GET http://imageserver.brettsoft.com/images/Brett.jpg HTTP/1.1

Я понимаю, на что вы надеетесь , с проверкой сетевых пакетов для переопределения правила NAT и отправки его на другой сервер - я никогда не видел ничего подобного, что может сделать это.

Звучит более "прокси-иш", где веб-прокси это делает. (т.е. pfSense и m0n0wall не могут этого сделать)

Что затем приводит к некоему решению, которое мы использовали однажды: пользовательский веб-сервер, который анализирует запрос, отправляет соответствующий запрос с некоторого внутреннего сервера, а двоичный файл записывает ответ клиенту.

На этой боли в решении задницы настаивал "консультант по безопасности", который, очевидно, верит в безопасность через мрак .

я знаю, что IIS не может делать такие вещи для вас сам - я не знаю о других продуктах веб-сервера.


Я только что спросил, и, очевидно, если вы хотите написать собственный модуль ядра для вашего маршрутизатора на основе Linux, вы можете попросить его проверить пакеты и предпринять соответствующие действия. Такой модуль может существовать. Очевидно, существует множество других модулей с открытым исходным кодом, которые можно использовать в качестве отправной точки.

Но я бы лучше выстрелил себе в голову.

...