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

因为某些原因,我的网站的入口域名指向HK,由Nginx反向代理回内陆的服务器。

HK 访问起来速度还是不错的,但宽带很少,最大只有2M,超过的话访问会越来越慢。

我在广州设立了squid缓存服务器的架构,分发了所有静态文件。基本上HK 就只有主页的php 传输了。
但这也不小,用 Firebug 查看,首页基本上都有10K 再+上其余的重定向数据。再小20K 左右走不掉。

经过调优,强制启用了Nginx反向代理中也使用 gzip,即 (内陆Nginx) –> gzip –> (香港Nginx) –> gzip –> 用户

流量缩少了10% 但还是处于紧张边缘。
查看 HTTP 访问日志,得出有 google baidu 等蜘蛛抓得也挺狠!于是想到,能不能把搜索引擎的爬虫也从定向到内陆的服务器减少负担?

于是就有了以下这个 Nginx 的配置:

香港配置:

        if ($http_user_agent ~* (baiduspider|googlebot|soso|bing|sogou|yahoo|sohu-search|yodao|YoudaoBot|robozilla|msnbot|MJ12bot|NHN|Twiceler)) {
            rewrite  ^/(.*)$  http://gznow.spider.someqone.com/$1  permanent;
        }
直接+到 server {   里头即可。意思为:
匹配客户端User agent 不分大小写,凡是含有 baidu,google,bing….
之类爬虫。从定向到指定地址,并匹配原有 url 后续 即:

http://www.gznow.org/bbs/index.php
301 从定性为:
http://gznow.spider.someqone.com/bbs/index.php

这样的话既不影响搜索引擎的收录,也可以把流量分配给其他的服务器。
但如果日后搜索引擎收录的访问地址也成了从定向的地址咋办?
所以就要再多一步,把从定向的目的服务器配置一下:

        if ($http_user_agent ~* (Safari|Navigator|Chrome|Opera|Firefox|msie)) {
            rewrite  ^/(.*)$  http://www.gznow.org/$1  permanent;
        }

也是直接加到 server { 即可
原来跟处理爬虫的一样,不分大小写匹配 user agent 中包含的主流浏览器 msie , firefox , chrome….
从定向到指定地址,并匹配原有 url 后续.
这样即使访客由搜索引擎指引到了从定向的服务器,也能从定向回去。

呵,特殊例子,分享一下。
这么一作,我HK 服务器的流量可立马又省下了 30% 。 放心了不少。

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

Squid3.0之前,一直不能完美支持http1.1。所以对gzip内容的支持,始终有很多问题。我也看过很多帖子,号称解决了这个问题。但是其实一直没有把问题说清楚。我今天试着把问题的原因和解决方法彻底说清楚。

squid不支持常见的gzip压缩的原因,有以下两点:

1,   squid只支持gzip的静态压缩,不支持动态压缩。具体一点说,就是response header里必须有content-length, 不可以用chunked方式。

2,   response header中必须有Vary : Accept-Encoding

只要具备以上几点,squid就可以完美的识别压缩和不压缩的内容。

下面说一下nginx针对这个问题的解决方案:

nginx默认的NginxHttpGzipModule, 采用的是chunked方式的动态压缩,而squid是不支持的。需要使用http_gzip_static_module这个模块,进行pre-compress。

具体方法如下:

ngx_http_gzip_static_module was introduced in nginx 0.6.24. You must enable support at compile time:

./configure –with-http_gzip_static_module …

配置文件写法:

gzip          on

gzip_static on;

gzip_http_version 1.0;
gzip_proxied        any;
gzip_disable        “MSIE [1-6]\.”;

gzip_comp_level     9;

注意,这里没有加入gzip_vary on;。这是因为http_gzip_static_module这个模块,只给没压缩的内容加入了vary header,而不是所有内容都加。
所以不能打开这个参数。可以在nginx.conf中手动设置vary header。这样不管压缩与否,返回的文件都会被加上Vary: Accept-Encoding。

至此,nginx的gzip压缩,就能够被squid完美支持了。如果你使用Http1.0,就会返回你没压缩的内容。如果你使用http1.1,并且发送Accept-Encoding:gzip,deflate,就会返回压缩后的内容。

PS: 我又发现了一个问题,就是squid的cache保存问题。按照文档上说,squid是根据url来缓存对象的。
   也就是说,一个url应该只保留一个cache。如果你交替的申请压缩的和不压缩的内容,是会出现反复MISS的情况的。
   但是我实际测试的过程中,发现不是这样的,交替的申请压缩的和不压缩的内容,是会一直HIT的。这说明squid是同时保存两份cache的(压缩的和不压缩的)。

Top
RSS for entries