4

私は私たちのウェブサイトでbigpipeのコンセプトを使おうとしています。つまり、ユーザーがそのページが高速であると感じるように、応答を全体として送信するのではなく、チャンクで送信しようとすることを意味します。Javaの応答オブジェクトでflushBufferメソッドを使用することで、これを行うことに成功しました。しかし、apache mod_deflateモジュールを使用してコンテンツを圧縮しようとすると、チャンクが失われます。

これは、コンテンツを圧縮するために使用されるapacheの構成です。

**

mod_deflate構成を開始します

DeflateBufferSize 100
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
DeflateFilterNote Input input_info
DeflateFilterNote Output output_info
DeflateFilterNote Ratio ratio_info
LogFormat '"%r" %{output_info}n/%{input_info}n (%{ratio_info}n%%)' deflate
CustomLog /var/log/httpd/deflate_log deflate

mod_deflateconfigを終了します**

これは、apacheでdeflateがオンになっている場合の応答ヘッダーです。

Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:7916
Content-Type:text / html; charset = UTF-
8日付:2012年1月27日金曜日20:11:11 GMT
キープアライブ:タイムアウト= 300、最大= 3997
サーバー:Apache
Vary:Accept-Encoding

apacheでdeflateがオフになっている場合の応答ヘッダー

Connection:Keep-Alive
Content-Type:text / html; charset = UTF-
8日付:2012年1月27日金曜日20:21:14 GMT
キープアライブ:タイムアウト= 300、最大= 3997
サーバー:Apache / 2.2.3(CentOS)
転送-エンコード:チャンク

上記の2つのヘッダーでわかるように、チャンクは圧縮がオフになっている場合にのみ機能します。私はこれに関してインターネットで検索していました、そして人々はDeflateBufferSize値を減らすことを提案していました。apache configでわかるように、値を100バイトに減らしましたが、それでも問題は解決しませんでした。DeflateBufferSizeを100バイトに設定すると、応答は100バイトが受信されるまでapacheにバッファリングされ、その後圧縮されます。

古いapache1.3にバンドルされているmod_gzipモジュールを見ていましたが、そのモジュールには、チャンクされたコンテンツをgzipで圧縮できる次のディレクティブがあります。

mod_gzip_dechunkはい

誰かがapache2.xにバンドルされているmod_deflateのそのようなディレクティブを知っていますか?

または、チャンクされたコンテンツを圧縮する方法を知っている人はいますか?

4

2 に答える 2

2

実際、私は解決策を見つけました。以前は、異なるチャンクをフラッシュするたびに GZipOutputStream の新しいオブジェクトを作成していました。代わりに、GZipOutputStream のオブジェクトを 1 つだけ作成し、そのオブジェクトを使用して応答のすべてのチャンクを圧縮する必要があります。また、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();
    }
}
于 2012-08-24T21:33:32.303 に答える
1

私の理解では、圧縮するには「全体」のファイルが必要です。チャンクで送信するか、圧縮して送信することができます。mod_gzip_dechunk オプションはもう存在しないようです。mod_deflate のドキュメントを参照してください。

于 2012-05-26T19:16:56.300 に答える