Gzip-сжатие Tomcat8 для CSS, JS

Я использую tomcat8 и пытаюсь имитировать GZIP-сжатие CSS и JS. Я добавил запись в server.xml и следует

 <Connector port="8088" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" compression="on"
     compressionMinSize="2048"
     noCompressionUserAgents="gozilla, traviata"
     compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,text/json,application/x-javascript,application/javascript,application/json" />

И на моей странице html я включил скрипт следующим образом

<script type="text/javascript" src="extjs/ext-all-debug.js"></script> 

Но при доступе к странице сжатия не происходит и респосный заголовок получен следующим образом.

Remote Address:[::1]:8088
Request URL:http://localhost:8088/test/extjs/ext-all-debug.js
Request Method:GET
Status Code:200 OK

Заголовки ответа

view source
Accept-Ranges:bytes
Content-Length:4585183
Content-Type:application/javascript
Date:Wed, 03 Jun 2015 00:34:12 GMT
ETag:W/"4585183-1427778288000"
Last-Modified:Tue, 31 Mar 2015 05:04:48 GMT
Server:Apache-Coyote/1.1

Заголовки запроса

view source
Accept:*/*
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:localhost:8088
Referer:http://localhost:8088/test/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.81 Safari/537.36

Пожалуйста, помогите мне найти, что здесь пошло не так. То же самое происходит, когда я делаю эту настройку на удаленном сервере.


person Shahul Dhasthagir    schedule 03.06.2015    source источник


Ответы (3)


Я добавил атрибут useSendfile со значением false.

В руководстве сказано:

(bool) Используйте этот атрибут, чтобы включить или отключить возможность отправки файла. Значение по умолчанию верно. Обратите внимание, что использование sendfile отключит любое сжатие, которое Tomcat мог бы в противном случае выполнить для ответа.

Мой tomcat8 теперь сжимает большой html-файл.

Мой разъем:

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
            useSendfile="false"
            compression="on"
            compressionMinSize="2048"
            noCompressionUserAgents="gozilla, traviata"
            compressableMimeType="text/html,text/xml,text/plain,text/css"
           redirectPort="8443" />

Информация о скрипаче:

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Accept-Ranges: bytes
ETag: W/"560012-1444044890000"
Last-Modified: Mon, 05 Oct 2015 11:34:50 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Tue, 06 Oct 2015 08:53:53 GMT
person Rob Lassche    schedule 06.10.2015

Я столкнулся с той же проблемой, работая над приложением angularjs с tomcat8. У него было несколько больших файлов js. Установка для useSendfile значения «false» частично помогла, в том смысле, что некоторые файлы были сжаты, но не все из них. В ходе дальнейших исследований я обнаружил, что необходимо добавить «application/javascript» также в сжимаемыйMimeType. Это сработало для всех файлов javascript.

Из документации tomcat8

Значение представляет собой разделенный запятыми список типов MIME, для которых может использоваться HTTP-сжатие. Значение по умолчанию: text/html, text/xml, text/plain, text/css, text/javascript, application/javascript.

person Arun MR    schedule 01.08.2016

К сведению для всех, кто пытается использовать атрибут Compression="force" в соединителе. "force" используется только если клиент поддерживает сжатие.

Обратите внимание, что принудительно выполняется после проверки заголовка "Content-Encoding"...

 /**
 * Check if the resource could be compressed, if the client supports it.
 */
private boolean isCompressible() {

    // Check if content is not already compressed
    MessageBytes contentEncodingMB = response.getMimeHeaders().getValue("Content-Encoding");

    if ((contentEncodingMB != null) &&
            (contentEncodingMB.indexOf("gzip") != -1 ||
                    contentEncodingMB.indexOf("br") != -1)) {
        return false;
    }

    // If force mode, always compress (test purposes only)
    if (compressionLevel == 2) {
        return true;
    }
    ...

Источник

person Dan    schedule 07.09.2018