Nginx 在通过负载均衡器时不发送经过 gzip 压缩的资产

Nginx 在通过负载均衡器时不发送经过 gzip 压缩的资产

我有一个充当负载均衡器的 nginx 服务器,它将请求委托给其他应用程序服务器。

当我尝试直接向应用程序服务器请求资产时,该资产以其 gzip 版本提供,示例:

➜ ~ curl -IH 'Accept-Encoding: gzip, deflate' http://application/asset.css HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Thu, 15 Sep 2016 14:13:03 GMT Content-Type: text/css Content-Length: 35038 Connection: keep-alive Content-Encoding: gzip Expires: Thu, 31 Dec 2037 23:55:55 GMT Cache-Control: max-age=315360000 Cache-Control: public

而对负载均衡器发出相同的请求,则返回资产的非压缩版本。 ➜ ~ curl -IH 'Accept-Encoding: gzip, deflate' https://load-balancer/asset.css HTTP/1.1 200 OK Server: nginx/1.6.2 Date: Thu, 15 Sep 2016 14:16:15 GMT Content-Type: text/css Content-Length: 240442 Connection: keep-alive Expires: Thu, 31 Dec 2037 23:55:55 GMT Cache-Control: max-age=315360000 Cache-Control: public Accept-Ranges: bytes

这里是我的 LB 配置: location / { client_max_body_size 10M; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-Proto https; # if use ssl proxy_redirect off; proxy_pass http://application; }

提前致谢

答案1

解决了!

我自己发现,从负载均衡器发送到上游(应用程序服务器)的请求是在 HTTP/1.0 中完成的,而应用程序端的 nginx 服务器由于默认参数,仅当请求是 HTTP >= 1.1 时才压缩文件。

http://nginx.org/en/docs/http/ngx_http_gzip_module.html#gzip_http_version

答案2

还有另一种方法可以解决这个问题。您可以为代理到上游的连接设置更高的 HTTP 协议版本。可以通过此参数完成:proxy_http_version 1.1;

这将是一个更好的选择,因为这样你可以受益于许多 HTTP/1.1 的优势,例如持久连接额外的新状态代码

例如这是我自己的设置块:

server {
    listen       80;
    server_name  domain.tld;
    location / {
         include proxy_params;
         proxy_http_version 1.1;
         proxy_pass http://my-up-stream;
    }
}

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

相关内容