2012-01-27 7 views
4

私は私たちのウェブサイトでbigpipeのコンセプトを使用しようとしています。つまり、全体を送信するのではなく、チャンクで応答を送信しようとするため、ユーザーはページが高速であると感じます。私は、javaのresponseオブジェクトに対してflushBufferメソッドを使用して成功しています。しかし、今、私はApacheのmod_deflateモジュールでコンテンツを圧縮しようとすると、チャンクは失われます。ここApache mod_deflateとTransfer-encodingを作るにはどうすればいいですか?

**

ここ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_deflateをコンフィグ**

を開始コンテンツを圧縮するために使用アパッチから構成は、応答ヘッダが場合でありますデポレートはアパート内でオンになります

接続:キープアライブ
コンテンツエンコード:gzipで
のContent-Length:7916
のContent-Type:text/htmlの。文字セット= UTF-8
日:金、2012年1月27日午後08時11分11秒GMT
がキープアライブ:タイムアウト= 300、最大= 3997
サーバー:Apacheの
は異なります受け入れ-エンコーディングを

レスポンスをヘッダーが収縮がapacheでオフになっているとき

接続:キープアライブ
コンテンツタイプ:text/html;文字セット= UTF-8
日:金、2012年1月27日夜08時21分14秒GMT
がキープアライブ:タイムアウト= 300、最大= 3997
サーバー:Apacheの/ 2.2.3(CentOSの)
Transfer-エンコード:チャンク

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

古いApache 1.3にバンドルされたmod_gzipモジュールを見ていて、そのモジュールには、チャンクされたコンテンツをgzipできるようにする次の指示があります。

mod_gzip_dechunkはい

誰には、Apache 2.xのにバンドルmod_deflateを、そのような指示を知っていますか?

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

答えて

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(); 
    } 
} 
+1

待機中 - アプリケーションでmod_deflateと圧縮の両方を使用していましたか? –

1

私の理解では、圧縮するために「全体」ファイルが必要です。あなたはチャンクで送信することができますまたは圧縮して送信します。 mod_gzip_dechunkオプションはもう存在しません - mod_deflate documentationを参照してください。

関連する問題