Статические файлы Spring boot загружаются медленно

#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);
}