2012-01-27 3 views
4

Я пытаюсь использовать концепцию bigpipe на нашем веб-сайте. Это означает попытку отправить ответ в кусках, а не отправлять его в целом, чтобы пользователь чувствовал, что страница выполняется быстро. Мне это удается, используя метод flushBuffer для объекта ответа в java. Но теперь, когда я пытаюсь сжать контент с модулем apache mod_deflate, фрагмент потерян.Как сделать Apache mod_deflate и Transfer-encoding: Chunked работать вместе?

Вот конфигурация из апача используется для сжатия Контента

**

Begin 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 

End mod_deflate конфигурации **

Вот заголовок ответа, когда дефляция включена в apache

Connection: Keep-Alive
Content-Encoding: GZIP
Content-Length: 7916
Content-Type: Текст/html; кодировка = UTF-8
Дата: Пт, 27 января 2012 20:11:11 GMT
Keep-Alive: Тайм-аут = 300, макс = 3997
Сервер: Apache
Vary: Accept-Encoding

Response заголовок, когда дефляция отключена в apache

Подключение: Keep-Alive
Тип контента: текст/html; кодировка = UTF-8
Дата: Пт, 27 января 2012 20:21:14 GMT
Keep-Alive: Тайм-аут = 300, макс = 3997
Сервер: Apache/2.2.3 (CentOS)
Transfer- Кодирование: chunked

Как вы можете видеть выше, два заголовка работают, только если сжатие отключено. Я искал в Интернете по этому поводу, и люди предлагали уменьшить значение DeflateBufferSize. Я уменьшил значение до 100 байтов, как вы можете видеть в моей конфигурации apache, но это еще не решило проблему. DeflateBufferSize, установленный в 100 байт, означает, что ответ буферизуется в apache до получения 100 байтов, а затем сжимается.

Я смотрел модуль mod_gzip, который был связан со старым apache 1.3, и этот модуль имеет следующую директиву, которая позволяет загружать фрагментированный контент.

mod_gzip_dechunk Да

Кто-нибудь знает такой директивы в mod_deflate в комплекте с Apache 2.x?

Или кто-нибудь знает, как сжать содержимое, размещенное на нем?

ответ

2

Фактически я нашел решение. Я каждый раз создавал новый объект GZipOutputStream, чтобы очистить разные куски. Вместо этого вы должны создать один объект только GZipOutputStream, а затем использовать этот объект для сжатия всех фрагментов ответа. Также я поместил обертку вокруг GZipOutputStream. Вот обертка, которую я получил от googling.

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.

Смежные вопросы