---
date: 2022-02-04 20:06:50-05:00
draft: false
math: false
medium_enabled: true
medium_post_id: ebd510dbf691
tags:
    - Nginx
title: Reducing Network Bandwidth in Nginx with Gzip
---

Browsers that support gzip compression send the header `Accept-Encoding: gzip` in its request and if the webserver supports gzip, then it can send the website data back compressed. Though recently I learned that this isn't setup by default in `nginx`! This post will go over the configuration you'll need to add to `/etc/nginx/nginx.conf` in order to support `gzip` compression. From my experience, enabling `gzip` compression reduced network traffic by 1/4.

Inside of the `server {}` block in `/etc/nginx/nginx.conf` add the following lines:

```nginx
gzip on;
gzip_disable "msie6";

gzip_vary on;
gzip_proxied no-cache no-store private expired auth;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 1024;
gzip_types
	application/atom+xml
	application/geo+json
    application/javascript
    application/x-javascript
    application/json
    application/ld+json
    application/manifest+json
    application/rdf+xml
    application/rss+xml
    application/xhtml+xml
    application/xml
    font/eot
    font/otf
    font/ttf
    image/svg+xml
    text/css
    text/javascript
    text/plain
    text/xml;
```

What each of the commands do:

| Command             | Description                                                  |
| ------------------- | ------------------------------------------------------------ |
| `gzip_disable`      | Disables gzipping of responses for requests with “User-Agent” header fields matching any of the specified regular expressions. |
| `gzip_vary`         | Enables or disables inserting the “Vary: Accept-Encoding” response header field if the directives [gzip](https://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip), [gzip_static](https://nginx.org/en/docs/http/ngx_http_gzip_static_module.html#gzip_static), or [gunzip](https://nginx.org/en/docs/http/ngx_http_gunzip_module.html#gunzip) are active. |
| `gzip_proxied`      | Enables or disables gzipping of responses for proxied requests depending on the request and response. The fact that the request is proxied is determined by the presence of the “Via” request header field. |
| `gzip_comp_level`   | Sets a gzip compression `*level*` of a response. Acceptable values are in the range from 1 to 9. |
| `gzip_buffers`      | Sets the `*number*` and `*size*` of buffers used to compress a response. By default, the buffer size is equal to one memory page. This is either 4K or 8K, depending on a platform. |
| `gzip_http_version` | Sets the minimum HTTP version of a request required to compress a response. |
| `gzip_min_length`   | Sets the minimum length of a response that will be gzipped. The length is determined only from the “Content-Length” response header field. |
| `gzip_types`        | Enables gzipping of responses for the specified MIME types in addition to “`text/html`”. The special value “`*`” matches any MIME type (0.8.29). Responses with the “`text/html`” type are always compressed. |