nginx compression-at-edge (in front of a reverse proxy) compresses some content, not other ?

BenDJ nginx-forum at nginx.us
Wed Apr 28 05:12:13 MSD 2010


I've an nginx + varnish + apache2 stack.  Nginz server as redirector, ssl handshake, and gzip compression.  Varnish serves as a reverse-proxy, and apache 'just' hosts apps & serves content.

I'm trying to get gzip compression behaving properly.  I'm getting intermittent results -- some content seems to be gzipped, some not.

I'm looking for some help figuring out WHERE the problem lies, and what to do to fix it.

In nginx conf, I've,

	[code]
...
	http {
		...
		gzip              on;
		gzip_http_version 1.0;
		gzip_comp_level   9;
		gzip_proxied      any;
		gzip_buffers      16 8k;
		gzip_min_length   0;
		gzip_types text/plain text/css text/xml text/javascript application/x-javascript;
		gzip_disable "MSIE [1-6].(?!.*SV1)";
		gzip_vary         on;
	
		upstream varnish {
			server 127.0.0.1:8090 weight=10 max_fails=3 fail_timeout=15s;
		}
	
		server {
			listen                    x.y.z.w:443;
			...
			location / {
				proxy_pass             http://varnish;
				proxy_redirect         off;
				proxy_set_header       Host $host;
				proxy_set_header       X-Real-IP $remote_addr;
				proxy_set_header       X-Forwarded-For $proxy_add_x_forwarded_for;
				proxy_set_header       X-Client-Verify SUCCESS;
				proxy_set_header       X-SSL-Subject $ssl_client_s_dn;
				proxy_set_header       X-SSL-Issuer  $ssl_client_i_dn;
			}
		}
		...
[/code]


In varnish config, I've a

[code]
	...
	if (req.http.Accept-Encoding) {
		remove req.http.Accept-Encoding;
	}
	...
[/code]


clause, since the compression is to be done only at the nginx 'edge'.

Apache's compression (gzip, default, or otherwise), is completely disabled.

Atm, a check of my test site with YSlow complains that .js's are NOT being compressed.  Checking with LiveHTTPHeaders Firefox plugin, shows, e.g., the .js in question NOT being gzipped, but a .gif *is*, e.g.

	[code]
...
	----------------------------------------------------------

	https://my.site.com/main/apostrophePlugin/js/jquery.keycodes-0.2.js

	

	GET /main/apostrophePlugin/js/jquery.keycodes-0.2.js HTTP/1.1
	Host: my.site.com
	User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.4) Gecko/20100417
	Accept: */*
	Accept-Language: en-us,en;q=0.5
	Accept-Encoding: gzip,deflate
	Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
	Keep-Alive: 115
	Connection: keep-alive
	Referer: https://my.site.com/main/
	Cookie: SESS6fa8cdc2d7064704bbda0c83e2c2588c=94889db68945e19ed6f666b7e00cdd36; symfony=3KOH8Qk0hV%2C%2CvXLi0PK5YmdenP1
	If-Modified-Since: Tue, 27 Apr 2010 18:18:18 GMT
	If-None-Match: "362e4-1008-4853810064180"
	Authorization: Digest username="admin", realm="AUTH my.site.com", nonce="5GopBDmFBAA=99f7be8796e018dde459a07178393d235366ecd9", uri="/main/apostrophePlugin/js/jquery.keycodes-0.2.js", algorithm=MD5, response="b04cb995cd1f86a67197aab3b5a5dbc9", qop=auth, nc=000001c9, cnonce="9dbeaefee4d57b12"
	Cache-Control: max-age=0

	

	HTTP/1.1 304 Not Modified
	Server: nginx/0.8.35
	Date: Wed, 28 Apr 2010 00:39:48 GMT
	Connection: keep-alive
	Etag: "362e4-1008-4853beaefee80"
	Expires: Sat, 01 May 2010 00:39:48 GMT
	Cache-Control: max-age=259200
	Content-Length: 0
	X-Varnish: 940462008
	Age: 0
	Via: 1.1 varnish

	----------------------------------------------------------

	https://my.site.com/apostrophePlugin/images/a-special-blank.gif

	GET /apostrophePlugin/images/a-special-blank.gif HTTP/1.1
	Host: my.site.com
	User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.4) Gecko/20100417
	Accept: image/png,image/*;q=0.8,*/*;q=0.5
	Accept-Language: en-us,en;q=0.5
	Accept-Encoding: gzip,deflate
	Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
	Keep-Alive: 115
	Connection: keep-alive
	Referer: https://my.site.com/main/
	Cookie: SESS6fa8cdc2d7064704bbda0c83e2c2588c=94889db68945e19ed6f666b7e00cdd36; symfony=3KOH8Qk0hV%2C%2CvXLi0PK5YmdenP1

	HTTP/1.1 404 Not Found
	Server: nginx/0.8.35
	Date: Wed, 28 Apr 2010 00:39:48 GMT
	Content-Type: text/html; charset=iso-8859-1
	Transfer-Encoding: chunked
	Connection: keep-alive
	Vary: Accept-Encoding, accept-language,accept-charset
	Content-Language: en
	X-Varnish: 940462009 940461993
	Age: 87
	Via: 1.1 varnish
	Content-Encoding: gzip
	----------------------------------------------------------
	...
[/code]


where, iiuc, the presence/absence of "Content-Encoding: gzip" defines whether or not the item in question was succesfully gzipped.

Any ideas why/where the .js is not getting gzipped?

Thanks,

Ben

Posted at Nginx Forum: http://forum.nginx.org/read.php?2,80148,80148#msg-80148




More information about the nginx mailing list