스프링 부트 시 Tomcat을 사용한HTTP2의 이니블화
Spring Boot 1.4에서 기본 설정되는 Tomcat 8.5는 HTTP/2를 지원합니다.
Spring Boot 응용 프로그램에서 HTTP/2를 활성화하려면 어떻게 해야 합니까?
Spring Boot 2.1 이후에서는 이 속성을 .properties(또는 .yml) 파일에 추가하는 것만으로 간단합니다.
server.http2.enabled=true
다음과 같이 프로그래밍 방식으로 실행할 수도 있습니다(설정 클래스 중 하나).
@Bean
public ConfigurableServletWebServerFactory tomcatCustomizer() {
TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
factory.addConnectorCustomizers(connector -> connector.addUpgradeProtocol(new Http2Protocol()));
return factory;
}
Tomcat 커넥터에 HTTP 2 업그레이드 프로토콜을 추가해야 합니다.내장된 Tomcat 컨테이너를 커스터마이즈하면 됩니다.
Java 8:
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return (container) -> {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addConnectorCustomizers((connector) -> {
connector.addUpgradeProtocol(new Http2Protocol());
});
}
};
}
Java 7:
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
connector.addUpgradeProtocol(new Http2Protocol());
}
});
}
}
};
}
가장 우아하고 퍼포먼스가 뛰어난 방법으로HTTP/2
Spring Boot 어플리케이션이 있는 경우는, 다음과 같습니다.
먼저 Andy Wilkinson의 답변에서 언급한 것처럼 Tomcat 수준에서 HTTP/2를 활성화해야 합니다.
@Bean
public EmbeddedServletContainerCustomizer tomcatCustomizer() {
return (container) -> {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
((TomcatEmbeddedServletContainerFactory) container)
.addConnectorCustomizers((connector) -> {
connector.addUpgradeProtocol(new Http2Protocol());
});
}
};
}
임베디드 Tomcat 를 사용하지 않는 경우는, 다음과 같이 HTTP/2 수신을 설정할 수 있습니다.
<Connector port="5080" protocol="HTTP/1.1" connectionTimeout="20000">
<UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>
Tomcat > = 8.5가 필요합니다.
그럼, 당신은 그것을 사용해야 합니다.HAProxy
(버전 > = 1.7)를 Tomcat 앞에 배치하여 암호화를 관리합니다.
클라이언트는 HAProxy와 https를 통신하고 HAProxy는 클라이언트의 요구에 따라 클리어텍스트 HTTP/1.1 또는 HTTP/2를 백엔드에 통신합니다.불필요한 프로토콜 변환은 없습니다.
일치하는 HAProxy 설정은 다음과 같습니다.
# Create PEM: cat cert.crt cert.key ca.crt > /etc/ssl/certs/cert.pem
global
tune.ssl.default-dh-param 2048
ssl-default-bind-options no-sslv3 no-tls-tickets force-tlsv12
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
chroot /var/lib/haproxy
user haproxy
group haproxy
defaults
timeout connect 10000ms
timeout client 60000ms
timeout server 60000ms
frontend fe_https
mode tcp
rspadd Strict-Transport-Security:\ max-age=31536000;\ includeSubDomains;\ preload
rspadd X-Frame-Options:\ DENY
bind *:443 ssl crt /etc/ssl/certs/cert.pem alpn h2,http/1.1
default_backend be_http
backend be_http
mode tcp
server domain 127.0.0.1:8080
# compression algo gzip # does not work in mode "tcp"
# compression type text/html text/css text/javascript application/json
2019년 편집
모드 "tcp"를 사용할 때 두 가지 문제가 발생합니다.
- 압축은 http 모드에 따라 다르기 때문에 동작하지 않습니다.따라서 백엔드로 처리되어야 합니다.
- 백엔드에서 클라이언트의 IP 주소를 확인할 수 없습니다.아마 NAT이 필요할 거예요.아직 조사 중...
일반적으로 haproxy는 하위 레벨의 tcp 접속을 프록시하기 때문에 http 접속에는 접근할 수 없습니다.
Spring Boot 2에서는 먼저 증명서가 필요합니다.증명서는 다음과 같이 생성됩니다.
keytool -genkey -keyalg RSA -alias my-the-best-api -keystore c:\tmp\keystore.store -storepass secret -validity 3650 -keysize 2048
이 증명서를 classpath에 추가하고 application.properties에 필요한 속성을 추가하면 됩니다.
server.http2.enabled=true
server.port = 8443
server.ssl.key-store=classpath:keystore.jks
server.ssl.key-store-password=secret
Spring Boot 2.2.0+는 기본적으로는 JDK 9 이후를 사용할 때 즉시 HTTP/2를 지원하는 Tomcat 9.0.x와 함께 제공됩니다.링크
언급URL : https://stackoverflow.com/questions/38612704/enable-http2-with-tomcat-in-spring-boot
'programing' 카테고리의 다른 글
AngularJS - 선택 태그에 ng-repeat을 사용하여 추가 공백 옵션 추가 (0) | 2023.03.23 |
---|---|
각도 연장기 재스민 테스트에서의 console.log 출력 표시 (0) | 2023.03.23 |
wcf에서 raw json(문자열)을 반환하는 중 (0) | 2023.03.23 |
Angular 앱을 배포하려면 어떻게 해야 합니까? (0) | 2023.03.23 |
$watch vs ng-change, ng-checked 등에 의한 각도 트리거 변경 (0) | 2023.03.23 |