2

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
John Pangilinan
  • 131
  • 1
  • 1
  • 7
  • Why post your config as a *screenshot*?! – ceejayoz Dec 03 '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 03 '16 at 14:14
  • check out my newly added screenshot to really show how weird it is. – John Pangilinan Dec 03 '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 03 '16 at 14:40
  • Sorry, i have changed the config now – John Pangilinan Dec 03 '16 at 14:43
  • Have you checked this in any other browers? Firefox for instance gives you transferred and size which at least shows its done something. I seem to remember IE does the gzipping transparently so it looks from the dev tools like it hasn't... – tobyd Dec 03 '16 at 14:51
  • check out my screenshot for firefox just now. – John Pangilinan Dec 03 '16 at 14:56
  • I think your Curl output is fairly conclusive (despite what Chrome is saying), If you download your page via `curl -H "Accept-Encoding: gzip" -o mysite.gzip {URL}` is the response just gzip mess? then pipe it through `cat mysite.zip | gunzip` to see if it was encoded? That should at least give you nginxes side of the story. – tobyd Dec 03 '16 at 15:20
  • Doing `cat mysite.gz` gives unreadable characters. `cat mysite.gz | gunzip` gives the proper output. – John Pangilinan Dec 03 '16 at 15:31
  • Had the same problem today. I've reinstalled my server, tried Apache, tried Nignx, tried lots of different configurations. But still couldn't get gzip to work. But just like the the other answers. The problem is actually my testing environment. I was using a VPN when testing. **If I don't connect with the VPN, I'll get gzip files. That's it.** The things that confuse me so much is that I have 3 servers. 2 of them won't do gzip when I use VPN, while the other will always do gzip even if I'm connecting with VPN. – user2875289 Jun 09 '18 at 07:52

3 Answers3

2

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)

alonisser
  • 153
  • 9
  • 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 03 '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 03 '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 03 '16 at 16:07
  • Please check chrome without the "Vary" header, curl was showing correctly even before – alonisser Dec 03 '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 03 '16 at 16:12
  • Check my new screenshot on `chrome` without the `gzip_vary`. Emptied the cache and disabled cache, it is still the same. No zipping. – John Pangilinan Dec 03 '16 at 16:18
  • @JohnPangilinan you are trying the base doc, please try a specific asset like the other screenshots – alonisser Dec 03 '16 at 16:24
  • @JohnPangilinan Also note that this document is text/html, which isn't specified in your gzip types :) – alonisser Dec 03 '16 at 16:27
  • `text/html` is automatically zipped, no need to put it. Check my updated post, i tried it with some assets. – John Pangilinan Dec 03 '16 at 16:33
  • @JohnPangilinan no way I can access it and check this by myself? – alonisser Dec 03 '16 at 16:41
  • @JohnPangilinan also what is the result of nginx -V (notice capital V to show all modules) – alonisser Dec 03 '16 at 16:43
  • Check the updated post `nginx -V` result. – John Pangilinan Dec 03 '16 at 16:55
  • @JohnPangilinan strange, before in the curl you posted an nginx version 1.4.3 and here 1.10 . Is the server you are checking against the same one you are tweaking? – alonisser Dec 03 '16 at 17:28
  • Forgot to mention, i have update my nginx to 1.10.1, to check if gzip will work, but it didn't. Btw i think the problem is with my nginx loaded module, I can't see the `ngx_http_gzip_module` module in the loaded modules. I checked the src installation of the nginx, i think the module's name is `ngx_http_gzip_filter_module`. – John Pangilinan Dec 03 '16 at 17:32
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

John Pangilinan
  • 131
  • 1
  • 1
  • 7
-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!

Shawn
  • 99
  • 3