nginx is not using gzip to talk to backend servers

Our web servers are running IIS 7 and are configured to compress dynamic and static content. When I hit these servers directly, gzip compression works.

I recently placed nginx in front of them, and gzip compression has stopped. I was able to work around this by explicitly enabling gzip compression on nginx itself, but that seems a little inefficient considering I have half a dozen backends and only one active nginx box.

It appears that nginx is stripping out the Accept-Encoding header. Does anyone have any advice for how to 'correct' this behavior?

A sample configuration:

upstream backend {
  server 127.0.0.1:8080;
}

server {
  listen   80;
  proxy_set_header        Host            $host;
  proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

  location / {
    proxy_pass http://backend;
  }
}

Nginx is a HTTP/1.0 reverse proxy, gzip compression was not in the HTTP specification until HTTP/1.1.

Thus nginx will not send gzip accept-encoding header because it simply doesn't accept it. The proper way to implement gzip handling in nginx is to either talk fastcgi to the backend or to gzip using nginx.


I'm not sure since how long, but NGINX now DOES support HTTP/1.1 for it's backends, it's just not a standard feature. You can enable it by setting proxy_http_version. Very useful for when your backend servers are on vhosts. For example:

location / {
  proxy_set_header X-Real-IP $remote_addr;
  proxy_pass http://my-backend-vhost.example.com/;
  proxy_http_version 1.1;
}

Ref: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_http_version