Форум программистов, компьютерный форум, киберфорум
Java: Spring, Spring Boot
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246

Spring MVC: что происходит со статикой?

10.09.2020, 15:49. Показов 2443. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я только начал изучать Spring.

Скажите, пожалуйста, применяется ли в мире Spring веб-сервер nginx?

Если да, то для каких задач (балансировка нагрузки, раздача статики)?

Если nginx применяется для раздачи статики, как ему "подсунуть" эту статику? Обычно она у него лежит где-то в каталоге типа /var/www/my_site/static. И перекладывать ее туда я привык специальным скриптом из коробки фреймворка. Но фреймворк это должен уметь делать. Т.е. он должен потом суметь эту статику найти, потому что ему же рендерить html надо. Спринг такое умеет?

Если nginx не применяется для раздачи статики, то как ее раздают?
Томкатом? Что работает быстрее при раздаче статики: Tomcat или nginx?

А если я хочу часть функционала использовать повторно, видимо, мне reusable функциональность надо будет скомпилировать в jar и использовать его в своих проектах как библиотеку. Это что же - Томкат будет будет jar-файлы молотить?

А если я захочу использовать CDN, надо же будет все-таки статику скопировать туда. Значит, Спринг должен как-то узнать, где у него статика будет на проде лежать. Как это сделать?

В общем, вопросов очень много. Почитать бы про это. Но упор мне надо не просто на раздачу статики, а на максимальную скорость загрузки страницы. И что-то у меня сомнения, что кто-то в этом мире раздает статику быстрее, чем nginx.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2020, 15:49
Ответы с готовыми решениями:

Spring MVC. 404 ошибка при включении Spring Data JPA в проект
Добрый день. Есть простой шаблонный проект с использованием Spring MVC и Maven. С зависимостями Spring MVC проект собирается нормально и...

Spring MVC controller. Что возвращать - forward,redirect, или имя jsp?
Непонимаю что использовать и когда. Есть две страницы - intro.jsp(1) и booksList.jsp(2). Для каждой страницы создано по одному...

задания по spring core и spring mvc для новичков
Какие задания можно предложить новичкам для выполнения после знакомства их с spring core и mvc ?

16
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
10.09.2020, 21:38
Если нужна скорость, то лучшее решение это CDN типа клаудфронта или акамай. Из этого следует что раздавать статику у тебя может кто угодно и это не повлияет на скорость.
В целом спринг это про бекенд. Он вообще не должен знать ни про какие клиентские штуки, хотя технически может раздавать что угодно.
1
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
11.09.2020, 08:46  [ТС]
Меня интересует сейчас только MVC. Чтобы сайт заработал, нужно его обеспечить статикой тоже.

Я разговариваю с опытными ребятами, но они мне толком ничего не говорят. И ответ может быть таким: я изначально статику делу отлельно, а собираю ее с помощью вебпак.

Ну, не знаю. Сомнительно что-то. Просто получается, что структура проекта вряд ли интуитивно понятна.

Хорошо, допустим CDN. Но Spring должен узнать, где положена статика. Как это можно сделать, чтобы не хардкодить?

Добавлено через 10 минут
Во-первых, не хардкодить.
Во-вторых, собрать всю статику, которая лежит в проекте.
Согласно тьюториалу, статика лежит во множестве каталогов /static (https://spring.io/guides/gs/se... _home_page)

Это неплохо само по себе. Но ее надо как-то сначала на локалке использовать, а потом выкатить на прод. Т.е. должен быть какой-то механизм копирования статики.

Причем, такой, чтобы фреймворк о нем знал бы. Т.е. он должен знать, где статику на проде ловить.

Мне бы вот как-то это понять. Потому что в тьюториалах это не написано.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
11.09.2020, 09:27
Цитата Сообщение от Kifsif Посмотреть сообщение
я изначально статику делу отлельно, а собираю ее с помощью вебпак.
При чём тут веб-пак — непонятно.

Цитата Сообщение от Kifsif Посмотреть сообщение
Но Spring должен узнать, где положена статика. Как это можно сделать, чтобы не хардкодить?
Что именно у тебя в статике? JS? Ну да, хардкодить, например "/static/script/main.js", а Nginx'ом, например, "my_site/static/*" редиректить или просксировать на CDN. Или самим Nginx'ом и раздавать.

Цитата Сообщение от Kifsif Посмотреть сообщение
И перекладывать ее туда я привык специальным скриптом из коробки фреймворка. Но фреймворк это должен уметь делать.
Каким ещё скриптом фремворка? Это делается деплой-скриптами.
Миниатюры
Spring MVC: что происходит со статикой?  
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
11.09.2020, 09:30
Цитата Сообщение от Kifsif Посмотреть сообщение
Согласно тьюториалу, статика лежит во множестве каталогов /static
Это тьюториал для новичков. В реальном проекте статика лежит отдельно и Spring о ней не знает.
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.09.2020, 10:03
Есть несколько вариантов
1. У тебя рестфул бекенд и он ничего не знает о фронте. Фронт лежит в отдельном репозитории, у него свой лайфсайкл и свой деплой. Отдачей фронта занимается nginx.
2. У тебя монорепозиторий и фронт это модуль в твоем maven проекте. У фронта есть pom.xml (например с плагином frontend-maven-plugin), который запускает сборку как часть maven цикла. Путь до корня фронта указывается в pom.xml Результатом сборки является jar файл, который как зависимость добавляется в бек. В результате получается jar файл (рассматриваем версию спринг бута), в котором статику отдает embedded tomcat.
3. Статика лежит в папке /src/main/resources/static (дефолт для спринг бута) или в любой другой папке и тогда делается доп. конфигурация чтобы замапить это папку. Таким образом статику так же отдает встроенный томкат.
-------------
Как я уже написал выше, разница в скорости нивелируется тем, что все это дело сидит за CDN, который все равно поднимает caching proxy в локации юзера.
2
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
11.09.2020, 10:19  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Что именно у тебя в статике? JS? Ну да, хардкодить, например "/static/script/main.js", а Nginx'ом, например, "my_site/static/*" редиректить или просксировать на CDN.
В статике картинки для интерфейса сайта и JS.

Ну, я вообще ничего не понимаю.

Редирект или проксирование выльется в катастрофическое замедление. Это просто медленнее на прогон туда и обратно. Картинку прилагаю. Ну, ладно - пусть не на 1,1 секунду замедлится - уберем там DNS, чего-то еще. Но добрых полсекунды я потеряю.

Иначе говоря я-то предлагаю сразу раздать с CDN.

А вы мне предлдагаете такое: летит запрос на наш сервер. Но наш сервер говорит - так, ты зря сюда пришел. Иди вон там на CDN. Там возьмешь (редирект).
Или: а, ты за статикой, сейчас я сам схожу, ты тут подожди. Вот, принес. Забирай (проксирование).

Да и какой вот смысл-то CDN тогда? CDN на то и применяется, чтобы максимально близко к юзеру быть. Чтобы прогоны сократить. CDN раздает статику с ближайшего к юзеру сервера. А так мы все через себя прогоняем.

Цитата Сообщение от korvin_ Посмотреть сообщение
Или самим Nginx'ом и раздавать.
Это было бы неплохо. Да вот беда, я не знаю, как nginx-у подсунуть эту статику.

Цитата Сообщение от korvin_ Посмотреть сообщение
Каким ещё скриптом фремворка? Это делается деплой-скриптами.
А как фреймворк узнает, какой путь рендерить? Чтобы не было вот этих вот кругов с редиректом и проксированием, надо сразу рендерить.

Пример из Django:

Статика лежит во множественных каталогах static, по всему проекту.
И фреймворк знает, где ее взять, потому что ему сказали в настрйоках: STATIC_URL = '/static/'
Мы на локалке ведем разработку, и фреймворк об этом знает. Потому что DEBUG=True. Отладочный веб-сервер джанги берет статику оттуда, где она лежит в проекте.
В шаблоне <img src="{% static "my_app/example.jpg" %}" alt="My image">.
В настройках задается также: STATIC_ROOT = "/var/www/example.com/static/" . Это где статика будет лежать на боевом серваке.
Когда проект разворачевается на продуктивном сервере, выполняется команда python manage.py collectstatic
И по всему проекту статика собирается, и перекладывается в нужный каталог.
А в случае CDN настройки будут такие: STATICFILES_STORAGE = 'myproject.storage.S3Storage' . И все: теперь collectstatic зальет статику на Amazon’s S3.

И логично же все: и не захардкожено, и фреймворк знает, какой путь до статики рендерить.

А со Спрингом - ну, я вообще не знаю. Может, как-то и можно. Но об этом как-то никто особо не знает. Я же с ребятами разговариваю. Они говорят примерно: Интересные вопросы задаёшь. Порой даже самому приходится задуматься - "а почему я делал иначе".

В общем, никто ничего не может нормально сказать. А тьюториалы - сплошь все захардкожено. Ну, ребята и хардкодят, я думаю. Иначе чего им задумываться.
Миниатюры
Spring MVC: что происходит со статикой?  
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
11.09.2020, 10:32  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
В результате получается jar файл (рассматриваем версию спринг бута), в котором статику отдает embedded tomcat.
JAR - это же архив. Это что томкат будет архивы лопатить постоянно? Я сейчас открыл первую попавшуюся страницу. Один html-документ, это понятно. А запросов 367. Ну, ладно, там отбросим всякие внешние гугл аналитики и прочее. Ну, пусть 100 запросов за нашей статикой. И это одна страница. Я все правильно понимаю? Т.е. веб-сервер каждый раз откроет архив, возьмет файл, закроет архив. Отдаст. Это вообще так и делается? И как это по производительности, если с nginx сравнить?

Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Статика лежит в папке /src/main/resources/static (дефолт для спринг бута) или в любой другой папке и тогда делается доп. конфигурация чтобы замапить это папку. Таким образом статику так же отдает встроенный томкат.
Это возможно. Но вот беда - бывает же reusable функционал. Его надо будет как-то к проекту подключать. И будет он, видимо, в виде jar-файла. Допустим, я напишу функционал для лайкв-дислкйков. У него есть какой-то JavaScript, потом возможность сохранить в базу данных все. Может быть, какие-то картинки. И вот я хочу это все хозяйство применять на десяти сайтах. Соответственно, это все должно удобно подключаться. Видимо, все-таки это будет jar-файл. Это что же опять архивы томкатом ворочать?

Вообще говоря, как томкат по производительности по сравнению с энджиникс при прочих равных?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.09.2020, 10:35
Цитата Сообщение от Kifsif Посмотреть сообщение
А вы мне предлдагаете такое: летит запрос на наш сервер.
думаю тебе стоит почитать как работает CDN. Запрос никогда напрямую не попадает на оконечный сервер. DNS сайта настраивается на CDN
1
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
11.09.2020, 10:38  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
думаю тебе стоит почитать как работает CDN. Запрос никогда напрямую не попадает на оконечный сервер. DNS сайта настраивается на CDN
Стоп, стоп. Выше было ведь написано, что запрос прилетит на наш сервер. Оттуда редирект или проксирование на CDN. Если я правлильно понял. Я акцентирую внимание только на том, что первый запрос за статикой прилетит на наш сервер, оттуда будет редирект или проксирование. И я предполагаю, что в этом случае будет очень медленно, и вообще если все через себя гнать, нет смысла в CDN.
0
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
11.09.2020, 10:38  [ТС]
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
думаю тебе стоит почитать как работает CDN. Запрос никогда напрямую не попадает на оконечный сервер. DNS сайта настраивается на CDN
Стоп, стоп. Выше было ведь написано, что запрос прилетит на наш сервер. Оттуда редирект или проксирование на CDN. Если я правлильно понял. Я акцентирую внимание только на том, что первый запрос за статикой прилетит на наш сервер, оттуда будет редирект или проксирование. И я предполагаю, что в этом случае будет очень медленно, и вообще если все через себя гнать, нет смысла в CDN.
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.09.2020, 10:41
Цитата Сообщение от Kifsif Посмотреть сообщение
JAR - это же архив. Это что томкат будет архивы лопатить постоянно?
нет. На томкате в конечном итоге лежит распакованный архив.

Цитата Сообщение от Kifsif Посмотреть сообщение
Видимо, все-таки это будет jar-файл. Это что же опять архивы томкатом ворочать?
похоже у тебя сильно не хватает понимания как работает spring boot в связке с встроенным томкатом и вообще как строятся приложения.
Все что ты написал имеет мало смысла. Если тебе это нужно как реальная задача, то лучше сделай её вместе с более опытным коллегой, если это задача для обучения, то лучше начать с более базовых концепций.

Добавлено через 7 секунд
Цитата Сообщение от Kifsif Посмотреть сообщение
JAR - это же архив. Это что томкат будет архивы лопатить постоянно?
нет. На томкате в конечном итоге лежит распакованный архив.

Цитата Сообщение от Kifsif Посмотреть сообщение
Видимо, все-таки это будет jar-файл. Это что же опять архивы томкатом ворочать?
похоже у тебя сильно не хватает понимания как работает spring boot в связке с встроенным томкатом и вообще как строятся приложения.
Все что ты написал имеет мало смысла. Если тебе это нужно как реальная задача, то лучше сделай её вместе с более опытным коллегой, если это задача для обучения, то лучше начать с более базовых концепций.

Добавлено через 1 минуту
Цитата Сообщение от Kifsif Посмотреть сообщение
Я акцентирую внимание только на том, что первый запрос за статикой прилетит на наш сервер, оттуда будет редирект или проксирование.
нет. Это не так работает
1
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
11.09.2020, 10:56  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
например, "my_site/static/*" редиректить или просксировать на CDN.
Я вот про эту фразу говорил. Тут было предложено редиректить. Или я неверно понимаю именно эту фразу?

Добавлено через 11 минут
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Все что ты написал имеет мало смысла.
Вы бы лучше мне сказали, как именно правильно делать. А то постоянно: вот ты не понимаешь, смысла мало, все не так. Ну, конечно, не понимаю. Потому и спрашиваю.

Где взять хороший пример работы со статикой: и чтобы она максимально быстро раздавалась, и чтобы не захардкожено было ни на каком этапе (ни в шаблонизаторе, ни в каких-либо настройках).
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
11.09.2020, 11:01
Цитата Сообщение от Kifsif Посмотреть сообщение
Вы бы лучше мне сказали, как именно правильно делать.
чтобы сказать как правильно делать надо понимать более базовые вещи. Я выше уже сказал как раздавать статику и это вызвало только новые вопросы. Объяснять более базовые вещи займет дофига времени и нет гарантии, что эти вещи тоже будут понятны поэтому я и написал, что если это реальная задача, лучше сделать её под контролем более опытных коллег.
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
11.09.2020, 11:49
Цитата Сообщение от Kifsif Посмотреть сообщение
Редирект или проксирование выльется в катастрофическое замедление.
Нет. Кроме того, статика прекрасно кэшируется браузером.

Цитата Сообщение от Kifsif Посмотреть сообщение
Но добрых полсекунды я потеряю.
Значит, ты что-то делаешь не так.

Цитата Сообщение от Kifsif Посмотреть сообщение
Да вот беда, я не знаю, как nginx-у подсунуть эту статику.
В build-скрипте docker-образа nginx'а.

Цитата Сообщение от Kifsif Посмотреть сообщение
А как фреймворк узнает, какой путь рендерить?
Цитата Сообщение от Kifsif Посмотреть сообщение
Пример из Django:
Статика лежит во множественных каталогах static, по всему проекту.
И фреймворк знает, где ее взять, потому что ему сказали в настрйоках: STATIC_URL = '/static/'
Сам себе ответил.

Цитата Сообщение от Kifsif Посмотреть сообщение
Мы на локалке ведем разработку, и фреймворк об этом знает. Потому что DEBUG=True. Отладочный веб-сервер джанги берет статику оттуда, где она лежит в проекте.
Вот прекращай так делать и подними себе nginx локально. Хоть нативно, хоть через docker.

Цитата Сообщение от Kifsif Посмотреть сообщение
Когда проект разворачивается на продуктивном сервере, выполняется команда python manage.py collectstatic
Нормальные люди давно так не делают.

Цитата Сообщение от Kifsif Посмотреть сообщение
В общем, никто ничего не может нормально сказать.
Тебе нормально сказали и картинку показали. Кто ж виноват, что ты не понимаешь объяснения?
1
145 / 113 / 31
Регистрация: 12.06.2011
Сообщений: 1,246
11.09.2020, 11:59  [ТС]
Цитата Сообщение от korvin_ Посмотреть сообщение
Нет. Кроме того, статика прекрасно кэшируется браузером.
Кешируй в браузере - или не кешируй, это дело не изменит. И никак ничему не поможет. Причина: юзеры всегда новые. Из поиска или из рекламы пойдут, практически в 100 % случаев. Так что как ни крути, редирект выльется в потерю скорости - это к гадалке не ходить.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
11.09.2020, 13:15
Цитата Сообщение от Kifsif Посмотреть сообщение
Кешируй в браузере - или не кешируй, это дело не изменит. И никак ничему не поможет. Причина: юзеры всегда новые. Из поиска или из рекламы пойдут, практически в 100 % случаев. Так что как ни крути, редирект выльется в потерю скорости - это к гадалке не ходить.
И правда, лучше сервить на миллионы пользователей одним сервачком без балансировки нагрузки.

Не хочешь редиректить/проксировать, я тебе уже писал: отдавай статику nginx'ом. В чём проблема?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2020, 13:15
Помогаю со студенческими работами здесь

Перевод проекта из Spring Maven в обычный Spring MVC
Здравствуйте. Подскажите, реально ли взять готовый проект, например -...

Jetty embedded + Spring MVC + Spring Security
Добрый день. По роду работы приходилось писать на JavaSE, в том числе и сложные клиент/серверные программы. Использовал Netty, Apache...

MVC. Что если ввод данных происходит не только в View?
Рассмотрим достаточно конкретный пример : Игра, расчитанная на двух игроков. Скажем, игроки могут быть разные, например : человек,...

Что выбрать из java-фреймворков для вывода коллекции: Spring MVC, Struts, Mojarra(JSF)?
Доброго дня, уважаемые Java-гуру. Подскажите, пожалуйста, какой фреймворк лучше выбрать для быстрой реализации простого учебного примера....

Spring MVC, Spring REST
Всем привет! Изучаю фреймворк Spring и возникло несколько вопросов в процессе, на которые не уверен однозначно, что до конца понимаю....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru