IllegalArgumentException:在 HTTP 协议中发现无效字符

IllegalArgumentException: Invalid character found in the HTTP protocol

我已经在 Amazon EC2 实例中开发并部署了 Spring Boot REST 应用程序。然后我创建了一个 CloudFront 分配,其行为为“将 HTTP 重定向到 HTTPS”,并将源配置为“仅 HTTP”,以便能够通过 HTTPS 访问 Rest API。

通常情况下,当使用 EC2 的自身域通过 http 访问应用程序时,一切正常。但是当我开始通过 https CloudFront link 访问时,应用程序在一段时间后开始静默死亡。

我应该采取什么措施来防止应用被终止?

这是我在日志文件中看到的内容。但这不是崩溃日志,应用程序在此日志后保留 运行ning:

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

仅此而已,没有其他异常,没有关机日志,不幸的是没有其他线索...

我正在使用以下命令 运行 应用程序:

sudo nohup java -Dspring.profiles.active=stage -jar myapplication.jar &

Spring 启动版本为 2,EC2 实例为 Amazon Linux 2018.3

编辑:我正在添加一些关于 CloudFront 配置的图片。

来源配置:

行为配置:

正如 Steffen 所提到的,HTTPS 流量正在转发到您的应用程序。您的 Cloud Front 配置应该执行 SSL 终止,然后将请求转发给您的应用程序。

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

HTTP/1.1, HTTP/1.0

而不是

HTTP/2, HTTP/1.1, HTTP/1.0

解决了问题。

原始 post 中的异常仍然存在,但不再终止。

我认为服务于 Rest API 的应用程序不支持 HTTP 2,并且当从 CloudFront 重定向时一些 HTTP 2 请求到达。然后处理不支持的 http 请求版本会以某种方式导致一些致命错误导致终止。如有不妥请指正