#java #spring #spring-boot
#java #spring #spring-boot
Вопрос:
У меня есть приложение spring boot. Когда я развертываю это на удаленном сервере и запускаю его с помощью встроенного tomcat, мои статические файлы загружаются мучительно медленно. Например, загрузка js-файла из 50 строк занимает около 7 секунд. Это довольно стандартное приложение Spring MVC. Мой основной файл выглядит следующим образом
package com.mineiq;
import javax.servlet.MultipartConfigElement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.context.embedded.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class Application {
@Bean
MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("128MB");
factory.setMaxRequestSize("128MB");
return factory.createMultipartConfig();
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
И, например, моя домашняя страница просто обслуживает статическую html-страницу, поэтому на стороне сервера почти нет нагрузки. Я пытался отключить spring-security, но это не помогло.
Это происходит только тогда, когда я запускаю приложение на своем удаленном сервере. Локально все происходит быстро.
Я настроил nginx отдельно для обслуживания статических файлов на другом порту, и он обслуживает их очень быстро, так что проблема не в самом сервере. Это был просто тест (не решение), поскольку я действительно не хочу запускать отдельный сервер для статических файлов.
Спасибо за любую помощь.
Комментарии:
1. Что вы подразумеваете под «удаленным сервером»? Для меня (и других) это работает довольно хорошо.
2. Смогли ли вы найти решение для этого?
Ответ №1:
Несколько советов, которые вы можете проверить:
Сначала попробуйте указать ресурс непосредственно в URL.
Убедитесь, что вы не включили обработчик сервлетов по умолчанию в своем приложении ( http://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/mvc.html#mvc-default-servlet-handler ) так что статические ресурсы не обслуживаются сервлетом контейнера по умолчанию.
По умолчанию Spring Boot будет обслуживать статическое содержимое из папки с именем /static (или /public, или /resources, или /META-INF/resources) в classpath или из корня ServeltContext. Он использует ResourceHttpRequestHandler, который оптимизирует доставку статического содержимого с помощью предоставленных настроек кэша.
Если вы хотите добавить другие расположения для статического содержимого, отличные от указанных по умолчанию, вы можете сделать это, добавив свой собственный WebMvcConfigurerAdapter и переопределив метод addResourceHandlers, как показано ниже:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.examples.mvc.base.controller" })
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
}
}
Подробная информация:
Комментарии:
1. Спасибо за ваш ответ. Даже явное добавление в реестр, похоже, не помогло. Еще пара курьезов: (1) статический контент не кэшируется браузером (т. Е. при последующих посещениях я получаю 200 вместо 304) и (2) Если я посещаю статический контент (например, js-файл) непосредственно в браузере, он загружается очень быстро (т. Е. за 20 мс)
2. 1) Заголовки кэша отсутствуют, потому что вы не установили docs.spring.io/spring/docs/4.0.x/javadoc-api/org /… метод (2) Что вы подразумеваете под 7 секундами для загрузки js-файла из 50 строк, как вы его тестируете?
Ответ №2:
Вы должны разрешить браузеру кэшировать статические ресурсы, установив период кэширования с помощью setCachePeriod()
, посмотрите на этот пример:
@Configuration
@EnableWebMvc
@EnableScheduling
@ComponentScan(basePackages = "your.site")
public class ConfigWebMvc extends WebMvcConfigurerAdapter implements WebApplicationInitializer {
@Override
public void addResourceHandlers(final ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/").setCachePeriod(31556926);
}