Author: admin | Category: Nginx
Comments: 评论关闭
一般来说,gzip压缩是否启用,除了服务器支持外,客户端也要支持。当客户端发送Accept-Encoding:gzip这个request header,服务器即认为其能接受gzip压缩,就响应一个Content-Encoding:gzip,并发送压缩内容;假如客户端没有发送Accept-Encoding,那么服务器就把源代码老老实实地打印出去。

但这里就有个怪点子,能不能让客户端无论有没有发送Accept-Encoding,服务器都会发送压缩内容呢?

这有几个好处:

1、进一步节省带宽。
2、防止水平一般的爬虫抓页面偷数据。

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

要做到这点,需要有两个nginx,但也有办法配置两个虚拟主机就可以,不用启动两个nginx主进程。为了方便,我就以前后来区分它们。

前端nginx:

gzip压缩不在前端nginx进行,前端主要是用来强制修改request header,即写上:

  1. proxy_set_header Accept-Encoding ‘gzip’;

这样,后台的nginx无论如何都将接收到Accept-Encoding:gzip,而不管客户端有没有发。

完整的测试样本:

  1. server 127.0.0.1:80;
  2. }
  3. server {
  4. server_name www.gznow.org;
  5. listen 80;
  6. location / {
  7.   proxy_pass http://219.x.x.x;
  8.   include proxy.conf;
  9.   proxy_set_header Accept-Encoding ‘gzip’;
  10. }
  11. }

要注意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。

  1. server {
  2. server_name www.gznow.org;
  3. listen 80;
  4. location / {
  5.   root /html/;
  6.   gzip on;
  7.   gzip_http_version 1.0;
  8. }
  9. }

这里就简单点了,gzip的其他参数我就不贴上来,想必大家都有现成的配置,留意下version就好。

配好后,测试一下:

  1. curl -I http://www.gznow.org/bbs/index.php

发现返回了Content-Encoding:gzip

不加-I参数呢?

  1. curl http://www.gznow.org/bbs/index.php

打印出一堆乱码,把SecureCRT的字符都给弄坏了。

也可以通过以下工具来测试压缩成效 http://gzip.zzbaike.com/

Author: admin | Category: Nginx
Comments: 评论关闭

现在许多大型的网站都会使用分布式缓存的方式来分担主站的压力。

例如主站上有动态文件,也有静态文件。
为了让用户有更快速的体验,一般都会把动态文件的请求跟静态文件分开。
把流量分摊给其他外部节点的 squid 服务器等。

这么我就分享一个配置,不用对程序做任何改动,就可实现静态文件重定向。

        location ~* \.(gif|jpg|png|swf|flv|rar|zip|exe|bmp)$ {
            rewrite  ^/(.*)$  http://img.gxxxx.cn:1394/$1  permanent;
        }

修改后的结果是:

当访问: http://www.gxxxx.cn/bbs/photo/logo.gif
即永久从定向至:http://img.gxxxx.cn:1394/bbs/photo/logo.gif

Top
RSS for entries