ищите лучшее решение для развертывания двух веб-приложений в Tomcat 10

Вопрос или проблема

У меня есть проблема, когда я пытаюсь развернуть два приложения в tomcat10, оба являются приложениями spring boot, я упаковываю их в файл war. Что я хочу достичь: два веб-приложения развернуты в одном tomcat, и nginx будет перенаправлять запросы к одному приложению в зависимости от его доменного имени, например: http://example.com будет указывать на: app1 (возможно: http://localhost:8080/app1), а http://bbs.example.com будет направлен на app2 (http://localhost:8080/app2). Итак, ниже моя конфигурация:

  1. Я поместил два war-файла в tomcat/webapps, тогда каждое приложение можно будет получить с помощью контекстного пути. (/app1 или /app2)
  2. Я настроил nginx следующим образом:
 server {
    listen 80;
    server_name example.com;
    location / {
        proxy_pass http://localhost:8080/app1/;
        .....
    }
}

server {
    listen 80;
    server_name bbs.example.com;

    location / {
        proxy_pass http://localhost:8080/app2/;
        ...
    }
}

Теперь, если я посещаю каждый домен в веб-браузере, http://example.com или http://bbs.example.com, оба работают хорошо.

Но когда я обращаюсь к tomcat напрямую: http://localhost:8080/app1, статические ресурсы или ссылки на странице не имеют контекстного пути app1, поэтому css/js/изображения страницы не могут быть загружены. Я могу изменить страницы моего приложения, добавив контекст на страницу (для моего themeleaf, конечно, я могу использовать th:href=”@{/aa}”, чтобы добавить контекстный путь), но когда я добавил код на мои страницы, запрос на домен через Nginx будет иметь подобную проблему: страница будет иметь контекстный путь (app1), и к ним нельзя будет получить доступ через домен. Так что вы видите, я нахожусь в неловкой ситуации: если я добавляю контекстный путь на страницы, запрос на страницу через домен имеет проблему, если я не добавляю контекстный путь, то запрос на localhost tomcat имеет ту же проблему с загрузкой ресурсов.

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

Ответ или решение

Оптимальное Решение для Развертывания Двух Веб Приложений на Tomcat 10 с Использованием Nginx

Ваша проблема заключается в развертывании двух приложений Spring Boot, упакованных в WAR файлы, на одном сервере Tomcat 10 с использованием Nginx для управления входящими запросами, в зависимости от доменного имени. Давайте рассмотрим, как можно решить эту проблему, обеспечив правильное отображение статических ресурсов и URL-адресов.

Проблема

При прямом обращении к приложениям на Tomcat через http://localhost:8080/app1 или http://localhost:8080/app2 возникает проблема с доступом к статическим ресурсам CSS, JavaScript и изображениям, поскольку они не содержат контекстного пути. В то же время, когда вы добавляете контекстный путь в ваши страницы для локального доступа, это создает проблемы при доступе через Nginx, так как доменные запросы не используют контекстный путь.

Предложенное Решение

  1. Конфигурация Spring Boot: Используйте свойство server.servlet.context-path в файлах application.properties или application.yml для указания контекстного пути для каждого приложения. Пример для app1:

    # для app1
    server.servlet.context-path=/app1

    И для app2:

    # для app2
    server.servlet.context-path=/app2
  2. Использование Thymeleaf: При использовании Thymeleaf для генерации ссылок на статические ресурсы, убедитесь, что используете атрибут th:href.

    Пример:

    <link rel="stylesheet" th:href="@{/static/css/style.css}" />

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

  3. Настройка Nginx: Ваша конфигурация Nginx выглядит правильно, но рекомендуется добавление заголовков для управления кэшированием и установки корректного поведения HTTPS (если это необходимо). Пример:

    server {
       listen 80;
       server_name example.com;
       location / {
           proxy_pass http://localhost:8080/app1/;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
       }
    }
    
    server {
       listen 80;
       server_name bbs.example.com;
    
       location / {
           proxy_pass http://localhost:8080/app2/;
           proxy_set_header Host $host;
           proxy_set_header X-Real-IP $remote_addr;
           proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
           proxy_set_header X-Forwarded-Proto $scheme;
       }
    }
  4. Проверка на предмет кэширования: Если вы используете доверенные кэширования, такие как Cloudflare или другие CDN, убедитесь, что кеширование не нарушает доступность ваших ресурсов. Включите заголовки, такие как Cache-Control или Expires, чтобы обеспечить правильный доступ к обновленным статическим ресурсам.

Рекомендации

  • Логирование и Отладка: Убедитесь, что у вас настроены логи как в Tomcat, так и в Nginx для отслеживания любых проблем, которые могут возникнуть при доступе.
  • Тестирование: Протестируйте каждое приложение отдельно как через Nginx, так и через Tomcat, чтобы убедиться, что все пути работают корректно и доступны с нужными ресурсами.
  • SECURITY: Не забывайте об аспектах безопасности, таких как настройка HTTPS для вашего Nginx, чтобы защитить данные пользователей.

Заключение

С описанными выше изменениями и рекомендациями ваша проблема с доступом к статическим ресурсам должна быть решена. Настройте все элементы конфигурации, протестируйте приложение, и ваши Spring Boot приложения смогут без проблем функционировать на одном сервере Tomcat под управлением Nginx. Не забывайте следить за обновлениями и изменением конфигурации по мере роста ваших приложений.

Оцените материал
Добавить комментарий

Капча загружается...