Пересылка HTTP-запроса с прямым возвратом на сервер - PullRequest
0 голосов
/ 14 февраля 2010

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

Ниже приведен простой пример:
1) Браузер пользователя запрашивает http://www.example.com/files/file1.zip
2) Запрос отправляется на сервер A на основе записи DNS A для example.com.
3) Сервер A анализирует запрос и определяет, что /files/file1.zip хранится на сервере B.
4) Сервер A направляет запрос на сервер B.
5) Сервер B возвращает файл file1.zip непосредственно пользователю, не проходя через сервер A.

Примечание: шаги 4 и 5 должны быть прозрачными для пользователя и не должны включать в себя отправку перенаправления пользователю, поскольку это нарушит требование одного домена.

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

На шаге 4 мне кажется, что мне нужно выполнить преобразование MAC-адреса, а затем передать запрос обратно в сеть и для серверов вне сети сервера. Потребуется туннелирование.

Для шага 5 мне просто нужно настроить сервер B в соответствии с реальными серверами в настройке балансировки нагрузки. А именно, сервер B должен иметь IP-адрес сервера A в интерфейсе обратной связи и не должен отвечать на запросы ARP для этого IP-адреса.

Моя проблема в том, как на самом деле выполнить шаг 4?

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

В идеале я хотел бы выполнить маршрутизацию / пересылку на уровне веб-сервера, т. Е. На PHP или C # / ASP.net. Однако я готов сделать это на более низком уровне, таком как Apache или IIS, или на еще более низком уровне, то есть настраиваемой прокси-службе перед всем.

Ответы [ 2 ]

1 голос
/ 03 сентября 2012

Простите за мое невежество, но почему бы не настроить Сервер A для монтирования файлов, расположенных на других серверах, либо через NFS, либо через SMB, в зависимости от того, используете ли вы вариант Unix или используете Windows? 1001 *

Похоже, то, что вы пытаетесь сделать, слишком усложняет то, что может быть очень простым. Кроме того, использование подключенных по сети файлов позволит вам подключать эти файлы на дополнительных компьютерах в будущем, когда они вам понадобятся. В этот момент вы могли бы разместить балансировщик нагрузки перед сервером A (и серверами x, y и z, которые также все монтируют файлы с сервера B).

Конечно, это не решит проблему обхода сервера A при возврате, технически сервер A будет возвращать файл вместо сервера B, но если балансировщик нагрузки будет помещен перед A, то A станет B в любом случае, так что технически B все равно будет возвращать файл, потому что балансировщик нагрузки будет использовать прямой возврат с сервера (это стандартная функция уже давно).

Если я что-то упустил, пожалуйста, уточните.

Редактировать: Да, я понимаю, что это было опубликовано почти 3 года назад. Ну хорошо.

0 голосов
/ 14 февраля 2010

Почему бы не отправить HTTP-ответ с кодом состояния 307 Временное перенаправление?

В этот момент клиент повторно запросит правильный сервер.

Я знаю, что вам нужен один домен, но вы можете иметь оба отдельных поддоменов плюс один общий домен.

Например:

example.com имеет IP1, IP2, IP3.

example1.example.com имеет IP1
example2.example.com имеет IP2
example3.example.com имеет IP3

Если запрос поступает на сервер, который он не может обработать сам, он перенаправляет пользователя, чтобы сделать еще один запрос на правильный конкретный сервер. Кстати, HTTP-браузер будет прозрачно выполнять эту переадресацию.

...