Configure Gzip Compression on Apache and Nginx

Updated on November 17, 2021
Configure Gzip Compression on Apache and Nginx header image

Introduction

Compressing content before sending it over the Internet reduces the size of transmitted data and adjusts the time taken to load the content. Gzip compression makes web applications faster by shrinking web pages, scripts, and stylesheets to smaller sizes before serving them to a visitor on your server.

When a user calls your website through a web browser, the server responds by delivering the requested file. But since bigger files take longer to load, Gzip compression makes the requested files smaller for the browser to decompress before serving them to the user.

In this article, you will enable and configure Gzip compression on Apache and Nginx running on either a Debian or RHEL based server distribution like Ubuntu, CentOS, respectively.

Apache

Apache supports Gzip compression through the mod_deflate module referenced by DEFLATE. By default, the module is turned on, but in any case, you should check whether it’s available with the following commands.

On Debian or Ubuntu

$ apache2ctl -t -D DUMP_MODULES | grep deflate

On CentOS

$ httpd -t -D DUMP_MODULES | grep deflate

Your output should be similar to:

deflate_module (shared)

Else, enable DEFLATE

$ sudo a2enmod deflate    

Enable Compression for Apache

Open your Apache virtual host file and enable gzip compression entries line by line. For example, to compress HTML, text, XML, CSS, and Javascript content types, add the following line to your virtual host or .htaccess file.

AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript

text/html will compress HTML files, text/plain compresses all text files, text/xml will compress xml files and application/javascript works on Javascript files.

You can also enable compression on specific file extensions by using the SetOutputFilter directive.

<files *.html>
    SetOutputFilter DEFLATE
</files>

To enable server-wide compression for all hosted web pages, add the following code to your apache2.conf or httpd.conf.

<IfModule mod_deflate.c>
# Compress HTML
AddOutputFilterByType DEFLATE text/html

# Compress Text Files
AddOutputFilterByType DEFLATE text/plain

# Compress CSS
AddOutputFilterByType DEFLATE text/css

# Compress JavaScript
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/x-javascript

# Compress Images
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE image/x-icon

# Compress Fonts
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE application/x-font
AddOutputFilterByType DEFLATE application/x-font-opentype
AddOutputFilterByType DEFLATE application/x-font-otf
AddOutputFilterByType DEFLATE application/x-font-truetype
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE font/opentype
AddOutputFilterByType DEFLATE font/otf
AddOutputFilterByType DEFLATE font/ttf

# Compress XML Files
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE text/xml

</IfModule>

Nginx

Gzip is enabled on Nginx by default, but in any case, you should open the main configuration file nginx.conf and confirm that the gzip section entries are uncommented.

$ cat /etc/nginx/nginx.conf | grep gzip

##
# Gzip Settings
##

gzip on;

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

Enable Compression for Nginx

To turn on Gzip compression, simply add on to the gzip directive in the main Nginx configuration file.

$ sudo nano /etc/nginx/nginx.conf

gzip on;

Add file types to compress.

gzip_types text/plain text/html /text/css application/xml application/javascript;

Set the minimum length of a response to compress, the default is 20 bytes.

gzip_min_length 500;

Save and close the file.

Your Nginx Configuration file should now look similar to the one below.

gzip on;
gzip_types text/plain text/html /text/css text/javascript application/xml application/javascript;    
gzip_min_length 500;