spring-boot - IllegalArgumentException : Invalid character found in the HTTP protocol

标签 spring-boot ssl amazon-ec2 https amazon-cloudfront

我在 Amazon EC2 实例中开发并部署了 Spring Boot REST 应用程序。然后,我创建了一个 CloudFront 分配,其行为为“将 HTTP 重定向到 HTTPS”,源配置为“仅 HTTP”,以便能够通过 HTTPS 访问 Rest API。
通常,当应用程序通过 EC2 的自身域通过 http 访问时,一切正常。但是当我开始通过 https CloudFront 链接访问时,应用程序在一段时间后开始静默死机。
我应该采取什么措施来防止应用程序被终止?
这是我在日志文件中看到的。但这不是崩溃日志,应用程序在此日志后继续运行:

2020-09-09 00:09:15.877  INFO 27720 --- [nio-8080-exec-3] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [HTTP/1.10x0aHost:]
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:560) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_252]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_252]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_252]

2020-09-09 11:24:35.544  INFO 27720 --- [nio-8080-exec-5] o.apache.coyote.http11.Http11Processor   : Error parsing HTTP request header
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.

java.lang.IllegalArgumentException: Invalid character found in the HTTP protocol [HTTP/1.10x0aHost:]
    at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:560) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_252]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_252]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.36.jar!/:9.0.36]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_252]

LOGBACK: No context given for c.q.l.core.rolling.SizeAndTimeBasedRollingPolicy@532445947
仅此而已,没有其他异常(exception),没有关闭日志,不幸的是没有其他线索...
我正在使用以下命令来运行应用程序:sudo nohup java -Dspring.profiles.active=stage -jar myapplication.jar &Spring Boot 版本为 2,EC2 实例为 Amazon Linux 2018.3
编辑:我正在添加一些有关 CloudFront 配置的图像。
源配置:
CloudFront Origin configurations
行为配置:
CloudFront Behavior configurations

最佳答案

配置 CloudFront 分配支持的 HTTP 版本
作为

HTTP/1.1, HTTP/1.0


代替

HTTP/2, HTTP/1.1, HTTP/1.0


解决了这个问题。
原始帖子中的异常仍然存在,但不再终止。
我认为服务于 Rest API 的应用程序不支持 HTTP 2,当从 CloudFront 重定向时,一些 HTTP 2 请求到达。然后以某种方式处理不受支持的 http 请求版本会导致一些 fatal error ,从而导致终止。如果我错了,请纠正我。

关于spring-boot - IllegalArgumentException : Invalid character found in the HTTP protocol,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63828797/

相关文章:

c# - UWP Windows 应用商店应用程序上的 TLS 客户端证书身份验证

apache - 使用 Let's encrypt with Apache 和 Apache Tomcat

node.js - 使用 Express.js 的多个 SSL 证书和 HTTP/2

使用 spark-submit 时出现 Hadoop 错误

php - 奇怪的 laravel 安全行为

hibernate - spring.jpa.properties.hibernate.generate_statistics=true 不工作

java - 如何使用 spring boot 读取 yaml 文件然后在 localhost 中显示结果?

java - 带有@PathVariable和@RequestParam的自定义 validator

java - 如何设置 Spring-Boot 请求映射方法的优先级

python - 在多个ec2实例上运行脚本