tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

时间:2024-03-16 21:24:58

试了好多种方法,貌似还是没有解决问题,不过也学到了点东西,记录下备忘吧。

异常详情:

tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

1、首先看到最多的就是说在server.xml中的Connector中添加maxHttpHeaderSize="8192",像下面这样设置的。

<Connector port="8080" protocol="HTTP/1.1"   maxHttpHeaderSize="8192"    connectionTimeout="20000"   maxThreads="150"  maxSpareThreads="75"   redirectPort="8443" />  

但是我查了tomcat的配置介绍https://tomcat.apache.org/tomcat-8.5-doc/config/http.html ,这个属性默认的就是8192(8KB),我索性给设置成maxHttpHeaderSize="81920"了,不过貌似还是没有解决问题,依然出现同样的异常

tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

不过这两个设置: maxSpareThreads="75"在我启动tomcat的时候会有如下警告,而且我在tomcat的配置文档中并没有找到此属性,所以我感觉还是不要设置的好

10-Sep-2019 11:38:15.659 警告 [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxSpareThreads' to '75' did not find a matching property.

关于这个maxHttpHeaderSize的设置,还有个比较厉害的大神,修改源码了,能看懂的可以试试,反正我这个小菜鸟表示有心无力

2、还有种说法说的是设计到不合法字符的原因,Error parsing HTTP request header翻译过来就是请求头错误嘛

以下内容参考:https://www.jianshu.com/p/83735dc80603?spm=a2c6h.13066369.0.0.44c05da9lfSEG7

首先:不推荐降低tomcat版本,这等于掩耳盗铃,绝对得不偿失。
  Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,在http解析时做了严格限制。
  RFC3986文档规定,请求的Url中只允许包含英文字母(a-zA-Z)、数字(0-9)、-_.~4个特殊字符以及所有保留字符。

解决方案:在在conf/catalina.properties中最后添加2行:

tomcat.util.http.parser.HttpParser.requestTargetAllow=|{}
org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH=true

tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

 不幸的是, requestTargetAllow 只能配置|、{、} 允许这三个字符,对于其他的(例如" < > [ \ ] ^ ` { | } .),在请求时,仍然拦截,如果使用了|{}之外的其他字符那怎么办呢?那就还需要如下配置。

relaxedPathChars="[\]^`{|}" relaxedQueryChars="[\]^`{|}"

tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

 不过我在添加这个备注之后,启动里会有如下警告,暂时不知道是何原因,而且我的网址中并没有这些特殊符号,索性就删除了,如果有这些特殊符号的,可以尝试下。

10-Sep-2019 11:38:15.663 警告 [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'relaxedPathChars' to '[\]^`{|}' did not find a matching property.
10-Sep-2019 11:38:15.663 警告 [main] org.apache.catalina.startup.SetAllPropertiesRule.begin [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'relaxedQueryChars' to '[\]^`{|}' did not find a matching property.

3、有个神奇的解决方法,说是https的问题,改成http就好了,我本来就用的是http,所以没有尝试此方法,如果有这种情况的话,可以尝试

4、修改连接协议

tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

4.1将HTTP1.1改成org.apache.coyote.http11.Http11NioProtocol,结果启动tomcat的时候出现了一大堆“地址已使用”的错误,不求甚解,头大中

  tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

   这里学习一点Linux查看端口的知识:Linux 查看端口占用情况可以使用 lsof 和 netstat 命令

  (1)lsof的用法:

  lsof -i:端口号

         tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

   (2)netstat用法:

netstat -tunlp | grep 端口号

netstat命令各个参数说明如下:

-a:列出所有网络状态,包括 Socket 程序;
-c秒数:指定每隔几秒刷新一次网络状态;
-n:使用 IP 地址和端口号显示,不使用域名与服务名;
-p:显示 PID 和程序名;
-t:显示使用 TCP 协议端口的连接状况;
-u:显示使用 UDP 协议端口的连接状况;
-I:仅显示监听状态的连接;
-r:显示路由表;
即可显示当前服务器上所有端口及进程服务,于grep结合可查看某个具体端口及服务情况··

(3)杀死进程

kill -9 PID 

4.2 将HTTP1.1改成protocol="org.apache.coyote.http11.Http11Protocol",启动时提示此写法已过时,让采用上一种协议

10-Sep-2019 14:55:12.963 警告 [main] org.apache.coyote.http11.Http11Protocol.<init> The HTTP BIO connector has been removed in Tomcat 8.5.x onwards. The HTTP BIO connector configuration has been automatically switched to use the HTTP NIO connector instead.

 5、在你的tomcat的server.xml上,删除一个监听

tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”...

 

 把标红的注释掉,重启项目(未实验)

6、降低tomcat版本,原因是Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。

tomcat7.0.69的下载链接

2019年9月16日补充: 更换版本之后已将近一周没出此异常。

2019年9月24日补充:一切正常,此方法可行