Как сконфигурировать виртуальные хосты для NGINX для ajax?

Есть такая задача. На одном доменном имени расположить два виртуальных хоста.
Первый хост. Отдает и работает со статикой написанной на VueJS
Второй хост. Принимает Ajax запросы от VueJS и передает их через passenger в rails-приложение
Подскажите пожалуйста. Как можно сконфигурировать хост для rails, чтобы он принимал только ajax запросы, а обычные запрсы с браузера шли на статику
  • Вопрос задан
  • 230 просмотров
Решения вопроса 1
neatsoft
@neatsoft
Life is too short for bad software
Существует три варианта решения этой проблемы:
  1. После сборки фронтенда можно помещать его в static files / assets бэкенда, и сервить так же, как и все остальные файлы. Этот метод плох тем, что утрачивается возможность применения cache forever / cache busting (добавления хэш суммы в имена файлов).
  2. Распределять запросы между сервисами используя договоренность о путях, например, /api/* и /admin/* отправлять в бэк, /static/* отдавать из каталога с VueJS статикой, а для всех остальных запросов возвращать dist/index.html (для избавления от # в путях и обеспечения поддержки history mode). Минус - об этой договоренности нужно помнить, и следить за её соблюдением. Появляется неявная зависимость между сервисами.
  3. Использовать разные поддомены, например, api.example.com для бэка, www.example.com - для фронта. Роутинг запросов в этом случае происходит наиболее естественным образом - на основании имени домена. Становятся доступны дополнительные способы масштабирования (размещение на разных серверах, dns round robin, использование разных reverse proxy), и появляется возможность тестирования / отладки фронта с апи из разных окружений (dev, staging, qa, prod).


ps. Cоветую упаковать ваши сервисы в Docker контейнеры, а в качестве reverse proxy / tls proxy / load balancer использовать Traefik вместо Nginx. Его киллер-фичи - auto discovery и auto load balancing. Кроме того, его гораздо проще правильно настроить. Сам Traefik тоже в контейнере работает, поэтому на сервере не требуется ничего кроме docker и docker-compose

traefik-architecture.svg
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
megafax
@megafax
web-программист
Вам необходимо расположить все таким образом, чтобы вся статика была в папке "doc_root" Вашего приложения и ее по регулярке Вы обрабатываете напрямую nginx. А все запросы пустить по ajax по пути /api/ и ее уже перенаправлять на Ваш бэк. Все остальное - разруливается на уровне Vue.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы