辅助 ajp 工作者不在 apache 和 tomcat 之间工作

Posted

技术标签:

【中文标题】辅助 ajp 工作者不在 apache 和 tomcat 之间工作【英文标题】:secondary ajp worker not working between apache and tomcat 【发布时间】:2011-12-15 09:59:22 【问题描述】:

我已经让这个工作了几个月,但今天我有一个电源循环并且有东西坏了。抱歉,这有点详细和具体,但我急需帮助。

我有 apache-2.2 和两个 tomcat-6 服务器(只是从两个单独的文件夹运行)。我没有任何 http 连接器,但我在每台服务器上的端口 8009 和 8010 上运行一个 ajp 连接器。启动时,两个 tomcat 都报告连接器正在运行并且似乎没有任何问题:

INFO: JK: ajp13 listening on /0.0.0.0:8009
...
INFO: JK: ajp13 listening on /0.0.0.0:8010

我有理由确定我的工作人员和 apache 配置设置正确。我可以很好地到达 8009 上的连接器,完全没有问题,但是当我尝试 8010 时,apache 给了我一个 503。检查日志(mod_jk.log)它说:

jk_open_socket::jk_connect.c (594): connect to 127.0.0.1:8010 failed (errno=13)
ajp_connect_to_endpoint::jk_ajp_common.c (922): Failed opening socket to (127.0.0.1:8010) (errno=13)
ajp_send_request::jk_ajp_common.c (1507): (eis) connecting to backend failed. Tomcat is probably not started or is listening on the wrong port (errno=13)

但我无法理解的是,如果我对该端口进行简单的 telnet 并发送 GET:

# telnet 127.0.0.1 8010
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
GET
Connection closed by foreign host.

它命中了正确的tomcat(错误是预期的):

Oct 25, 2011 6:17:10 PM org.apache.jk.common.MsgAjp processHeader
SEVERE: BAD packet signature 18245
Oct 25, 2011 6:17:10 PM org.apache.jk.common.ChannelSocket processConnection
SEVERE: Error, processing connection

那么为什么 apache 不能到达呢?无论我是否是超级用户,telnet 都可以使用。会发生什么?我完全被难住了。

我已经尝试重新启动 apache 和 tomcat 并且没有任何变化。感谢您的观看。

EDIT-1:对此进行快速更新...我添加了一个 http 连接器,它工作正常,但 ajp 连接器仍然失败。

EDIT-2:这是每个请求的配置详细信息...

workers.properties:

worker.list=service1,service2

worker.service1.type=ajp13
worker.service1.host=127.0.0.1
worker.service1.port=8009

worker.service2.type=ajp13
worker.service2.host=127.0.0.1
worker.service2.port=8010

httpd.conf(我看到 jkmount 和 JkMount ... 大写重要吗?):

JkMount /s1 service1
JkMount /s1/* service1

JkMount /s2 service2
JkMount /s2/* service2

service1 的 server.xml:

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

service2 的 server.xml:

<Connector port="8010" protocol="AJP/1.3" />

我想就是这样。

【问题讨论】:

您的第一个代码块包含来自两个 tomcat 的两个“ajp13 监听”。那是在同一个日志文件中吗?两个tomcat都登录同一个日志文件吗? 你能把2个tomcats server.xml和apache的mod_jk配置部分的相关配置部分贴出来吗? cherouvim:有两个完全独立的tomcat,它们来自两个日志文件。我可以发布配置部分,但我认为这会使事情复杂化。我更感兴趣的是我如何可以远程登录到端口但 apache 找不到它。不过,如果您认为它会有所帮助,我会添加配置。谢谢! 当你在 mod_jk.log 中得到连接错误时,你在 tomcat 的 catalina 日志中得到什么了吗? 另外,你的 JkLogLevel 是多少?最后,如果你关闭了两个 Tomcat,8010 上是否有任何东西在监听? 【参考方案1】:

selinux默认开启8009,可以开启更多端口使用。

[goalin@centos63 日志]$ sudo semanage port -l | grep 8009

http_port_t tcp 80、443、488、8008、8009、8443

[goalin@centos63 日志]$ sudo semanage port -a -t http_port_t -p tcp 18009

[goalin@centos63 日志]$ sudo semanage port -a -t http_port_t -p tcp 28009

[goalin@centos63 日志]$ sudo semanage port -l | grep 8009

http_port_t tcp 28009、18009、80、443、488、8008、8009、8443

[goalin@centos63 日志]$

【讨论】:

我也面临同样的问题。这个问题的解决方法是什么?【参考方案2】:

您的系统上有 SELinux 吗?你可以试试:

setenforce 0

这可能会阻止 apache 进程连接。另外,请检查您的防火墙规则...

【讨论】:

我在看到您的回复之前就知道了这一点,但您完全正确。 SELinux 是在 8009 上打开的,但不是 8010。我想我一定是在停电之前暂时禁用了它。我已经被 SELinux 烧了很多次了,我应该明白这一点。对于关心的人来说,SELinux 有 8008 开放且未使用,所以我只是切换到使用它。 SELinux 已禁用,但我面临同样的问题。有人可以请教一下吗?

以上是关于辅助 ajp 工作者不在 apache 和 tomcat 之间工作的主要内容,如果未能解决你的问题,请参考以下文章

apache 2.4 AJP 代理不工作

如何在 Tomcat 中设置 AJP 数据包大小?

(CVE-2020-1938)Apache Tomcat AJP文件包含漏洞复现

apache tomcat ajp mod jk

Apache + Tomcat:使用 mod_proxy 代替 AJP

Apache 后面的 Tomcat 使用 ajp 进行 Spring Boot 应用程序