Рейтинг:0

Обратный прокси Nginx для двух веб-приложений

флаг in

У меня есть два приложения.

  • Приложение Laravel - Быть просто динамическим веб-сайтом. Не имеет знание данных. Все данные извлекаются из второго приложения. с помощью AJAX-запросов. Работает на 127.0.0.1:8000.
  • Приложение ржавчины - Веб-приложение, содержащее весь бизнес логика и доступ к данным. Работает на 127.0.0.1:8080.

Оба приложения должны быть доступны по URL-адресу. пример.com. Для этого я хочу использовать обратный прокси Nginx. Я уже могу перенаправить все запросы в свое приложение Laravel.

События {}
http {
    сервер {
        слушать 80;

        # Веб-сайт
        место расположения / {
            прокси_пароль http://127.0.0.1:8000;
        }
        
    }
}

Пока приложение Laravel работает, мне действительно нужна следующая конфигурация Nginx:

  • Конкретные страницы, такие как /Новости, /, ,/контакт,... следует перенаправить на 127.0.0.1:8000.
  • Примечание. Страницы выше могут содержать GET-параметры, например, / новости? статья = abc.
  • ВСЕ другие запросы должны быть перенаправлены на 127.0.0.1:8080.
  • Примечание. 127.0.0.1:8080 часто может содержать субдомен. Но этот поддомен должен действовать как подстановочный знак и неизвестен во время настройки. Пример: bussiness1.example.com, bussiness2.example.com, businnesX.example.com,...

Субдомен возвращает персонализированную страницу, которую может запросить неограниченное количество предприятий на example.com.

Как бы я достиг этой конфигурации? Я думал что-то вроде этого?

#ПСЕВДО
События {}
http {
    сервер {
        слушать 80;

        # Веб-сайт
        место расположения / {
            прокси_пароль http://127.0.0.1:8000;
        }
        местоположение / новости {
            прокси_пароль http://127.0.0.1:8000;
        }
        местоположение / о {
            прокси_пароль http://127.0.0.1:8000;
        }

        # Применение
        место расположения * {
            прокси_пароль http://127.0.0.1:8080;
        }

    }
}

Изменить ответ Теро: Мне нужен своего рода подстановочный знак для субдоменов.

 # Всеобъемлющее приложение
    место расположения / {
        proxy_pass http://$subdomain.$application;
    }

abc.example.com должен перейти на abc.127.0.0.1:8080 def.example.com должен перейти к def.127.0.0.1:8080 ...

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

Редактировать 2 - передать поддомен запроса в proxy_pass:

сервер {
        слушать 80;
        имя_сервера *.website.com;
        server_name ~^(?<субдомен>.+)\.website\.com$;

        место расположения / {
            proxy_pass http://$subdomain.vhost.local:8080;
        }
    }

Это правильный способ перенаправления dynamicxxx.website.com на dynamicxxx.vhost.local:8080?

djdomi avatar
флаг za
я думаю, вам нужно заменить звезду на тильду
Рейтинг:2
флаг us

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

вышестоящий веб-сайт {
    сервер 127.0.0.1:8000;
}

вышестоящее приложение {
    сервер 127.0.0.1:8080;
}

сервер {
    имя_сервера example.com *.example.com;

    слушать 80;

    # Всеобъемлющее приложение
    место расположения / {
        proxy_pass http://приложение;
    }

    # Веб-сайт
    местоположение = / {
        proxy_pass http://сайт;
    }

    местоположение / новости {
        proxy_pass http://сайт;
    }

    местоположение / о {
        proxy_pass http://сайт;
    }
}

= символ означает точное совпадение с URI и является приоритетом в процессе поиска nginx, как описано в документация по nginx

Альтернативный подход заключается в использовании регулярного выражения:

сервер {
    имя_сервера example.com *.example.com;

    слушать 80;

    место расположения / {
        proxy_pass http://приложение;
    }

    расположение ~ ^(?:/|/новости|/о нас) {
        proxy_pass http://сайт;
    }
}

имя_сервера example.com *.example.com указывает nginx обрабатывать все запросы к основному домену и любому поддомену с этими правилами.

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

Редактировать

Да, субдомен можно записать в такую ​​переменную и использовать в proxy_pass пункт назначения.Вам нужно, чтобы все домены были в одном имя сервера линия:

server_name example.com ~^(?<субдомен>[^.]+)\.example\.com;
O'Niel avatar
флаг in
Большое спасибо за ваш ответ! Это приближается. Однако Catch-all для приложения также должен обрабатывать поддомены. Возможен ли какой-то подстановочный знак? Смотрите редактирование поста.
флаг us
Затем вам нужно сделать второй блок `server` для поддоменов с `server_name *.example.com`.
O'Niel avatar
флаг in
Спасибо за помощь! Многое объяснил. Если бы вы только могли еще раз взглянуть на мою вторую правку? Что касается подстановочного знака поддомена.
O'Niel avatar
флаг in
Я очень близок, приятель. Остается только подстановочный знак поддомена.
флаг us
Я добавил пример `server_name`.

Ответить или комментировать

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