淘宝网站某大压力项目的服务器出现了严重的用户响应串号问题,
追踪到根源还是ajp1.3协议本身容错性不强。
就拿apr配置来说,AjpAprProcessor,AjpAprProtocol,AprEndpoint这三个关键类
实行的是AjpAprProcessor复用即socket复用的机制,在代码
处理request,response导致io异常抛出的时候
apr socket没法正常销毁会引起用户串号,多发于post请求处理情况,
以下代码来自 jbossweb.jar jboss 4.2.2.
AjpAprProtocol.java
public SocketState process(long socket) {
AjpAprProcessor processor = recycledProcessors.poll();
try {
if (processor == null) {
processor = createProcessor();
}
if (processor instanceof ActionHook) {
((ActionHook) processor).action(ActionCode.ACTION_START, null);
}
if (processor.process(socket)) {
return SocketState.OPEN;
} else {
return SocketState.CLOSED;
}
} catch(java.net.SocketException e) {
// SocketExceptions are normal
AjpAprProtocol.log.debug
(sm.getString
("ajpprotocol.proto.socketexception.debug"), e);
} catch (java.io.IOException e) {
// IOExceptions are normal
AjpAprProtocol.log.debug
(sm.getString
("ajpprotocol.proto.ioexception.debug"), e);
}
// Future developers: if you discover any other
// rare-but-nonfatal exceptions, catch them here, and log as
// above.
catch (Throwable e) {
// any other exception or error is odd. Here we log it
// with "ERROR" level, so it will show up even on
// less-than-verbose logs.
AjpAprProtocol.log.error
(sm.getString("ajpprotocol.proto.error"), e);
} finally {
if (processor instanceof ActionHook) {
((ActionHook) processor).action(ActionCode.ACTION_STOP, null);
}
recycledProcessors.offer(processor);
}
return SocketState.CLOSED;
}
实际上上面捕获ioexception这段代码已经很难生效,因为可能在之前调用时就被捕获
比如 org.apache.catalina.connector.Request
/**
* Parse request parameters.
*/
protected void parseParameters() {
parametersParsed = true;
Parameters parameters = coyoteRequest.getParameters();
// getCharacterEncoding() may have been overridden to search for
// hidden form field containing request encoding
String enc = getCharacterEncoding();
boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
if (enc != null) {
parameters.setEncoding(enc);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding(enc);
}
} else {
parameters.setEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
if (useBodyEncodingForURI) {
parameters.setQueryStringEncoding
(org.apache.coyote.Constants.DEFAULT_CHARACTER_ENCODING);
}
}
parameters.handleQueryParameters();
if (usingInputStream || usingReader)
return;
if (!getMethod().equalsIgnoreCase("POST"))
return;
String contentType = getContentType();
if (contentType == null)
contentType = "";
int semicolon = contentType.indexOf(';');
if (semicolon >= 0) {
contentType = contentType.substring(0, semicolon).trim();
} else {
contentType = contentType.trim();
}
if (!("application/x-www-form-urlencoded".equals(contentType)))
return;
int len = getContentLength();
if (len > 0) {
int maxPostSize = connector.getMaxPostSize();
if ((maxPostSize > 0) && (len > maxPostSize)) {
if (context.getLogger().isDebugEnabled()) {
context.getLogger().debug("Post too large");
}
return;
}
byte[] formData = null;
if (len < CACHED_POST_LEN) {
if (postData == null)
postData = new byte[CACHED_POST_LEN];
formData = postData;
} else {
formData = new byte[len];
}
try {
if (readPostBody(formData, len) != len) {
return;
}
} catch (IOException e) {
// Client disconnect
if (context.getLogger().isDebugEnabled()) {
context.getLogger().debug(
sm.getString("coyoteRequest.parseParameters"), e);
}
}
parameters.processParameters(formData, 0, len);
}
}
而ajp1.3本身的协议在出现io异常而又没法销毁的情况下是非常危险的。
淘宝网目前某大牛直接修改ajp协议,加上任务id,丢弃串号响应
这种做法比较纠结,要同时fix升级mod_jk和jboss.后续可能考虑废弃ajp这个多年无人维护的协议。
apache的邮件列表上也有人反映该现象
https://issues.apache.org/bugzilla/show_bug.cgi?id=47714
分享到:
相关推荐
这个集群解决方案可以提高服务的可靠性,当一台Tomcat服务器出现故障时,mod_jk能够自动将请求重定向到其他健康的实例。同时,通过调整负载均衡策略,可以优化资源分配,应对不同的流量模式。 在Linux 64位环境下,...
通过 mod_jk,可以实现负载均衡、故障转移等功能,提升系统的可用性和可伸缩性。 **整合过程** 1. **安装 Apache 2.4**: 首先,你需要在你的服务器上安装 Apache 2.4,这通常涉及到下载源码包,配置编译选项,然后...
本教程将详细阐述如何在Windows环境下配置基于Jboss7、Apache 2.2.25和mod_jk的集群,实现负载均衡。首先,确保您已经下载了所需的所有软件,包括Jboss7、Apache HTTP Server 2.2.25和mod_jk模块。 1. **安装与准备...
Apache、Tomcat、mod_jk和mod_ssl是构建高效、安全的Java web应用程序服务器环境的关键组件。本配置笔记将深入探讨如何将这些组件整合在一起,实现动态内容的处理和HTTPS安全连接。 首先,Apache HTTP Server作为...
在此文件中,你需要添加`mod_jk`模块的加载指令,例如`LoadModule jk_module modules/mod_jk.so`。如果`mod_jk.so`不在默认模块目录中,需要指定正确的路径。 3. **下载并配置mod_jk**:从Apache官方或Tomcat的下载...
### Apache+mod_jk+Tomcat负载均衡配置详解 #### 一、背景介绍 随着互联网技术的迅猛发展,单一服务器已经难以满足日益增长的服务需求。负载均衡技术应运而生,成为提高服务可用性和扩展性的关键手段之一。本文将...
mod_jk的主要任务是负载均衡、故障转移和请求转发,使得动态内容(如Java Servlets和JSP)可以在Tomcat上处理,而静态内容则由Apache直接服务,这样可以提高整体系统的性能和可扩展性。 安装Apache 2.2.15 + mod_jk...
Apache、mod_jk和Tomcat的组合是一种常见的Web服务器与应用服务器集成方案,用于构建高性能、高可用性的Java Web应用程序集群。在这个配置中,Apache作为前端的反向代理服务器,负责接收HTTP请求,并通过mod_jk模块...
要使用mod_jk,首先需要在Apache服务器上编译并安装mod_jk模块,然后在Apache的配置文件(httpd.conf)中加载该模块。 **配置Apache** 在Apache的httpd.conf中,你需要添加以下行来加载mod_jk模块: ```apache...
3. 配置server.xml:在每个Tomcat实例的conf目录下,修改server.xml文件,关闭默认的HTTP Connector,开启AJP Connector,以便mod_jk能够连接。 五、集群文档 压缩包中的集群文档会提供详细的步骤指南,从下载所有...
- **编辑 ajp.conf 或者 virtual host 配置**:在 Apache 配置中添加对 mod_jk 的引用,如 `JkMount /app worker1`,这意味着所有 `/app` 开头的请求都将被转发到名为 `worker1` 的 Tomcat 实例。 - **重启 Apache...
### JBoss6 + mod_jk + Apache2.2 集群配置详解 #### 一、概述 在当今高并发、大数据的环境下,单一服务器往往难以满足业务需求,因此搭建服务器集群成为提升系统性能和可用性的有效手段之一。本文主要介绍如何...
### JBoss 6 + mod_jk + Apache 2.2 集群实现 Session 复制详解 #### 一、概述 随着互联网技术的发展与普及,越来越多的企业开始重视Web服务的高可用性和负载均衡能力。在这样的背景下,利用JBoss 6、mod_jk和...
安装`httpd-2.2.17-win32-x86-no_ssl.msi`后,你需要在Apache的配置中启用`mod_jk`,并正确配置`mod_jk.conf`和`workers.properties`,以利用`mod_jk-1.2.31-httpd-2.2.3.so`进行负载均衡。确保所有服务器都能正常...
本配置指南将详细讲解如何在Apache 2.2.19版本上集成Tomcat 6.0.26,并使用mod_jk模块实现Apache与Tomcat之间的通信。 首先,了解Apache和Tomcat集群的基础概念。集群是一种将多台服务器连接在一起,以提供更高可用...
5. **配置server.xml**:在Tomcat的`server.xml`文件中,开启AJP(Apache JServ Protocol)监听,这是mod_jk和Tomcat之间通信的协议。 **不同版本的兼容性** 压缩包中的不同版本的mod_jk模块(如`mod_jk-1.2.8-rc-...
总结来说,`mod_jk.so`是Apache与Java应用服务器之间通信的关键组件,它通过AJP协议实现通信,允许你在保持Apache的静态内容处理效率的同时,利用Tomcat处理动态内容。通过上述步骤,你可以在Apache 2.4上成功安装和...
3. **配置Apache:** 在Apache的httpd.conf中,加载mod_jk模块,并配置JK模块的相关指令,如`LoadModule jk_module modules/mod_jk.so`。然后,通过`JkWorkersFile`指定worker.properties的位置。 4. **配置worker....
3. **故障转移**:当后端服务器出现故障时,Mod_JK可以自动将请求重定向到其他健康的服务器,提供故障恢复能力。 4. **健康检查**:Mod_JK可以定期检查后端服务器的状态,确保只将请求发送到可正常工作的服务器。 ...
本压缩包提供了实现Tomcat集群配置所需的Apache服务器和mod_jk模块,具体版本为Apache 2.0.55和mod_jk-apache-2.0.55.so。 Apache HTTP Server是一个开源的Web服务器,它能够处理静态HTML文件和动态内容,如PHP、...