好的,我已经阅读了一篇关于wiki的小文章,其中有一些解释了AJP.基本上,此协议用于Apache和应用程序服务器之间的通信.但是为什么人们可能首先需要它呢?为什么不使用普通的http?
我有一个Tomcat安装,我怀疑由于线程未正确释放,线程池可能会随着时间的推移而减少.当达到maxthreads时,我在catalina.out中出现错误,但我想每五分钟将使用的线程数记录到一个文件中,这样我就可以验证这个假设.请问有谁可以建议如何做到这一点?
此外,在此安装中没有Tomcat管理器,看起来原始安装的人由于某种原因删除了管理器webapp.我不确定经理是否能够执行上述操作,或者我是否可以在不损坏现有安装的情况下重新安装它?我真正想做的就是跟踪线程池.
另外,我注意到Tomcat的maxthreads是200,但Apache的最大并发连接数较低(Apache使用mod_proxy和mod_proxy_ajp(AJP 1.3)来提供Tomcat).这似乎也错了,这些数字之间的正确关系是什么?
任何帮助非常感谢:D
更新:只是一个快速更新,说直接JMX访问工作.但是我还必须设置Dcom.sun.management.jmxremote.host.我把它设置为localhost并且它工作,但没有它没有骰子.如果其他人在尝试启用JMX时遇到类似问题,我建议您也设置此值,即使您从本地计算机进行连接也是如此.似乎某些版本的Tomcat需要它.
只是快速更新,说直接JMX访问工作.但是我还必须设置Dcom.sun.management.jmxremote.host.我把它设置为localhost并且它工作,但没有它没有骰子.如果其他人在尝试启用JMX时遇到类似问题,我建议您也设置此值,即使您从本地计算机进行连接也是如此.似乎某些版本的Tomcat需要它.
引起:java.lang.IllegalArgumentException:AJP 连接器配置为secretRequired="true",但secret 属性为空或""。此组合无效。在 org.apache.coyote.ajp.AbstractAjpProtocol.start(AbstractAjpProtocol.java:264) 在 org.apache.catalina.connector.Connector.startInternal(Connector.java:1035) ...省略了 22 个常用框架
将 springboot 从 2.1.9 升级到 2.2.5 后,我看到上述错误。通过将 tomcat 版本升级到与最新的 springboot 2.2.5 捆绑在一起的 9.0.31,升级是必要的,以克服 Ghostcat 漏洞。
有没有办法使用HTTP代理将Apache连接到Tomcat,以便Tomcat获取正确的传入主机名而不是localhost?我在apache中使用此指令:
ProxyPass /path http://localhost:8080/path
Run Code Online (Sandbox Code Playgroud)
但它来自localhost,当我们在同一台服务器上有一堆站点时,这是无用的.我可以在服务器配置中手动设置主机:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
proxyName="pretend.host" proxyPort="80" />
Run Code Online (Sandbox Code Playgroud)
但这再次不会提供多个站点.而且我不喜欢为每个站点使用不同的内部端口,听起来真的很难看.
我代理它时是否无法转移端口?
(如果你问为什么我不只是使用AJP,答案就是这个错误.我在尝试完全放弃Tomcat和Apache之前我正在尽我所能)
secretRequired="false"添加到AJP连接器的选项是server.xml。但是,连接器不会以Protocol handler start failed错误开始。它位于 Apache Server 2.4.25 版之后。
<Connector port="8009"
address="127.0.0.1" tomcatAuthentication="false" URIEncoding="UTF-8" enableLookups="false"
protocol="AJP/1.3" redirectPort="8663" connectionTimeout="600000" secretRequired="false" />
Run Code Online (Sandbox Code Playgroud)
错误:
Caused by: java.lang.IllegalArgumentException: The AJP Connector is configured with secretRequired="true" but the secret attribute is either null or "". This combination is not valid.
Run Code Online (Sandbox Code Playgroud)
谢谢
我目前有一个Tomcat + Apache HTTP服务器设置来为我的Java servlet提供服务:
ProxyPass /myservice http://localhost:8080/myservice
ProxyPassRerverse /myservice http://localhost:8080/myservice
Run Code Online (Sandbox Code Playgroud)
这一切都很好,除了myservice需要知道客户端IP地址,由于代理服务器总是证明是127.0.0.1.有没有解决方案来获得真正的IP地址?AJP是一个选择吗?
doGet(HttpServletRequest request, HttpServletResponse response){
request.getRemoteAddr()
}
Run Code Online (Sandbox Code Playgroud) 我遇到了配置Apache和Tomcat的麻烦,这就是场景:
我有一个Apache Web Server,运行正常,我可以访问这个只需键入:
http://localhost
Run Code Online (Sandbox Code Playgroud)
此外,在这台主机中,我有一个Tomcat运行并正常工作; 我创建了一个迷你网络应用程序,文件在"prueba"目录中,我可以访问输入:
http://localhost:8080/prueba
Run Code Online (Sandbox Code Playgroud)
(我知道Apache在80端口运行,而Tomcat在8080运行)
我想要做的是通过Apache用户可以访问'pruebas'(在Tomcat上运行),我的意思是:
http://localhost/prueba
Run Code Online (Sandbox Code Playgroud)
我已经知道了很多这个,我认为有两种方法可以做到这一点,我已经决定启用代理模块(proxy和proxy_ajp,带有a2enmod),我也已经知道我必须编辑这个文件: sites-available/default,这是内容:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName 127.0.0.1
DocumentRoot /var/www
ProxyRequests Off
ProxyPreserveHost On
ProxyPass /static/ !
ProxyPass / ajp://localhost:8009/
ProxyPassReverse / ajp://localhost:8009/
.
.
.
Alias /static/ "/apache/www/"
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
但这没有正常工作:(
我不得不说,我尝试了很多改变,在这两行上,如:
ProxyPass /prueba ajp://localhost:8009/prueba
ProxyPassReverse /prueba ajp://localhost:8009/prueba
Run Code Online (Sandbox Code Playgroud)
要么
ProxyPass / ajp://localhost:8009/prueba
ProxyPassReverse / ajp://localhost:8009/prueba
Run Code Online (Sandbox Code Playgroud)
(每次我编辑文件,我都重启apache)
但是当我访问[http:// localhost/prueba /]时,我有:服务暂时不可用
有谁知道为什么?先谢谢你们.
Pd:我正在使用apache 2.2.17和tomcat6.
我用Apache 2和mod_proxy设置了一个Tomcat 6.现在我在server.xml中有这个默认值:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Run Code Online (Sandbox Code Playgroud)
netstat看起来像这样:
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4703/apache2
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1020/sshd
tcp 0 0 127.0.0.1:8005 0.0.0.0:* LISTEN 10517/java
tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 10517/java
tcp 0 0 127.0.0.1:8009 127.0.0.1:48704 ESTABLISHED 10517/java
tcp 0 0 127.0.0.1:48704 127.0.0.1:8009 ESTABLISHED 11696/apache2
Run Code Online (Sandbox Code Playgroud)
我现在的问题是,AJP是否有必要在全球范围内收听8009端口,我不这么认为?!以及如何关闭它?
我一直在尝试使用嵌入式Tomcat的Spring Boot应用程序配置Apache Web服务器.在Spring Boot之前我曾经创建过一个ajp.conf文件,如:
<VirtualHost *:80>
ServerName localhost
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass /app ajp://localhost:8009/app
ProxyPassReverse /app ajp://localhost:8009/app
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
并包含在httpd.conf文件中
Include /opt/lampp/apache2/conf/ajp.conf
Run Code Online (Sandbox Code Playgroud)
在Tomcat的server.xml文件中,我曾经将它配置为侦听端口8009
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" connectionTimeout="5000"
Run Code Online (Sandbox Code Playgroud)
此设置有效.但是,现在使用Spring Boot我正在尝试使用嵌入式tomcat实现类似的功能.我在这里阅读了Spring Boot Documentation,并在我的application.yml文件中添加了以下属性:
server:
port: 8080
tomcat:
remote_ip_header: x-forwarded-for
protocol_header: x-forwarded-proto
Run Code Online (Sandbox Code Playgroud)
我的ajp.conf文件如下所示:
<VirtualHost *:80>
ServerName localhost
<Proxy *>
AddDefaultCharset Off
Order deny,allow
Allow from all
</Proxy>
ProxyPass /app ajp://localhost:8009/
ProxyPassReverse /app ajp://localhost:8009/
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)
我有我的spring boot tomcat配置类
@Configuration
public class TomcatConfiguration {
private final …Run Code Online (Sandbox Code Playgroud) 这个错误一直让我疯狂.我们有一台运行Apache和Tomcat的服务器,服务于多个不同的站点.通常情况下,服务器运行正常,但有时会发生错误的时候,人们都提供了错误的页面- 页面是别人请!
线索:
JkMount内的指令<VirtualHost>是正确的.更多的信息:
Apache没有打开任何形式的缓存.httpd.conf和相关导入中的所有与缓存相关的条目都说明,例如:
<IfDefine CACHE>
LoadModule cache_module modules/mod_cache.so
</IfDefine>
Run Code Online (Sandbox Code Playgroud)
虽然Apache的选项不包含该标志:
APACHE2_OPTS="-D DEFAULT_VHOST -D INFO -D LANGUAGE -D SSL -D SSL_DEFAULT_VHOST -D PHP5 -D JK"
Run Code Online (Sandbox Code Playgroud)
Tomcat同样没有打开缓存选项,我可以找到.
toolkit的建议很好,但在这种情况下不合适.是什么让我相信错误不在我自己的代码中是因为它不仅仅是一些正在传输的值 - 它是整个请求,包括URL,参数,会话cookie,整个事情.人们正在回复说"你以约翰身份登录",而他们显然没有.
更新:
根据几个人的建议,我将向Tomcat提供的页面添加以下HTTP标头,以禁用所有形式的缓存:
Cache-Control: no-store
Vary: *
Run Code Online (Sandbox Code Playgroud)
希望这些标题不仅受到Apache的尊重,还受到可能阻碍的任何其他缓存或代理的尊重.不幸的是我无法故意重现这个错误,所以我只能等待,看看它是否再次出现.
我注意到包含以下标题 - 它们是否可能以任何方式相关?
Connection: Keep-Alive
Keep-Alive: timeout=5, max=66
Run Code Online (Sandbox Code Playgroud)
更新:
显然,当我睡着的时候,这又发生了,但现在已经停止了,我很清醒地看到了它.再一次,在我看到的日志中没有任何用处,所以我没有找到实际发生的事情或如何防止它的线索.
我可以在Apache或Tomcat的日志中添加任何额外的信息,以便更容易诊断吗?
更新:
由于这已经发生了几次,我们已经改变了Apache连接到Tomcat的方式,看它是否会影响事物.我们正在使用这样mod_jk的指令:
JkMount /portal ajp13
Run Code Online (Sandbox Code Playgroud)
我们现在切换到使用mod_proxy_ajp,如下所示:
ProxyPass /portal …Run Code Online (Sandbox Code Playgroud)