`

利用DNS+GeoIP+Nginx+Varnish做世界顶级的CDN

 
阅读更多

http://bbs.3344.eu/archiver/server/thread-1456-1.html

 

利用DNS+GeoIP+Nginx+Varnish做世界顶级的CDN

如何用BIND, GeoIP, Nginx, Varnish来创建你自己的高效的CDN网络?
CDN,意思是Content Distrubtion Network,意思是内容分发网络,简单的说,就是全地域范围内的负载均衡,全地域的概念可以是全国,也可以是全世界。由统一的DNS服务器进行地址转发,选择离用户最近的地区服务器进行负载均衡。本质上是从一个机房内的负载均衡扩展到了全世界范围内的负载均衡。同时可以将本地化的内容,由当地的服务器实现。做浏览器的地区自动选择。
比如在中国,被人为划分成两大区域,北方是网通,南方是电信。这两个网络之间互访是比较慢的。作为大型网站,一种解决办法是将全部服务器架设在双线或三线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 
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
upstream dynamic_node {
server 1.1.1.1:80; # 1.1.1.1 是主DNS节点的IP地址
}
server {
listen 8080;
server_name cdn.xianglei.net;
location ~* \.(gif|jpg|jpeg|png|wmv|avi|mpg|mpeg|mp4|htm|html|js|css|mp3|swf|ico|flv)$ {
proxy_set_header X-Real-IP $remote_addr;
proxy_pass 
http://dynamic_node;
proxy_store /var/www/cache$uri;
proxy_store_access user:rw group:rw all:r;
}
以上我们用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的配置文章。
漏洞之家 http://bbs.3344.eu
总结:
这样做的好处在于:
1.从根源上解决了DNS在轮询上的不确定性,能够做到在DNS上的快速响应。也避免了过去用Nginx+GeoIP时的负载高的问题。毕竟DNS的计算要比Nginx小多了。
2.降低大网站的服务器负载压力和运营成本,毕竟F5BigIP和双线路的价格和服务费都太高了。
3.易扩展性强,如某地区负载压力大,只需在该地区增加边界服务器组的web server即可完成,无需考虑跳转问题。
其他优点我再想想。

分享到:
评论

相关推荐

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

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

    nginx+geoip合集.zip

    nginx+GeoIP,域名根据地域解析到对应IP,所用到的所有资源,全部的。

    nginx1.27.1+lua+geoip2+fancyindex+boringssl+http3

    resty-core-0.1.29.tar.gz lua-resty-lrucache-0.14.tar.gz luajit2-2.1-20240815.tar.gz nginx-1.27.1.tar.gz ngx-fancyindex-0.5.2.tar ngx_http_geoip2_module-3.4.tar.gz ngx_...

    Linux源码安装MySQL+MySQL主从+Nginx+Nginx负载均衡+redis+php+phpredis+tomcat

    yum -y install libxml2-devel libpng-devel freetype-devel freetype2-devel gmp-devel libmcrypt libmcrypt-devel gd libjpeg-devel glibc glibc-devel glib2 glib2-devel GeoIP* ``` 2. 创建Web服务器用户和组...

    nginx-geoip2:nginx geoip geoip2 模块,集成最新的免费 maxmind geoip mmdb 数据

    make && make install$ echo /usr/local/lib &gt;&gt; /etc/ld.so.conf.d/local.conf $ ldconfig下载 geoip2 数据 $ git clone https://github.com/ar414-com/nginx-geoip2$ cd nginx-geoip2$ tar -zxvf GeoLite2-C

    Nginx和GeoIP模块读取IP所在的地域信息方法

    yum install nginx-module-geoip http_geoip_module使用场景 一、区别国内外作HTTP访问规则 二、区别国内城市地域作HTTP访问规则 yum 安装好后找到安装的模块文件 如果nginx是用yun安装的一般是安装到 /etc/nginx/...

    GeoLite2-City.mmdb

    nginx+GeoIP,域名根据地域解析到对应IP,所用到的资源

    ngx_http_geoip2_module:使用ngx_http_geoip2_module编译Nginx 1.15.0并下载GeoIP 2数据库

    带有ngx_http_geoip2_module和GeoIP2数据库的Nginx 1.15.0 这是用于使用ngx_http_geoip2_module编译Nginx 1.15.0并将Nginx安装到服务器中的脚本。 此外,该脚本还有助于下载Maxmind GeoIP2国家/地区数据库的免费版本...

    GeoIP.dat.gz + GeoLiteCity.dat.gz 20200206.zip

    在服务器配置中,比如Nginx,可以利用GeoIP模块集成这些数据库,根据客户端IP地址动态调整服务器的行为。例如,可以将请求路由到最近的CDN节点,或者为不同地区的用户提供不同的内容。安装和配置Nginx的GeoIP模块...

    掌握地理定位:如何在 Nginx 中配置 GeoIP 模块

    Nginx 的 GeoIP 模块利用这些信息来实现基于地理位置的路由、内容定制、访问控制等功能。 #### 为何使用 GeoIP 模块? 1. **内容定制**:根据不同地区的用户展示不同的内容,例如根据用户所在国家提供特定的文化...

    GeoLite2-ASN.mmdb

    nginx+GeoIP,域名根据地域解析到对应IP,所用到的资源

    在nginx中使用geoip做区域限制的方法

    通过IP区别国内或国外,从而跳转到不同的页面,最终用nginx的第三方module:geoip来实现,这就不说它的优势了,网上很多解释,下面看怎么配置 我的系统中是配置了nignx.repo的,我直接用yum来安装了geoip模块,没有用...

    GeoIP_1.4.8.tar.gz 地理信息系统,资源包含geoIP_1.4.8的所有资源。

    GeoIP_1.4.8.tar.gz 是一个与地理信息系统相关的压缩包,它包含了用于识别网络IP地址地理位置信息的库和工具。这个版本是1.4.8,可能包括了更新和修复,以提高性能和稳定性。在IT领域,地理信息系统(GIS)是一种...

    nginx-1.9.0.tar

    在高并发访问的场景下,Nginx能够通过负载轮询将请求均匀地分配到多个后端服务器,确保所有服务器都能得到合理利用,避免单点故障,并提高整体系统的可用性和响应速度。Nginx的负载均衡策略还包括最少连接数、IP哈希...

    geoip2 ip库;geoip国家库;2020.11版

    2. 安装Nginx的GeoIP模块,这可能需要编译Nginx源码并在配置时添加模块。 3. 将数据库文件移动到Nginx配置文件指定的位置,并确保Nginx有读取权限。 4. 配置Nginx服务器,使用GeoIP模块来查询IP地址并根据结果进行...

    GeoIP.dat__GeoLitecity.rar

    标题中的"GeoIP.dat__GeoLitecity.rar"和描述中的内容暗示了我们讨论的核心是Nginx的GeoIP模块以及相关的数据库文件。 GeoIP模块是Nginx的一个第三方模块,用于获取访问者IP地址的地理位置信息。这个功能对于网站...

    Nginx学习丛书 Nginx应用与提高

    《Nginx学习丛书:Nginx应用与提高》是一套深入探讨Nginx服务器的教程,涵盖了Nginx在各种场景下的应用和优化。这套资料的目的是帮助读者全面理解和掌握Nginx的强大功能,提升其在实际工作中的效能。 1. **第3章 ...

    GeoIP.dat.gz和GeoLiteCity.dat.gz.rar

    - 在Nginx中使用GeoIP功能,首先需要安装GeoIP模块和对应的数据库。在Linux系统中,这通常涉及编译Nginx时添加模块,然后将解压后的GeoIP数据库文件移动到指定目录。 - 配置Nginx时,需要在server或location块中...

    PHP版基于GeoIP2实现根据ip获取地理位置

    考虑到隐私和性能,不要在生产环境中直接获取用户的原始IP,而是应该使用`X-Forwarded-For`头信息,这在处理代理服务器或CDN时尤为重要。同时,对于频繁的IP查询,可以考虑缓存查询结果,以减少数据库访问次数。 ...

Global site tag (gtag.js) - Google Analytics