Горизонтальное масштабирование: маршрутизация пользовательских поддоменов между серверами

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

В настоящее время каждый поддомен каждого пользователя попадает в тот же виртуальный хост, где один фронт-контроллер PHP отображает соответствующий контент на основе имени хоста. Единственная подстановочная DNS-запись для * .mydomain.com указывает на текущий сервер.

Каков мой лучший вариант для маршрутизации различных поддоменов пользователей на разные серверы?

Мои мысли:

  • Новый домен верхнего уровня для каждого сервера. user.s1.mydomain.com, user.s2.mydomain.com и т. д. (неэлегантная и утечка информации)
  • Запустите собственный DNS-сервер для маршрутизации пользователей между серверами (дополнительная точка отказа, незнакомая технология)
  • Центральный фронт-контроллер / балансир, который обращает все запросы на соответствующий сервер (дополнительная точка отказа, потенциально ограниченные соединения)

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

В своей шкале установите nginx для обработки всего статического содержимого и обратного динамического содержимого прокси на столько ящиков, сколько необходимо. Настройка простого прокси-прохода близка к:

upstream upstream_regular_backend { fair; server 10.0.0.1:80; server 10.0.0.2:80; } server { listen 0.0.0.0:80; server_name example.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; location / { proxy_pass http://upstream_regular_backend; } } 

Для обслуживания статического контента и передачи всего остального, что-то вроде:

 server { listen 0.0.0.0:80; server_name example.com; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; index index.php; root /some/dir/: location ~ \.php { proxy_pass http://upstream_regular_backend; } } 

Естественно, если вы не используете PHP, настройте соответствующую конфигурацию.

По определению вверху, «справедливое»; будут основываться на балансировке баланса на основе времени отклика. Для мотивов кэширования вы можете использовать «ip_hash;» вместо этого, поскольку он будет обрабатывать запросы от клиента всегда на одном сервере.

Наша установка немного дальше по дороге. У нас есть nginx load-balancers, проксирующий кэш лака, который, в свою очередь, проксирует серверы динамического контента.

Если вы беспокоитесь о том, что nginx является одноточечным отказом, настройте вторичный сервер, готовый принять IP-адрес интерфейса в случае его отказа.