`
alin_ass
  • 浏览: 34582 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ajp+mod_jk响应串号故障

    博客分类:
  • bugs
阅读更多
淘宝网站某大压力项目的服务器出现了严重的用户响应串号问题,
追踪到根源还是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
分享到:
评论

相关推荐

    apache + tomcat + mod_jk集群

    这个集群解决方案可以提高服务的可靠性,当一台Tomcat服务器出现故障时,mod_jk能够自动将请求重定向到其他健康的实例。同时,通过调整负载均衡策略,可以优化资源分配,应对不同的流量模式。 在Linux 64位环境下,...

    apache2.4 +tomcat7+mod_jk.so 完美整合实例

    通过 mod_jk,可以实现负载均衡、故障转移等功能,提升系统的可用性和可伸缩性。 **整合过程** 1. **安装 Apache 2.4**: 首先,你需要在你的服务器上安装 Apache 2.4,这通常涉及到下载源码包,配置编译选项,然后...

    Jboss7 +apache 2.2.25+mod_jk 配置集群

    本教程将详细阐述如何在Windows环境下配置基于Jboss7、Apache 2.2.25和mod_jk的集群,实现负载均衡。首先,确保您已经下载了所需的所有软件,包括Jboss7、Apache HTTP Server 2.2.25和mod_jk模块。 1. **安装与准备...

    Apache+Tomcat+mod_jk+mod_ssl配置笔记

    Apache、Tomcat、mod_jk和mod_ssl是构建高效、安全的Java web应用程序服务器环境的关键组件。本配置笔记将深入探讨如何将这些组件整合在一起,实现动态内容的处理和HTTPS安全连接。 首先,Apache HTTP Server作为...

    apache2.2+mod_jk

    在此文件中,你需要添加`mod_jk`模块的加载指令,例如`LoadModule jk_module modules/mod_jk.so`。如果`mod_jk.so`不在默认模块目录中,需要指定正确的路径。 3. **下载并配置mod_jk**:从Apache官方或Tomcat的下载...

    Apache+mod_jk+Tomcat负载均衡配置

    ### Apache+mod_jk+Tomcat负载均衡配置详解 #### 一、背景介绍 随着互联网技术的迅猛发展,单一服务器已经难以满足日益增长的服务需求。负载均衡技术应运而生,成为提高服务可用性和扩展性的关键手段之一。本文将...

    Apache 2.2.15+mod_jk

    mod_jk的主要任务是负载均衡、故障转移和请求转发,使得动态内容(如Java Servlets和JSP)可以在Tomcat上处理,而静态内容则由Apache直接服务,这样可以提高整体系统的性能和可扩展性。 安装Apache 2.2.15 + mod_jk...

    Apache + mod_jk + tomcat(64)

    Apache、mod_jk和Tomcat的组合是一种常见的Web服务器与应用服务器集成方案,用于构建高性能、高可用性的Java Web应用程序集群。在这个配置中,Apache作为前端的反向代理服务器,负责接收HTTP请求,并通过mod_jk模块...

    tomcat集群-Apache2.2.4+And+mod_jk.so+tomcat配置文件

    要使用mod_jk,首先需要在Apache服务器上编译并安装mod_jk模块,然后在Apache的配置文件(httpd.conf)中加载该模块。 **配置Apache** 在Apache的httpd.conf中,你需要添加以下行来加载mod_jk模块: ```apache...

    集群(windows+tomcat+mod_jk)

    3. 配置server.xml:在每个Tomcat实例的conf目录下,修改server.xml文件,关闭默认的HTTP Connector,开启AJP Connector,以便mod_jk能够连接。 五、集群文档 压缩包中的集群文档会提供详细的步骤指南,从下载所有...

    apache2.4+tomcat7+mod_jk.so_整合配置

    - **编辑 ajp.conf 或者 virtual host 配置**:在 Apache 配置中添加对 mod_jk 的引用,如 `JkMount /app worker1`,这意味着所有 `/app` 开头的请求都将被转发到名为 `worker1` 的 Tomcat 实例。 - **重启 Apache...

    Jboss6+mod_jk+apache2.2集群配置

    ### JBoss6 + mod_jk + Apache2.2 集群配置详解 #### 一、概述 在当今高并发、大数据的环境下,单一服务器往往难以满足业务需求,因此搭建服务器集群成为提升系统性能和可用性的有效手段之一。本文主要介绍如何...

    Jboss6+mod_jk+apache2.2集群实现session的复制

    ### JBoss 6 + mod_jk + Apache 2.2 集群实现 Session 复制详解 #### 一、概述 随着互联网技术的发展与普及,越来越多的企业开始重视Web服务的高可用性和负载均衡能力。在这样的背景下,利用JBoss 6、mod_jk和...

    httpd-2.2.17-win32-x86-no_ssl.msi + mod_jk-1.2.31-httpd-2.2.3.so

    安装`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`进行负载均衡。确保所有服务器都能正常...

    Apache2.2.19 + Tomcat-6026+ mod_jk-apache-2.2.xx.so 配置集群

    本配置指南将详细讲解如何在Apache 2.2.19版本上集成Tomcat 6.0.26,并使用mod_jk模块实现Apache与Tomcat之间的通信。 首先,了解Apache和Tomcat集群的基础概念。集群是一种将多台服务器连接在一起,以提供更高可用...

    mod_jk dll

    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

    总结来说,`mod_jk.so`是Apache与Java应用服务器之间通信的关键组件,它通过AJP协议实现通信,允许你在保持Apache的静态内容处理效率的同时,利用Tomcat处理动态内容。通过上述步骤,你可以在Apache 2.4上成功安装和...

    Tomcat+Apache+JK集群

    3. **配置Apache:** 在Apache的httpd.conf中,加载mod_jk模块,并配置JK模块的相关指令,如`LoadModule jk_module modules/mod_jk.so`。然后,通过`JkWorkersFile`指定worker.properties的位置。 4. **配置worker....

    apache mod_jk

    3. **故障转移**:当后端服务器出现故障时,Mod_JK可以自动将请求重定向到其他健康的服务器,提供故障恢复能力。 4. **健康检查**:Mod_JK可以定期检查后端服务器的状态,确保只将请求发送到可正常工作的服务器。 ...

    tomcat集群配置所需要的apache和mod_jk-apache-2.0.55.so

    本压缩包提供了实现Tomcat集群配置所需的Apache服务器和mod_jk模块,具体版本为Apache 2.0.55和mod_jk-apache-2.0.55.so。 Apache HTTP Server是一个开源的Web服务器,它能够处理静态HTML文件和动态内容,如PHP、...

Global site tag (gtag.js) - Google Analytics