分享

SpringBoot嵌入式容器的运行参数配置及HTTPS

 码农9527 2021-08-23

在SpringBoot项目中webServer默认支持的嵌入式容器是Tomcat,还可以切换到Jetty、Undertow。可以通过修改配置文件中的配置(简单)或者自定义配置类(专业化调优)方式来调整Tomcat运行参数。  

修改配置文件中的配置(简单)  

常用的参数  

server.port
内嵌容器启动端口号,默认为8080
server.servlet.context-path配置项目的访问路径
server.tomcat.uri-encoding
用于解码URI的字符编码
server.error.path
配置当前项目出错时跳转去的页面
server.servlet.session.timeout
配置session失效时间,默认30分钟
server.tomcat.basedir配置Tomcat运行日志和临时文件的目录。若不配置则默认使用系统的临时目录。

我们可以参考一下官方文档:  

https://docs./spring-boot/docs/current/reference/html/application-properties.html#application-properties.server  

其中编号11就是我们需要的ServerProperties。  

tomcat性能优化及常用核心参数  

请求到达tomcat时首先经过连接器,在请求被接收之前会维护一个接收队列,这个队列的最大长度就是server.tomcat.max-connections,默认接受的最大请求连接数为8192,监听连接请求并生成一个Socket任务提交到线程池去处理。  

这时Executor中的线程全都被占用,server.tomcat.accept-count可以设置等待队列的大小,默认值为100。  

server.tomcat.threads.max为最大的工作线程池数量,不是越大越好,默认值为200。  

server.tomcat.threads.min-spare是在应用空闲的时候保留最小的工作线程池数量,避免临时创建线程浪费时间,默认值为10。  

配置文件的编写我们已经做过很多了,.yml文件的格式大致如下:  

server:
  port: 8080
  tomcat:
 uri-encoding: UTF-81234复制代码类型:[java]

自定义配置类(专业化调优)  

在config文件夹下创建TomcatCustomizerConfig.java文件:  

package com.javafamily.familydemo.config;import org.apache.catalina.connector.Connector;import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class TomcatCustomizerConfig { @Bean
 // 添加定制器
 public ConfigurableServletWebServerFactory configurableServletWebServerFactory() {
  TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
  factory.addConnectorCustomizers(new MyTomcatConnectionCustomizer());  return factory;
 } static class MyTomcatConnectionCustomizer implements TomcatConnectorCustomizer {  public MyTomcatConnectionCustomizer() {
  }  @Override
  public void customize(Connector connector) {
   connector.setPort(Integer.parseInt("8080"));
   connector.setProperty("maxConnections", "8192");
  }
 }
}1234567891011121314151617181920212223242526272829303132复制代码类型:[java]

以上这段代码核心的配置工厂是ConfigurableServletWebServerFactory,默认使用TomcatServletWebServerFactory来创建TomcatWebServer的抽象web服务的抽象工厂类。  

MyTomcatConnectionCustomizer是我们编写的针对连接器配置自定义的实现类,并将其实例化。  

可定制的内容更多,使用更灵活。  

配置HTTPS  

HTTPS是HTTP协议的安全版本,HTTPS在HTTP的基础下加入SSL,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。  

生成自签名证书  

以mac系统为例,输入命令行:  

keytool -genkeypair -alias selfsigned_localhost_sslserver -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore JavaFamily.p12 -validity 36501复制代码类型:[java]
-genkeypair创建一个新的密钥
-aliaskeystore的别名
-keyalg表示使用的加密算法是RSA
-keysize密钥长度
-keystore密钥存放位置
-validity密钥有效时长

创建好JavaFamily.p12后,将其拖进src/main/resources/config下。  

配置application.yml文件:  

server:
  port: 8888
  ssl:
 key-store: classpath:config/JavaFamily.p12
 key-store-password: 123456
 key-store-type: PKCS12123456复制代码类型:[java]

配置完成后启动程序。  

访问http://localhost:8888/hello:  

再访问https://localhost:8888/hello:  

首次访问会被警告不安全,在当前页面用键盘输入thisisunsafe,不是在地址栏输入,就直接敲键盘就行了,页面即会自动刷新进入网页。  

HTTP请求重定向为HTTPS  

当我们进行了一系列的配置之后,HTTPS可以进行正常访问,但是HTTP却出现了报错。这样对于访问HTTP的用户是很不友好的,所以我们要将HTTP请求重定向到HTTPS。这就需要用编码的方式来配置Tomcat。  

首先在application.yml中添加一个端口:  

server:
  port: 8888
  httpPort: 80
  ssl:
 key-store: classpath:config/JavaFamily.p12
 key-store-password: 123456
 key-store-type: PKCS121234567复制代码类型:[java]

再改写之前创建的TomcatCustomizerConfig.java文件:  

package com.javafamily.familydemo.config;import org.apache.catalina.Context;import org.apache.catalina.connector.Connector;import org.apache.tomcat.util.descriptor.web.SecurityCollection;import org.apache.tomcat.util.descriptor.web.SecurityConstraint;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class TomcatCustomizerConfig { @Value("${server.httpPort}")
 int httpPort; @Value("${server.port}")
 int httpsPort; @Bean
 public ConfigurableServletWebServerFactory configurableServletWebServerFactory() {
  TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory() {   @Override
   protected void postProcessContext(Context context) {
 SecurityConstraint constraint = new SecurityConstraint();
 constraint.setUserConstraint("CONFIDENTIAL");

 SecurityCollection collection = new SecurityCollection();
 collection.addPattern("/*");
 constraint.addCollection(collection);
 context.addConstraint(constraint);
   }
  };
  factory.addAdditionalTomcatConnectors(connector());  return factory;
 } public Connector connector() {
  Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
  connector.setScheme("http");  // 监听http端口号
  connector.setPort(httpPort);  // 不安全
  connector.setSecure(false);  // 监听到http的端口号后转向到的https的端口号
  connector.setRedirectPort(httpsPort);  return connector;
 }

}12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152复制代码类型:[java]

用HTTP协议的80端口访问会自动跳转到HTTPS协议的8888端口。这时当我们访问http://localhost:80/hello时会自动跳转到https://localhost:8888/hello。  

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多