如何用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的配置文章。
总结:
这样做的好处在于:
1.从根源上解决了DNS在轮询上的不确定性,能够做到在DNS上的快速响应。也避免了过去用Nginx+GeoIP时的负载高的问题。毕竟DNS的计算要比Nginx小多了。
2.降低大网站的服务器负载压力和运营成本,毕竟F5BigIP和双线路的价格和服务费都太高了。
3.易扩展性强,如某地区负载压力大,只需在该地区增加边界服务器组的web server即可完成,无需考虑跳转问题。
其他优点我再想想。
转载于:https://blog.51cto.com/tianshili/1640076
相关文章:

Asp.Net Core 入门(一)——Program.cs做了什么
ASP.NET Core 是微软推出的一种全新的跨平台开源 .NET 框架,用于在 Windows、Mac 或 Linux 上生成基于云的新式 Web 应用程序。国内目前关于Asp.Net Core的书比较少,自己靠着阅读微软官方文档,源码和在52ABP梁老师的教程中慢慢的在一点点的积…
LTE MIBSIB1
LTE MIB/SIB1 LTE MIB/SIB 消息可以参考:http://blog.csdn.net/wowricky/article/details/51348613 UE 接受完MIB/SIB1后就可以判断这个CELL是否可以驻留,这里仅仅讨论与驻留 (Camp on)相关的参数。 1. MIB 包含BW/PHICH/SFN 2. SIB1 包含小区接入信…

python 加载动图_在浏览器中使用TensorFlow.js和Python构建机器学习模型(附代码)...
大数据文摘授权转载自数据派THU作者:MOHD SANAD ZAKI RIZVI本文主要介绍了:TensorFlow.js (deeplearn.js)使我们能够在浏览器中构建机器学习和深度学习模型,而无需任何复杂的安装步骤。TensorFlow.js的两个组件——Core API和Layer API。了解…

mySQL笔记(1)
1.show databases; 显示所有数据库 2.create database 数据库名 [其他选项]; 新建数据库 例:create database example_db character set gbk; 创建了一个名为example_db的数据库,并将数据库字符编码指定为gbk,便于在命令提示符下显…

Loadrunner进行md5加密方法
本文主要介绍使用Loadrunner进行字符串md5加密的方法。 使用Loadrunner进行md5比较简单,首先是加载md5.h头文件,后使用头文件中的加密函数即可。 1. md5.h头文件内容如下 #ifndef MD5_H #define MD5_H #ifdef __alpha typedef unsigned int uint32; #els…

6 Java Shell排序
希尔排序是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。 1、基本思想 将待排序数组按照步长gap进行分组,然后将每组的元素利用直接插入排序的方法…

如何向非技术人员解释“稀疏傅里叶变换”算法?
【伯乐在线导读】:这个问题来自 Quora,下面是来自 Tanooj Luthra 的回复。 让我们来演奏一架想象中的钢琴。 钢琴的每个琴键都对应一个特定频率的声音。例如,一个比较有名的频率是国际标准音A(440赫兹)。当有琴键按下时…

N皇后摆放问题
Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。你的任务是,对于给定的N,求出有多少种合法的放置方法。 Inp…

java线程的优先级是数字越大优先级越高_《深入理解Java虚拟机》5分钟速成:12章(Java内存模型与线程)...
第12章 Java内存模型与线程前言:1、物理机如何处理并发问题?2、什么是Java内存模型?3、原子性、可见性、有序性的具体含义和应用实现?4、volatile 关键字特性?5、基于volatile变量的运算在并发下是否是线程安全的&…

动软代码生成V2.74模版简介
最近发现很多人用动软代码生成,确实方便,有些经验记录下,以后查看回顾。 ..\Maticsoft\Codematic2\Template\TemplateFile 为模板文件夹,直接在目录下新建文件夹【我的自定义模版】,有个【模版示例.cmt】也直接复制到自定义文件下…

《少年先疯队》第九次团队作业:Beta冲刺第二天
2.1 今日完成任务情况 姚玉婷:房间管理功能测试文档的编写马丽莎:酒店系统中商品管理功能的完善张 琼:商品管理功能的测试孙苗坤:商品管理功能的测试2.2 明天任务安排 姚玉婷:酒店系统中剩余功能的完善马丽莎&#x…

傅里叶变换的参考文档
https://betterexplained.com/articles/an-interactive-guide-to-the-fourier-transform/ http://blog.jobbole.com/70549/

取消ssh密钥文件登录_Xshell密钥登入,增加安全
1.点击Xshell菜单栏的工具,选择新建用户密钥生成向导,进行密钥对生成操作。2.这个时候,你已经有了一对密钥,需要开始设定服务器的配置,启用密钥认证登录,同时为了系统安全着想,关闭密码认证的方…

20150726 填坑日记
三中内填坑: 1. 组合数递推什么的 C(m,n)C(m,n-1)C(m-1,n-1)。填了个大坑,以前没认真听课QAQ 2. 裸题过河卒 3. 缺角正方形摆放车统计,分上下部分,枚举上部分放几个即可,O(n) 4. 3d立体图统计表面积:先把上…

Word 2003文件保存和另存为操作是否熟练掌握的有关测试
提出问题本文内容不仅适用于Word,对于其他的文档(文字、图形、动画、声音等)编辑软件基本通用。对于操作上述各种编辑软件时,大家都应该注意到,我们第一次保存文件时系统出现的是“另存为”对话框。此后,再…

kdress学习
这两天看了一本书叫《linux二进制分析》,这里面提到的一个小工具kdress,这里分析一下 源码在:https://github.com/elfmaster/kdress kdress介绍 /boot目录下有一个vmlinux的文件,这是一个经过压缩的linux内核,不过缺少…

什么是DCI? 它有什么用?
当你学习LTE的物理帧(physicalframe)结构时,你肯定会有所体会:”靠,怎么这么复杂啊”.物理帧结构是时域 (Time Domain)、频域(Frequency Domain)和调制方式(modulation scheme)的组合。 你可能会有疑问:”接收方怎么知…

判断小数是否相等_四年级上册数学填空+计算+判断易错题整理练习,收藏练一练!...
四年级数学易错题练习一、填空题1、1.250.8表示( )。2、去掉0.25的小数点,就是把这个数扩大( );把50.4的小数点向左移动两位,就是把它缩小到原来的( )。3、两个因数相乘, 一个因数扩大10倍,另一个因数扩大…

jquery checkbox勾选/取消勾选的诡异问题
$("input[idsubmit2]").click(function() { $("[idpostage2]").prop("checked", true); }); $("input[idsubmit3]").click(function() { $("[idpostage2]").prop("checked", false); }); 解决办法&#x…

C#_uploadify_mvc_version
jQuery Uploadify在ASP.NET MVC3中的使用 1、Uploadify简介 Uploadify是基于jQuery的一种上传插件,支持多文件、带进度条显示上传,在项目开发中常被使用。 Uploadify官方网址:http://www.uploadify.com/ 2、ASP.NET MVC3中的使用Uploadify 搭…

Velocity Engine基础
回到顶部Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据 , 填充到模板中,从而实现界面和java代码的分离!Velocity Template Language (VTL) , 是Velocity 中提供的一种模版语言 , 旨在提供最简单和最干净的方法来将动态内容合并到网页中。简单来说VTL可以将程序中的动态数展示到网页中注释非解析内容 , 引用和指令。

mysql唯一索引与null
根据NULL的定义,NULL表示的是未知,因此两个NULL比较的结果既不相等,也不不等,结果仍然是未知。根据这个定义,多个NULL值的存在应该不违反唯一约束,所以是合理的,在oracel也是如此。在mysql 的innodb引擎中,是允许在唯一索引的字段中出现多个null值的。有上面的表和数据可以看出,查询多条数据。

矩阵乘法递归求解
给定两个NN的矩阵,求乘积 如下图所示,乘法执行过程如下: 1.矩阵1先拿出一行,矩阵2先拿出一列 2.行与列相乘得到value1 3.行与剩下矩阵2相乘得到value2(递归过程) 4.剩下矩阵1与列相乘得到value3(…

What is acceptable cell and suitable cell in LTE?
The difference between acceptable cell and suitable cell in LTE is given below. acceptable cell In a area where UE is not able to find any suitable cell to camp on, it goes for acceptable cell. An “acceptable cell” is a cell on which the UE may camp to o…

appium 控件定位
转自:http://www.2cto.com/kf/201410/340345.html AppiumDriver的各种findElement方法的尝试,尝试的目标应用是SDK自带的Notepad应用。 1. findElementByName 1.1 示例 ?12el driver.findElementByName("Add note");assertThat(el.getText()…

android应用去掉状态栏_Android 显示、隐藏状态栏和导航栏
Android 显示、隐藏状态栏和导航栏控制状态栏显示,Activity的主题中配置全屏属性true控制状态栏显示,在setContentView之前设置全屏的flaggetWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREE…

hdu1305Immediate Decodability(字典树)
这题看是否 这题能A是侥幸,解决的办法是先存一下输入的字符串,进行排序。 Problem DescriptionAn encoding of a set of symbols is said to be immediately decodable if no code for one symbol is the prefix of a code for another symbol. We will …

python isdigit()
isdigit(): Python isdigit() 方法检测字符串是否只由数字组成。如果字符串只包含数字则返回 True 否则返回 False。 实例 以下实例展示了isdigit()方法的实例: #!/usr/bin/python3str "123456"; print (str.isdigit()) str "Runoob example....wo…
Control Channel Element (CCE)
1. CCE是PDCCH的资源单元 (resourceunit)。 A PDCCH is transmitted on one CCE or anaggregation of several consecutive CCEs, where a CCE corresponds to 9 Resource ElementGroups (REGs). In PDCCH transmission, only those REGs are used which are notassigned …

phpstrom+xdebug调试PHP代码
众所周知开发PHP的IDE种类繁多,然而开发PHP并不能像开发其他语言一样,调试PHP代码对诸多新手来说,搭建调试环境就比较麻烦!其实哈,我发现NuSphere-phped-16.0很强大,集成了很强大的debug功能,只…