Nginx 反向代理 Gzip 到客户端

Nginx 反向代理 Gzip 到客户端

我有一个暴露在互联网上的 IIS 6.0 Web 服务器,它无法可靠地执行 Gzipping。我知道它很旧,但对于这个实例,我只能使用它。

我想要做的是将 Nginx(或类似服务器)放在 IIS 前面作为反向代理和缓存服务器来加速网站。但是我不确定是否可以让 nginx 服务器从自身 gzip 压缩到 Web 浏览器。如果 IIS 将经过 Gzip 压缩的请求传回 nginx,它们会顺利返回到浏览器。

gzip                on;
gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css;
gzip_vary           on;

location / {
    proxy_set_header x-real-IP $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header host $host;
    proxy_pass http://192.168.5.37;
}

HTTP 请求(/css/components.css)

GET /css/components.css HTTP/1.1
Host: www.mydomain.co.uk
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Accept: text/css,*/*;q=0.1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6

HTTP 响应(/css/components.css)

HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 14:26:08 GMT
Content-Type: text/css
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Last-Modified: Sat, 22 Aug 2015 09:36:54 GMT
ETag: W/"07f8614bedcd01:8beb"
X-Powered-By: ASP.NET

我是否遗漏了某个神奇的参数来告诉它压缩 nginx 中的文件?

谢谢!

院长

答案1

您可以将gzip_proxied any;指令添加到您的配置文件中。

编辑:

我的测试:
我在我的机器(192.168.122.1)上设置了一个简单的 HTTP 服务器(本身无法进行 gzip 压缩)python -m http.server 8080。当我请求它时,我得到了:

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate' http://192.168.122.1:8080/
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.5.0
Date: Thu, 22 Oct 2015 17:41:39 GMT
Content-type: text/html; charset=utf-8
Content-Length: 1197

我使用 nginx 设置了代理(192.168.122.224)

gzip_min_length     1000;
gzip_buffers        4 8k;
gzip_http_version   1.0;
gzip_disable        "msie6";
gzip_types          text/plain text/css;
gzip_vary           on;

location / {
    proxy_set_header x-real-IP $remote_addr;
    proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    proxy_set_header host $host;
    proxy_pass http://192.168.122.1:8080;
}

当我使用代理请求同样的东西时,我得到了

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate http://192.168.122.224/
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 17:46:08 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 1197
Connection: keep-alive

然后我添加到代理配置中

gzip on;
gzip_proxied any;

我得到了

[pat@morbier ~]$ curl -I -H 'Accept-Encoding: gzip,deflate' http://192.168.122.224/
HTTP/1.1 200 OK
Server: nginx/1.8.0
Date: Thu, 22 Oct 2015 17:47:54 GMT
Content-Type: text/html; charset=utf-8
Connection: keep-alive
Content-Encoding: gzip

如果您不带 -I 参数执行 curl,也可以看到它(因此获取了整个页面),在我的情况下,它变成了终端上显示的二进制文件,这进一步证明了它已被压缩。当我 curl 常规网站(未进行 gzip 压缩)时,我获取了网页内容(HTML)。

编辑2:
实际上,只有启用了您的选项后它才有效,似乎不需要 gzip_proxied。
啊,您请求时没有传递“Accept-Encoding: gzip,deflate”标头(我猜您使用的是 telnet)。在这种情况下它将不起作用,因为您没有告诉服务器您可以处理 gzip 编码的二进制文件。
请尝试使用 curl。

答案2

是的,这肯定可以做到。我无意中发现了这一点(在我的例子中,iis 8.5,它的 gzip 压缩效果非常好,直到我将 nginx 反向代理放在它前面,从浏览器的角度来看 gzip 就丢失了)。

此处显示的配置:

nginx:代理期间服务器上的 gzip 丢失

将让您的客户端与 nginx 进行 gzip 交互,无论 iis 执行什么操作。

调整哑剧类型以适合你的口味。

相关内容