Вопрос или проблема
У меня есть проблема, когда я пытаюсь развернуть два приложения в tomcat10, оба являются приложениями spring boot, я упаковываю их в файл war. Что я хочу достичь: два веб-приложения развернуты в одном tomcat, и nginx будет перенаправлять запросы к одному приложению в зависимости от его доменного имени, например: http://example.com будет указывать на: app1 (возможно: http://localhost:8080/app1), а http://bbs.example.com будет направлен на app2 (http://localhost:8080/app2). Итак, ниже моя конфигурация:
- Я поместил два war-файла в tomcat/webapps, тогда каждое приложение можно будет получить с помощью контекстного пути. (/app1 или /app2)
- Я настроил 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, так как доменные запросы не используют контекстный путь.
Предложенное Решение
-
Конфигурация Spring Boot: Используйте свойство
server.servlet.context-path
в файлахapplication.properties
илиapplication.yml
для указания контекстного пути для каждого приложения. Пример дляapp1
:# для app1 server.servlet.context-path=/app1
И для
app2
:# для app2 server.servlet.context-path=/app2
-
Использование Thymeleaf: При использовании Thymeleaf для генерации ссылок на статические ресурсы, убедитесь, что используете атрибут
th:href
.Пример:
<link rel="stylesheet" th:href="@{/static/css/style.css}" />
Этот подход поможет вам избежать жестко закодированных URL-адресов, и Thymeleaf автоматически добавит нужный контекстный путь в зависимости от того, как к приложению обращаются.
-
Настройка 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; } }
-
Проверка на предмет кэширования: Если вы используете доверенные кэширования, такие как Cloudflare или другие CDN, убедитесь, что кеширование не нарушает доступность ваших ресурсов. Включите заголовки, такие как
Cache-Control
илиExpires
, чтобы обеспечить правильный доступ к обновленным статическим ресурсам.
Рекомендации
- Логирование и Отладка: Убедитесь, что у вас настроены логи как в Tomcat, так и в Nginx для отслеживания любых проблем, которые могут возникнуть при доступе.
- Тестирование: Протестируйте каждое приложение отдельно как через Nginx, так и через Tomcat, чтобы убедиться, что все пути работают корректно и доступны с нужными ресурсами.
- SECURITY: Не забывайте об аспектах безопасности, таких как настройка HTTPS для вашего Nginx, чтобы защитить данные пользователей.
Заключение
С описанными выше изменениями и рекомендациями ваша проблема с доступом к статическим ресурсам должна быть решена. Настройте все элементы конфигурации, протестируйте приложение, и ваши Spring Boot приложения смогут без проблем функционировать на одном сервере Tomcat под управлением Nginx. Не забывайте следить за обновлениями и изменением конфигурации по мере роста ваших приложений.