我有一个暴露在互联网上的 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 交互,无论 iis 执行什么操作。
调整哑剧类型以适合你的口味。