Gzip

By enabling compression in Envoy you can save some network bandwidth, at the expense of increased processor usage.

Envoy supports compression and decompression for both requests and responses.

This sandbox provides an example of response compression and request decompression served over HTTP. Although HTTPS is not demonstrated, compression can be used for this also.

The sandbox covers three scenarios:

  • compression of files from an upstream server

  • decompression of files from a downstream client

  • compression of Envoy’s own statistics

Step 1: Start all of our containers

Change to the examples/gzip directory and bring up the docker composition.

$ pwd
envoy/examples/gzip
$ docker-compose build --pull
$ docker-compose up -d
$ docker-compose ps
Name                 Command                        State   Ports
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
gzip_envoy-stats_1   /docker-entrypoint.sh /usr ... Up      0.0.0.0:10000->10000/tcp,:::10000->10000/tcp, 0.0.0.0:9901->9901/tcp,:::9901->9901/tcp, 0.0.0.0:9902->9902/tcp,:::9902->9902/tcp
gzip_service_1       python3 /code/service.py       Up

Step 2: Test Envoy’s compression of upstream files

The sandbox is configured with two endpoints on port 10000 for serving upstream files:

  • /file.txt

  • /file.json

Only /file.json is configured to be compressed.

Use curl to check that the response from requesting file.json contains the content-encoding: gzip header.

You will need to add an accept-encoding: gzip request header.

$ curl -si -H "Accept-Encoding: gzip" localhost:10000/file.json | grep "content-encoding"
content-encoding: gzip

As only files with a content-type of application/json are configured to be gzipped, the response from requesting file.txt should not contain the content-encoding: gzip header, and the file will not be compressed:

$ curl -si -H "Accept-Encoding: gzip" localhost:10000/file.txt | grep "content-encoding"

Step 3: Test Envoy’s decompression of downstream files

The sandbox is configured with one endpoint on port 10000 for uploading downstream files:

  • /upload

Use curl to get compressed file file.gz

$ curl -s -H "Accept-Encoding: gzip" -o file.gz localhost:10000/file.json

Use curl to check that the response from uploading file.gz contains the decompressed-size: 10485760 header.

You will need to add an content-encoding: gzip request header.

$ curl -si -H "Content-Encoding: gzip" localhost:10000/upload --data-binary "@file.gz" | grep "decompressed-size"
decompressed-size: 10485760

Step 4: Test compression of Envoy’s statistics

The sandbox is configured with two ports serving Envoy’s admin and statistics interface:

  • 9901 exposes the standard admin interface

  • 9902 exposes a compressed version of the admin interface

Use curl to make a request for uncompressed statistics on port 9901, it should not contain the content-encoding header in the response:

$ curl -si -H "Accept-Encoding: gzip" localhost:9901/stats/prometheus | grep "content-encoding"

Now, use curl to make a request for the compressed statistics:

$ curl -si -H "Accept-Encoding: gzip" localhost:9902/stats/prometheus | grep "content-encoding"
content-encoding: gzip

See also

Gzip Compression API

API and configuration reference for Envoy’s gzip compression.

Gzip Decompression API

API and configuration reference for Envoy’s gzip decompression.

Compression configuration

Reference documentation for Envoy’s compressor filter.

Decompression configuration

Reference documentation for Envoy’s decompressor filter.

Envoy admin quick start guide

Quick start guide to the Envoy admin interface.