Ajp收到带有签名的无效消息

26

我使用Tomcat 7.0.29作为前端配合Apache 2.2.22 modproxy。在httpd.conf中配置了Ajp协议和在server.xml中配置了AjpNioProtocol。启动服务器后,日志中充斥着以下错误信息:

Severe: Invalid message received with signature 20599
com.apache.coyote.ajp.AjpMessage processHeader

没有请求发送到Web或Tomcat服务器,它仍然会抛出该错误。Tomcat和Apache的访问日志显示没有请求进来。是什么导致了这个无效的消息错误?

以下是配置信息:

  • httpd.conf

    ProxyPass /wl ajp:// ip : port /wl
    ProxyPassReverse /wl ajp:// ip : port /wl
    
  • 服务器配置文件:server.xml

  • <Connector port="port" 
               protocol="org.apache.coyote.ajp.AjpNioProtocol" 
               connectionTimeout="20000" 
               acceptorThreadCount="2" 
               maxThreads="1600" 
               redirectPort="8443" />
    

这是 server.xml 文件 --> <Connector port="port" protocol="org.apache.coyote.ajp.AjpNioProtocol" connectionTimeout="20000" acceptorThreadCount="2" maxThreads="600" redirectPort="8443" /> - Yasser
你能提供你当前的配置以避免这个问题吗? 需要从哪个文件中添加什么,移除什么? - GhanshyamR
5个回答

35

对我来说,问题很简单。 我发送的是HTTP请求,但连接器配置了AJP协议。 我在 server.xml 中配置的连接器如下:

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>

但是当我将其更改为以下内容:

<Connector port="8009" protocol="HTTP/1.1" redirectPort="8443"/>

错误已经消失。

希望这会帮助遇到此错误的人。


1
默认情况下,某些其他端口(如8080)上配置了HTTP连接器。因此,应该重新配置调用应用程序,以便在使用HTTP时不使用8009的AJP端口,而是使用另一个端口,例如8080。这样符合标准惯例。 - Thorsten Schöning

11

当缓冲区大小不一致时,也可能发生这种情况:日志会提到无效的AJP消息,而浏览器会收到400错误代码。

我已经通过在AJP连接器上设置packetSize和在Apache2配置中设置ProxyIOBufferSize来解决了这个问题。

在Tomcat的server.xml文件中:

<Connector protocol="AJP/1.3" port="8009"
   connectionTimeout="20000"
   packetSize="65536"
   proxyName="yourproxy.domain.ltd" proxyPort="80"
   />

在Apache2的mod_proxy_ajp配置中,添加语句ProxyIOBufferSize 65536

2

发现其中一个内部进程调用了该端口并发送了HTTP请求,导致了“无效消息…”错误。因此,我最终为这些内部进程添加了额外的HTTP连接器。


1
今天我收到了类似的消息:
Nov 18, 2016 4:25:00 PM org.apache.coyote.ajp.AjpMessage processHeader
SEVERE: Invalid message received with signature 65524

我的问题的根本原因是selinux不允许apache连接到tomcat。我有点困惑这个错误是如何产生的 - 我期望没有连接,就算是一个时期。最好的猜测是,我可能尝试使用telnet手动连接到该端口。这样做肯定会给出类似的消息。
无论如何,也许这个selinux提醒对于其他在这里遇到问题的人会有所帮助。

1
没有任何请求发送到Web或Tomcat服务器,但它仍然会抛出错误。 Tomcat和Apache中的访问日志显示没有请求进来。是什么导致了无效消息错误?
只是一些提示,因为我在一个配置文件中不小心忘记了相同的内容:在server.xml中提到的Connector全局监听,因为只有指定了port,而没有指定任何address。后者默认定义为全局监听:

默认情况下,此端口将在与服务器关联的所有IP地址上使用。

https://tomcat.apache.org/tomcat-7.0-doc/config/http.html

因此,如果没有任何额外的防火墙或类似的东西,可能会出现不良客户端使用各种协议测试开放端口的情况,这些协议可能是HTTP,也可能不是HTTP,从而导致具有不同签名的错误消息。除非有非常好的理由,否则不应该需要使AJP全局可用,尤其是在像帖子作者使用的代理设置的情况下。
<Connector  address="localhost" port="port" 
            protocol="org.apache.coyote.ajp.AjpNioProtocol" 
            connectionTimeout="20000" 
            acceptorThreadCount="2" 
            maxThreads="1600" 
            redirectPort="8443" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接