如何使Apache mod_泄气和传输编码:分块一起工作?

如何使Apache mod_泄气和传输编码:分块一起工作?,apache,mod-deflate,chunked,Apache,Mod Deflate,Chunked,我试图在我们的网站上使用bigpipe概念。这意味着尝试将响应分块发送,而不是将其作为一个整体发送,以便用户感觉页面速度很快。通过在java中的响应对象上使用flushBuffer方法,我成功地做到了这一点。但是现在,当我尝试使用apachemod_deflate模块压缩内容时,分块丢失了 下面是apache用于压缩内容的配置 ** 开始mod_deflate配置 结束mod_放气配置** 这是在apache中打开deflate时的响应头 连接:保持活动状态 内容编码:gzip 内容长度:791

我试图在我们的网站上使用bigpipe概念。这意味着尝试将响应分块发送,而不是将其作为一个整体发送,以便用户感觉页面速度很快。通过在java中的响应对象上使用flushBuffer方法,我成功地做到了这一点。但是现在,当我尝试使用apachemod_deflate模块压缩内容时,分块丢失了

下面是apache用于压缩内容的配置

**

开始mod_deflate配置 结束mod_放气配置** 这是在apache中打开deflate时的响应头

连接:保持活动状态
内容编码:gzip
内容长度:7916
内容类型:text/html;字符集=UTF-8
日期:2012年1月27日星期五20:11:11 GMT
保持活动状态:超时=300,最大=3997
服务器:Apache
改变:接受编码

在apache中关闭deflate时的响应头

连接:保持活动状态
内容类型:text/html;字符集=UTF-8
日期:2012年1月27日星期五20:21:14 GMT
保持活动状态:超时=300,最大=3997
服务器:Apache/2.2.3(CentOS)
传输编码:分块

正如您在上面2个标题中所看到的,仅当压缩关闭时,分块才起作用。我在互联网上搜索了这方面的信息,人们建议降低DeflateBufferSize值。正如您在apache配置中看到的那样,我将该值减少到100字节,但这仍然没有解决问题。DeflateBufferSize设置为100字节意味着在apache中缓冲响应,直到接收到100字节,然后压缩响应

我在看mod_gzip模块,它与旧的Apache1.3捆绑在一起,该模块有一个下面的指令,允许对分块内容进行gzip

是的

有人知道与Apache2.x捆绑的mod_deflate中有这样的指令吗


或者有人知道如何压缩分块内容吗?

我的理解是,为了压缩它,您需要“整个”文件。您可以将其分块发送,也可以压缩发送。mod_gzip_dechunk选项似乎不再存在-请参阅。

事实上,我找到了解决方案。每次我都会创建一个新的GZipOutputStream对象来刷新不同的块。相反,您应该只创建一个GZipOutputStream对象,然后使用该对象压缩响应的所有块。我还在GZipOutputStream周围放了一个包装器。这是我通过谷歌搜索得到的包装纸

public class GZIPFlushableOutputStream extends GZIPOutputStream {

    public GZIPFlushableOutputStream(final OutputStream out) throws IOException {
        // Using Deflater with nowrap == true will ommit headers and trailers
        super(out);
    }

    private static final byte[] EMPTYBYTEARRAY = new byte[0];

    /**
     * Insure all remaining data will be output.
     */
    public void flush() throws IOException {
        /**
         * Now this is tricky: We force the Deflater to flush its data by
         * switching compression level. As yet, a perplexingly simple workaround
         * for
         * 
         * http://developer.java.sun.com/developer/bugParade/bugs/42557 43.html
         */
        def.setInput(EMPTYBYTEARRAY, 0, 0);

        def.setLevel(Deflater.NO_COMPRESSION);
        deflate();

        def.setLevel(Deflater.DEFAULT_COMPRESSION);
        deflate();

        out.flush();
    }
}
等等--您在应用程序中同时使用mod_deflate和compressing吗?
public class GZIPFlushableOutputStream extends GZIPOutputStream {

    public GZIPFlushableOutputStream(final OutputStream out) throws IOException {
        // Using Deflater with nowrap == true will ommit headers and trailers
        super(out);
    }

    private static final byte[] EMPTYBYTEARRAY = new byte[0];

    /**
     * Insure all remaining data will be output.
     */
    public void flush() throws IOException {
        /**
         * Now this is tricky: We force the Deflater to flush its data by
         * switching compression level. As yet, a perplexingly simple workaround
         * for
         * 
         * http://developer.java.sun.com/developer/bugParade/bugs/42557 43.html
         */
        def.setInput(EMPTYBYTEARRAY, 0, 0);

        def.setLevel(Deflater.NO_COMPRESSION);
        deflate();

        def.setLevel(Deflater.DEFAULT_COMPRESSION);
        deflate();

        out.flush();
    }
}