Данная статья расскажет как на хосте организовать работу доменов 3-го уровня при помощи популярного веб-сервера Nginx. В качестве работающих приложений будем использовать java SpringBoot приложения для примера. Статья предназначена в первую очередь начинающим и не несёт какой-то сложный и высокопроизводительный функционал.
Итак, приступим
Пару слов о проблеме, которую будем решать. Очень часто в организации логики работы веб-ресурса необходимо использовать поддомены (или их ещё называют домены 3-го уровня). Например, ваш сайт site.com, то для него поддоменом будет admin.site.com или help.site.com и это, скорее всего сильно различимые по функционалу ресурсы, может быть даже разработанные на разных языках и платформах.
Также всегда удобно иметь тестовый экземпляр своего приложения по адресу test.site.com и перезапускать его или останавливать пока основной сайт работает.
Для такой реализации необходимо иметь несколько одновременно работающих приложений на сервере. И каждое из них должно взаимодействовать с портом для связи с внешним миром (80 или 443). Иными словами мы получим коллизию портов.
Чтобы решить данную проблему можно использовать прокси сервер Nginx. У каждого работающего приложения будет свой отличный внутренний порт, а прокси сервер будет настроен сопоставлять эти порты доменным адресам.
Дальше мы поэтапно выполним следующее:
1. У хостера создадим поддомены для каждого работающего приложения.
2. Создадим несколько Spring приложений для демонстрации.
3. Установим и настроим на веб-сервер Nginx и развернём там Spring приложения.
Прежде всего нужно получить поддомены для каждого приложения свой. Подразумевается, что у вас уже есть свой зарегистрированный домен. Мы рассмотрим на примере хостера 1GB.ru. У других будет что-то подобное, подробности подскажет техподдержка.
Переходим в личный кабинет и жмем на выделенный пункт на скриншоте ниже.
Затем будет таблица ваших записей. Нужно выбрать шестерёнку вашего доменного имени как на скриншоте ниже.
В следующей таблице мы и добавим поддоменные имена. На скриншоте внизу мы добавим test2.pufr.ru. Обратите внимание, что test.pufr.ru уже есть в списке. В графе "тип записи" нужно выбрать "А", а в параметрах IP адрес конечного сервера.
Сделаем то же и для псевдонима www.test2.pufr.ru. Обратите внимание, что поля "тип записи" и "параметры" отличаются от предыдущего снимка.
Изменения вступают в силу не сразу, может потребоваться больше часа. Чтобы проверить что всё прошло успешно, достаточно перейти по созданным поддоменным адресам и должна открыться главная страница вашего приложения, если конечно в этот момент на сервере работает веб-приложение.
На этом настройка доменных имён завершена. Личный кабинет и панель управления на различных хостингах может сильно отличатся, но суть того что нужно сделать думаю ясна.
Далее перейдём к конфигурации Spring приложений.
Есть замечательный ресурс для конфигурирования проектов на spring, вот и воспользуемся им. Ниже на скриншоте окно настроек вашего будущего проекта, настройте так же как на снимке.
После того как сгенерируете проект, нажав на кнопку GENERATE, вам будет предложено скачать архив. Соглашаемся и сохраняем себе в папку с проектами. Затем архив необходимо распаковать и открыть в IntelliJ IDEA. Студией будет создана иерархия папок и внедрены зависимости, которые мы указали в конфигураторе. Не буду подробно останавливаться на проекте, создании контроллеров и прочего, готовый проект можно взять с GitHub. В итоге должна быть вот такая структура папок:
Мы получили простое web приложение, с одной тестовой страничкой. Чтобы убедится в том, что всё работает - запустим его на выполнение. Если всё хорошо, то в терминале мы увидим вот такой вывод без сообщений об ошибках о Spring.
Ну и перейдя в браузере по адресу http://localhost:59999 мы увидим тестовую страничку как на скриншоте ниже
Теперь когда всё работает, возвращаемся в студию и переходим в консоль, там упаковываем проект в JAR архив.
В результате мы получим исполняемый архив в папке проекта.
Всё перечисленное выше необходимо проделать для второго приложения, изменив только лишь текст в передаваемой html страничке и номере порта в файле application.properties. Готовые архивы нужно скопировать на сервер и запустить на выполнение, но об этом позже. Если не хотите самостоятельно выполнять все действия можете просто скачайте себе готовый проект с GitHub.
Теперь когда у нас есть два рабочих приложение приступим к установке и настройке прокси-сервера Nginx
Nginx - это высокопроизводительный веб-сервер и реверс-прокси-сервер, который также может использоваться в качестве почтового прокси-сервера. Он был разработан Игорем Сысоевым и выпущен в 2004 году. Основные особенности Nginx:
1. Высокая производительность: Nginx способен обрабатывать большое количество одновременных соединений благодаря своей асинхронной архитектуре.
2. Реверс-прокси: Nginx часто используется как реверс-прокси для распределения нагрузки между несколькими серверами.
3. Кэширование: Поддерживает кэширование статического контента, что позволяет уменьшить время загрузки страниц.
4. SSL/TLS: Поддержка безопасных соединений с использованием HTTPS.
5. Модульность: Имеет гибкую архитектуру, позволяя добавлять различные модули для расширения функциональности.
Nginx широко используется для хостинга веб-сайтов, особенно тех, которые требуют высокой производительности и надежности.
Для установки Nginx на Linux сервер перейдем в командную строку.
Запускаем сервер командой старт
После установки нужно добавить nginx в автозагрузку
Проверяем что сервер работает и добавлен в автозагрузку
Если всё прошло хорошо, то в консольном выводе будет что-то похожее, как на скришоте ниже.
И если теперь перейти по адресу нашего сервера, мы попадём на страницу приветствия nginx.
Отлично, прокси-сервер работает с минимальными настройками. Перенастроим его работу под свои нужды.
Возвращаемся в консоль и переходим по адресу /etc/nginx/sites-enabled. Здесь создадим файлы конфигурации для каждого приложения отдельный.
Для доменного адреса test.pufr.ru создадим файл с вот таким текстом:
server {
listen 80;
listen [::]:80;
server_name test.pufr.ru;
location / {
proxy_pass http://localhost:58888;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-For $proxy_a
А для адреса test2.pufr.ru вот с таким:
server {
listen 80;
listen [::]:80;
server_name test2.pufr.ru;
location / {
proxy_pass http://localhost:59999;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Port $server_port;
Теперь сделаем созданные нами ранее приложения выполняемыми и добавим их в автозагрузку. Для начала скопируем JAR архивы на сервер в домашнюю папку.
Перейдём в папку, где хранятся конфигурационные файлы служб
Здесь нам нужно создать два файла настроек, для автоматического запуска наших spring приложений. Назовём их test1App.service и test2App.service. Открываем редактор через консоль.
Ну и пишем в него следующий текст:
[Unit]
Description=This is the #1 test app for explaining how nginx works.
After=network.target
[Service]
Type=simple
SyslogIdentifier=appdescription
WorkingDirectory=/home/dir/app/
PIDFile=/home/dir/app/SpringTestApp1.pid
ExecStart=/bin/sh -c "exec /usr/bin/java -jar SpringTestApp1.jar & echo $! > /home/serj/proj/SpringTestApp1.pid"
ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID
[Service]
Type=forking
PIDFile=/home/dir/app/SpringTestApp1.pid
[Install]
WantedBy=default.target
В этом файле нужно будет заменить на ваши пути к файлам. Для примера тут архив лежит по пути /home/dir/app/SpringTestApp1.jar. То же самое проделаем для второго файла настроек.
Ну и скрипт соответственно:
[Unit]
Description=This is the #2 test app for explaining how nginx works.
After=network.target
[Service]
Type=simple
SyslogIdentifier=appdescription
WorkingDirectory=/home/dir/app/
PIDFile=/home/dir/app/SpringTestApp2.pid
ExecStart=/bin/sh -c "exec /usr/bin/java -jar SpringTestApp2.jar & echo $! > /home/serj/proj/SpringTestApp2.pid"
ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID
[Service]
Type=forking
PIDFile=/home/dir/app/SpringTestApp2.pid
[Install]
WantedBy=default.target
Перейдём в каталог, куда мы поместили архивы и указали этот путь в конфигурационных файлах.
Для того чтобы созданные файлы вступили в силу нужно перечитать их.
Затем добавим приложение в автозагрузку.
И запустим на выполнение.
Первое приложение готово. Если перейти по адресу test.pufr.ru, то откроется страница первого приложения.
По аналогии делаем все вышеперечисленные шаги для приложения 2. Ну и теперь если перейти по адресу test2.pufr.ru, то откроется страница второго приложения.
На этом можно закончить настройку прокси сервере.