如何让nginx始终返回gzip后的内容

发布时间:2020-07-05编辑:脚本学堂
如何让nginx始终返回gzip后的内容

gzip压缩是否启用,除了服务器支持外,客户端也要支持。
当客户端发送Accept-Encoding:gzip这个request header,服务器即认为其能接受gzip压缩,就响应一个Content-Encoding:gzip,并发送压缩内容;
假如客户端没有发送 Accept-Encoding,那么服务器就把源代码原样输出。

能不能让客户端无论有没有发送Accept-Encoding,服务器都会发送压缩内容呢?
这样做的好处:
1、进一步节省带宽。
2、防止水平一般的爬虫抓页面偷数据。

经测试,此种做法并不会影响普通用户,因为他们都是用先进的浏览器上网的;
另外,也不会影响主流的搜索引擎,收录仍然会正常。

要做到这点,需要有两个nginx,配置两个虚拟主机也可以,并不用启动两个nginx主进程。

前端nginx:
gzip压缩不在前端nginx进行,前端主要是用来强制修改request header,配置代码:
proxy_set_header Accept-Encoding 'gzip';
这样,后台的nginx无论如何都将接收到Accept- Encoding:gzip,而不管客户端有没有发。

配置代码:
复制代码 代码如下:
upstream www.backend.jb200.com{
   server 127.0.0.1:80;
}
server {
 server_name www.jb200.com;
 listen 80;
 location / {
   proxy_pass http://www.backend.jb200.com;
  include proxy.conf;
   proxy_set_header Accept-Encoding 'gzip';
 } }

注意proxy_pass到的upstream是www.backend.jb200.com,这是在一台机器上配置两个虚拟主机所必需的,否则就像死循环一样了。
如果想用www.jb200.com,可以将前端的listen改成外网ip,后端使用127.0.0.1。

另外一个要注意proxy.conf里最好没有写过proxy_set_header Accept-Encoding,我的proxy.conf默认有将Accept-Encoding设为空的,这会造成配置重复。
但proxy_set_header不会冲突,可以按配置先后顺序生效,我一时忘了是前生效还是后生效,动手测一下便知。

后端nginx:

后端nginx负责压缩,这里要注意gzip的版本,因为nginx是用http1.0方式作代理的,所以gzip的版本就不能是默认的1.1版,需要修改为1.0。

配置代码:
复制代码 代码如下:
server {
 server_name www.backend.jb200.com;
 listen 80;
 location / {
   root /html/;
   gzip on;
   gzip_http_version 1.0;
  }
}

测试:
curl -I http://www.jb200.com
看到返回内容中 Content-Encoding:gzip 即说明配置生效。

不加-I参数试试:curl http://www.jb200.com
打印出一堆乱码