Jetty with gzip compression

Karaf uses the Jetty web server to deliver the website resources. This does not use compression by default, but this can be activated.

For Karaf installation files downloaded after 28.09.2021 (BPC 3.4.x and BPC 4.0.0), the jetty.xml listed below has already been adapted.

Activation

In order for the Karaf/Jetty to deliver the website resources in compressed form, the following fragment must be inserted at the end of [karaf]/etc/jetty.xml ein GzipHandler installiert werden. Dazu in der <INLINE_CODE_1/>`.

The Karaf must be started after adapting jetty.xml.

[karaf]/etc/jetty.xml
<?xml version="1.0"?>
<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_0.dtd">
<Configure id="Server" class="org.eclipse.jetty.server.Server">

    ...

    <!-- ====================== -->
    <!-- Insert the GzipHandler -->
    <!-- ====================== -->
    <Call name="insertHandler">
        <Arg>
            <New id="GzipHandler" class="org.eclipse.jetty.server.handler.gzip.GzipHandler">
                <Set name="minGzipSize"><Property name="jetty.gzip.minGzipSize" default="1024"/></Set>
                <Set name="checkGzExists"><Property name="jetty.gzip.checkGzExists" default="false"/></Set>
                <Set name="compressionLevel"><Property name="jetty.gzip.compressionLevel" default="-1"/></Set>
                <Set name="inflateBufferSize"><Property name="jetty.gzip.inflateBufferSize" default="0"/></Set>
                <Set name="syncFlush"><Property name="jetty.gzip.syncFlush" default="false" /></Set>
                <Set name="excludedAgentPatterns">
                    <Array type="String">
                        <!-- IE 6 has known bugs related to GZIP compression -->
                        <Item><Property name="jetty.gzip.excludedUserAgent" default=".*MSIE.6\.0.*"/></Item>
                    </Array>
                </Set>
                <Set name="includedMethodList"><Property name="jetty.gzip.includedMethodList" default="GET" /></Set>
                <Set name="excludedMethodList"><Property name="jetty.gzip.excludedMethodList" default="" /></Set>
                <!--
                    <Set name="includedMethods">
                        <Array type="String">
                            <Item>GET</Item>
                        </Array>
                    </Set>
                    <Set name="includedPaths">
                        <Array type="String">
                            <Item>/*</Item>
                        </Array>
                    </Set>
                    <Set name="excludedPaths">
                        <Array type="String">
                            <Item>*.gz</Item>
                        </Array>
                    </Set>
                    <Call name="addIncludedMimeTypes">
                        <Arg>
                            <Array type="String">
                                <Item>some/type</Item>
                            </Array>
                        </Arg>
                    </Call>
                    <Call name="addExcludedMimeTypes">
                        <Arg>
                            <Array type="String">
                                <Item>some/type</Item>
                            </Array>
                        </Arg>
                    </Call>
                -->
            </New>
        </Arg>
    </Call>
</Configure>

Syntax

Die in der jetty.xml verwendete Syntax ist ein wenig Gewöhnungsbedürftig. Zwei Sachen sind hierbei essentiell:

  1. Die einzelnen XML-Elemente werden zur Laufzeit direkt in Java Aufrufe umgesetzt. Deshalb kann es nicht schaden, wenn man sich mit der Jetty-XML-Syntax vertraut macht.

  2. Die einzelnen XML-Elemente beziehen sich alle auf die Java Methoden der GzipHandler Klasse. Die oben gesetzten Werte sind nicht alle die gesetzt werden können. Ein Blick in die GzipHandler JavaDoc kann nicht schaden.

Wichtige Konfigurationen des GzipHandler

  • minGzipSize Die Mindestgröße in Bytes, die eine Antwort haben muss, bevor die Komprimierung ausgelöst wird. Ist oben auf 1024 Bytes gesetzt. Das bedeutet, dass Antworten die kleiner als 1024 Bytes sind, nicht komprimiert werden.

  • compressionLevel Der Gzip Kompressionslevel: 0-9, mit -1 als Default was derzeit dem Kompressionslevel 6 entspricht. Dies ist ein guter Kompromiss zwischen Geschwindigkeit und Größe der Antwort.

Voraussetzung dass die jetty.xml zum Einsatz kommt

Sicherstellen, dass in der [karaf]/etc/org.ops4j.pax.web.cfg folende Zeile enthalten ist.

org.ops4j.pax.web.config.file=${karaf.etc}/jetty.xml

Keywords: