1

As the title said, Nginx Gzip is not working, I have tried many configurations scattered on the internet none have worked, I'm really frustrated when simple things don't work.

gzip.conf:

gzip on;
gzip_disable "msie6";
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_min_length 256;
gzip_types
    text/plain
    text/css
    application/json
    application/javascript
    application/x-javascript
    text/xml
    application/xml
    application/xml+rss
    text/javascript
    application/vnd.ms-fontobject
    application/x-font-ttf
    font/opentype
    image/svg+xml
    image/x-icon;

Chrome:

enter image description here

enter image description here

Chrome Audit: enter image description here

Curl: enter image description here

I have cleared the cache and everything still the same.

=======================

UPDATE:

I have tested for gzip compression at

http://checkgzipcompression.com/

and gave me:

enter image description here

but in Chrome it shows:

enter image description here

Firefox:

enter image description here

removed gzip_vary

* Hostname was NOT found in DNS cache
*   Trying 192.168.200.240...
* Connected to 192.168.200.240 (192.168.200.240) port 80 (#0)
> HEAD /js/main.js HTTP/1.1
> User-Agent: curl/7.35.0
> Host: 192.168.200.240
> Accept: */*
> Accept-Encoding: deflate, gzip
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Date: Sat, 03 Dec 2016 16:25:34 GMT
Date: Sat, 03 Dec 2016 16:25:34 GMT
< Content-Type: application/javascript
Content-Type: application/javascript
< Last-Modified: Fri, 02 Dec 2016 03:20:46 GMT
Last-Modified: Fri, 02 Dec 2016 03:20:46 GMT
< Connection: keep-alive
Connection: keep-alive
< ETag: W/"5840e88e-18ce"
ETag: W/"5840e88e-18ce"
* Server nginx is not blacklisted
< Server: nginx
Server: nginx
< Expires: Sun, 03 Dec 2017 16:25:34 GMT
Expires: Sun, 03 Dec 2017 16:25:34 GMT
< Cache-Control: max-age=31536000
Cache-Control: max-age=31536000
< Content-Encoding: gzip
Content-Encoding: gzip

<
* Connection #0 to host 192.168.200.240 left intact

Without vary on Chrome: enter image description here

nginx -V

nginx version: nginx/1.10.1
built with OpenSSL 1.0.1f 6 Jan 2014
TLS SNI support enabled
configure arguments: --with-cc-opt='-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2' --with-ld-opt='-Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now' --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-pcre-jit --with-ipv6 --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_flv_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_secure_link_module --with-http_sub_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-stream=dynamic --with-stream_ssl_module --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/headers-more-nginx-module --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-auth-pam --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-cache-purge --add-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-dav-ext-module --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-development-kit --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-echo --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/ngx-fancyindex --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nchan --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-lua --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-upload-progress --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/nginx-upstream-fair --add-dynamic-module=/build/nginx-JCHwcf/nginx-1.10.1/debian/modules/ngx_http_substitutions_filter_module
  • Why post your config as a screenshot?! – ceejayoz Dec 3 '16 at 14:06
  • Well I was frustrated and was having a hard time copying using nano so I've just screenshot it instead. Anyway, can you help me resolve this? – John Pangilinan Dec 3 '16 at 14:14
  • check out my newly added screenshot to really show how weird it is. – John Pangilinan Dec 3 '16 at 14:25
  • 3
    @JohnPangilinan: Please don't post configs as screen shots. If nano doesn't work, try less or more or another editor. No one wants to manually copy your config e.g. to test things out or to answer. – Sven Dec 3 '16 at 14:40
  • Sorry, i have changed the config now – John Pangilinan Dec 3 '16 at 14:43
1

Looks like your server is gzip enabled (See the curl response and checkgzipcompression result). But since you are using the gzip_vary on; directive you get the Vary: Accept-Encoding header.

So basically the server allows the client to decide https://www.maxcdn.com/blog/accept-encoding-its-vary-important/

What encoding to use. if it already has the uncompressed file, it won't get a gzipped one (Seems strange to me also, but that's what the knowledgeable looking article states).

I know this isn't consistent with what you see the "hard refresh cache cleaning the page". But this a clue, try setting it off, restart nginx and check again (And of course verify gzip.conf is actually readed and used by nginx)

  • Yes it is enabled, but it is not showing that it is zipped in the response. I have disabled caching temporarily so that I would have a fresh copy of the file from the server and not the cached one, sadly the fresh file was not zipped, it's noticeable in the size and the response headers not having Content-Encoding: gzip. And yeah the gzip.conf is loaded, I've tested it by putting in random character to make an error and tested nginx -t and the error occured on that file. Also I have also restarted the server, not just the web server. – John Pangilinan Dec 3 '16 at 15:46
  • @JohnPangilinan so why are the different services shows it's gzip. including curl.. What happens when you remove the "Vary" directive? – alonisser Dec 3 '16 at 15:51
  • I don't know, and it really bugs me, i have updated my post. Check out the request without the gzip_vary. – John Pangilinan Dec 3 '16 at 16:07
  • Please check chrome without the "Vary" header, curl was showing correctly even before – alonisser Dec 3 '16 at 16:10
  • And what is turned my cache off? the only result I'll trust is having the console open (f12) and then right click on reload and choose "empty cache and hard reload" – alonisser Dec 3 '16 at 16:12
1

It was my antivirus all along, similar issue to this post: nginx gzip enabled but not not gzipping

I thought it was not because I have temporarily disabled my anti-virus while testing, but i think the antivirus uncompresses it even it is disabled.

And also that, even I have the antivirus on, other sites I have checked are gzipped, weird, so I thought it was really not my antivirus.

But I have tested it in a fresh VM with only chrome installed, and it shows gzip also in my mobile device via remote debugging.

Then i have installed the antivirus on the VM then the Content-Encoding: gzip was gone.

Also I have checked on wireshark that the content is really gzipped. But somehow the antivirus uncompresses it.

Both version of chrome in my workspace and in the VM are the same.

Chrome Version 54.0.2840.99

-1

I know its been a long time since this was answered.. Yes. Its the Antivirus software that uncompressed the content before transmission. In order to trick the Antivirus software into maintaining the GZIP content, I added the same Content-Encoding header to nginx with a minor twist.

gzip on;
add_header Content-Encoding "gzip2";

This way, I didnt have to stop the Antivirus from running in the background. I hope this would help someone out there who has the same issue. It all started with IIS not gzipping content which drove me to add NginX which did not gzip the content either. It was the Antivirus all alone!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.