如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN

Posted 51技术栈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN相关的知识,希望对你有一定的参考价值。

如何用BIND, GeoIP, nginx, Varnish来创建你自己的高效的CDN网络?

比如在中国,被人为划分成两大区域,北方是网通,南方是电信。这两个网络之间互访是比较慢的。作为大型网站,一种解决办法是将全部服务器架设在双线或三线ISP处,由ISP来提供路由上的选择。这样做,线路的成本会比较高。另一种办法就是将服务器架设在两边,南方一台,北方一台,然后由服务器自己选择,如果IP在电信,就转发请求到南方的服务器,如果是网通就转发到北方的服务器。

再扩大范围,可以将美国来的请求交由美国服务器处理,这样也缩短了用户在路由上的等待时间。这就是内容分发网络。

而作为这个网络上的所有节点,都可以当成虚拟服务器来看待。至于在各地的服务器如何做负载均衡,可以由各节点之间完成。

准备工作如下:你需要下载如下软件以实现上述功能

Nginx,BIND,GeoIP,Varnish

接下来是编译和安装bind9和geoip

# tar -xzvf bind-9.2.4.tar.gz
# tar -xzvf GeoIP-1.4.6.tar.gz
# cd GeoIP-1.4.6
# ./configure –prefix=/usr/local/geoip
# make
# make install
# cd ..
# patch -p0 < bind-9.2.4-geodns-patch/patch.diff //给bind9打补丁,让bind9直接支持geoip库
# cd bind-9.2.4
# CFLAGS=”-I/usr/local/geoip/include” LDFLAGS=”-L/usr/local/geoip/lib -lGeoIP” ./configure –prefix=/usr/local/bind
# make
# make install

装好bind后我们来制作named.conf

view “us” {
// 匹配北美的客户端 US & Canada
match-clients { country_US; country_CA; };
// Provide recursive service to internal clients only.
recursion no;
zone “cdn.xianglei.com” {
type master;
file “pri/xianglei-us.db”;
};
zone “.” IN {
type hint;
file “named.ca”;
};
};
view “latin” {
// 匹配到南美国家
match-clients { country_AR; country_CL; country_BR; };
recursion no;
zone “cdn.xianglei.com” {
type master;
file “pri/xianglei-latin.db”;
};
zone “.” IN {
type hint;
file “named.ca”;
};
};

照此办理,你也可以匹配到欧洲,非洲等等,然后来开始制作nginx和varnish
注意,以上内容是你要在主节点服务器上做的,主节点服务器只负责对DNS请求进行转发。
约定一下,我们将Bind服务器叫做动态节点服务器,Nginx+Varnish叫做边界服务器。

以下内容是副节点服务器需要做的,也就是实际在某个地区放置的服务器

# ./configure –prefix=/usr/local/nginx –with-http_realip_module
# make
# make install

并配置Nginx

以上我们用nginx只对静态文件进行缓存,将静态文件缓存在/var/www/cache文件夹下,如果你没有的话,需要创建这个文件夹。并且nginx监听的是8080端口,这是因为,我们需要用varnish来监听80端口进行动态文件的转发。这里实际上是用nginx做了一个静态文件的反向代理和缓存的服务器,而真正让用户能够看到网页和动态文件的反向代理是varnish,而静态和动态文件的分开存放,能将效率提升不少。

最后我们来配置varnish服务。

# tar -xzvf varnish-2.1.2.tar.gz
# ./configure –prefix=/usr/local/varnish
# make
# make install

然后是varnish的选项

backend default {
.host = “127.0.0.1″;
.port = “8080″;
}

sub vcl_recv {
if (req.url ~ “.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
return (lookup);
}
}

sub vcl_fetch {
if (req.url ~ “.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|ogg|swf)$”) {
unset obj.http.set-cookie;
}
}

其他的配置内容可参看varnish的配置文章。

总结:
这样做的好处在于:
1.从根源上解决了DNS在轮询上的不确定性,能够做到在DNS上的快速响应。也避免了过去用Nginx+GeoIP时的负载高的问题。毕竟DNS的计算要比Nginx小多了。
2.降低大网站的服务器负载压力和运营成本,毕竟F5BigIP和双线路的价格和服务费都太高了。
3.易扩展性强,如某地区负载压力大,只需在该地区增加边界服务器组的web server即可完成,无需考虑跳转问题。

其他优点我再想想。

如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN


以上是关于如何用DNS+GeoIP+Nginx+Varnish做世界级的CDN的主要内容,如果未能解决你的问题,请参考以下文章

无法启用 geoip 阻止 nginx - [emerg] 未知指令“geoip_country”

如何用hosts与dns实现局域网泛域名解析?

如何用 DHCP + DNS + Web 实现一个网络架构

Nginx结合GeoIP库

Nginx geoip模块

如何以编程方式在 NGINX 中查询 GeoIP