用bind9架设自己的智能DNS
Posted on October 25, 2007 - Filed Under 互联网
中国的南北网络问题,是许多做网站的人的心病
除了使用双通或者多通机房以外,还可以通过多台镜像服务器的方法来提高用户的访问速度
但是,如果使用的双通机房并不是单IP的,或者使用多台镜像的做法,就会面临多个不同的服务器IP的问题
最早的时候,很多镜像服务器都是使用不同的域名的,比如说www1和www2,或者www和cnc
这样的做法,对用户相当不友好,而且不方便推广,比如说,你要告诉朋友一个网站,还要问他是什么线路才能给网址吗,或者可能你还不知道这个网站有一个专为网通的线路所设置的镜像
用统一的域名,然后根据用户的线路自动判断引导到不同的镜像服务器,正是智能DNS的功用(智能DNS其实是CDN的其中一部分,是最前端的部分)
现在还是有一些地方使用多域名,比如说下载网站的下载镜像服务器,因为智能DNS有一定的缺陷(并不一定选择到正确的线路,下面说),也提供给用户自由选择线路的权利
目前也有一些公司提供智能DNS解释服务,把你的域名NS指到他们服务器,然后输入网通和电信服务器的IP就ok了
也有一些公司提供比较完整的CDN服务,比如比较出名的就是chinacache,不少中型网站是使用他们的服务
最初的bind是不支持通过来源选择不同的ip的,因此只能通过iptables的辅助来实现智能DNS,方法也很简单,在DNS服务器上面启动两份bind,都不要用默认的端口,两份分别解析不同的线路,然后再用iptables将默认端口的DNS请求根据来源IP发送到不同的bind实例
这种方法缺点很明显,需要多个bind实例,如果需要更多的线路解释那就还要再开bind实例,另外iptables对来源的解释也会导致iptables太多规则
现在的bind支持了根据来源选择的功能,我不确定是不是bind9的新特性,不过bind9是重写过的,相比漏洞百出的bind8来说,稳定和安全很多,以下的配置以bind9为基础
我使用的是CentOS,由于bind服务没有其他服务(比如apache,squid)要求那么高,所以也没有必要自己编译一份,我是用过yum安装的,版本不是最新的稳定版
装好之后,可以用过/etc/init.d/named start成功启动服务
有一个文件named.conf出现在/etc下,就是bind的主config文件,我们只要改动他
(我只说明智能DNS实现部分,其他的bind设置自行修改,呵呵)
另外一个小技巧,可以通过/usr/sbin/named -g -u named来启动bind,可以立刻看到输出信息,方便调试
我们是通过bind9的view功能来分离判断的
首先,我们需要一份网通的IP列表,这是一份在网上流传的列表,呵呵
acl “CNC” {
58.16.0.0/16;
58.17.0.0/17;
58.17.128.0/17;
58.18.0.0/16;
58.19.0.0/16;
58.20.0.0/16;
58.21.0.0/16;
58.22.0.0/15;
58.240.0.0/15;
58.242.0.0/15;
58.244.0.0/15;
58.246.0.0/15;
58.248.0.0/13;
60.0.0.0/13;
60.8.0.0/15;
60.10.0.0/16;
60.11.0.0/16;
60.12.0.0/16;
60.13.0.0/18;
60.13.128.0/17;
60.14.0.0/15;
60.16.0.0/13;
60.24.0.0/14;
60.30.0.0/16;
60.31.0.0/16;
60.208.0.0/13;
60.216.0.0/15;
60.218.0.0/15;
60.220.0.0/14;
61.48.0.0/13;
61.133.0.0/17;
61.134.96.0/19;
61.134.128.0/17;
61.135.0.0/16;
61.137.128.0/17;
61.138.0.0/17;
61.138.128.0/18;
61.139.128.0/18;
61.148.0.0/15;
61.156.0.0/16;
61.159.0.0/18;
61.161.0.0/18;
61.161.128.0/17;
61.162.0.0/16;
61.163.0.0/16;
61.167.0.0/16;
61.168.0.0/16;
61.176.0.0/16;
61.179.0.0/16;
61.181.0.0/16;
61.182.0.0/16;
61.189.0.0/17;
125.32.0.0/16;
125.40.0.0/13;
202.96.0.0/18;
202.96.64.0/21;
202.96.72.0/21;
202.97.128.0/18;
202.97.224.0/21;
202.97.240.0/20;
202.98.0.0/21;
202.98.8.0/21;
202.99.64.0/19;
202.99.96.0/21;
202.99.128.0/19;
202.99.160.0/21;
202.99.168.0/21;
202.99.176.0/20;
202.99.208.0/20;
202.99.224.0/21;
202.99.232.0/21;
202.99.240.0/20;
202.102.128.0/21;
202.102.224.0/21;
202.102.232.0/21;
202.106.0.0/16;
202.107.0.0/17;
202.108.0.0/16;
202.110.0.0/17;
202.111.128.0/18;
203.93.8.0/24;
203.93.192.0/18;
210.13.128.0/17;
210.14.160.0/19;
210.14.192.0/19;
210.15.32.0/19;
210.15.96.0/19;
210.15.128.0/18;
210.21.0.0/16;
210.52.128.0/17;
210.53.0.0/17;
210.53.128.0/17;
210.74.96.0/19;
210.74.128.0/19;
210.82.0.0/15;
218.8.0.0/14;
218.12.0.0/16;
218.21.128.0/17;
218.24.0.0/14;
218.56.0.0/14;
218.60.0.0/15;
218.67.128.0/17;
218.68.0.0/15;
218.104.0.0/14;
219.154.0.0/15;
219.156.0.0/15;
219.158.0.0/17;
219.158.128.0/17;
219.159.0.0/18;
220.252.0.0/16;
221.0.0.0/15;
221.2.0.0/16;
221.3.0.0/17;
221.3.128.0/17;
221.4.0.0/16;
221.5.0.0/17;
221.5.128.0/17;
221.6.0.0/16;
221.7.0.0/19;
221.7.32.0/19;
221.7.64.0/19;
221.7.96.0/19;
221.8.0.0/15;
221.10.0.0/16;
221.11.0.0/17;
221.11.128.0/18;
221.11.192.0/19;
221.12.0.0/17;
221.12.128.0/18;
221.13.0.0/18;
221.13.64.0/19;
221.13.96.0/19;
221.13.128.0/17;
221.14.0.0/15;
221.192.0.0/15;
221.194.0.0/16;
221.195.0.0/16;
221.196.0.0/15;
221.198.0.0/16;
221.199.0.0/19;
221.199.32.0/20;
221.199.128.0/18;
221.199.192.0/20;
221.200.0.0/14;
221.204.0.0/15;
221.206.0.0/16;
221.207.0.0/18;
221.207.64.0/18;
221.207.128.0/17;
221.208.0.0/14;
221.212.0.0/16;
221.213.0.0/16;
221.216.0.0/13;
222.128.0.0/14;
222.132.0.0/14;
222.136.0.0/13;
222.160.0.0/15;
222.162.0.0/16;
222.163.0.0/19;
222.163.32.0/19;
222.163.64.0/18;
222.163.128.0/17;
};
如果觉得有哪些部分不是很准确的话,可以自行修改
由于这个部分太长了,所以写在一个专门的文件然后include进named.conf比较容易维护
例如,我们把上面这段配置保存为cnc_acl.conf
然后在named.conf写入
include “/data/named/cnc_acl.conf”;
即可
接下来就是view的配置,假设域名是xyz.com,呵呵
view “view_cnc” {
match-clients { CNC; };
zone “xyz.com” {
type master;
file “/data/named/cnc_xyz”;
};
};
view “view_any” {
match-clients { any; };
zone “xyz.com” {
type master;
file “/data/named/any_xyz”;
};
};
就这样就足够了
然后我们需要cnc\_xyz和any_xyz两个具体的zone file
两个文件基本是一模一样的,就是指向不同的ip
$TTL 2h
xyz.com. IN SOA ns.xyz.com. root.xyz.com. (
20071022
2h
40m
1w
2h
)
this6.com. IN NS ns.xyz.com.
this6.com. IN MX 1 mail.xyz.com.
ns IN A 1.1.1.1
mail IN A 1.1.1.1
www IN A 1.1.1.1
根据不同的线路把www指向不同的IP即可
这样,我们就实现了自己的智能DNS
后话,目前许多大型网站都是用这个来实现不同的线路来源访问不同的镜像,甚至还做到地区级别,例如,在佛山机房部署了一台镜像服务器,就将广东省的访问都指向这台服务器
另外,刚刚提到智能DNS也有缺陷,这里详细描述一下,bind9通过用户的来源IP来返回不同的解释IP,而实际上,并不是实际用户直接访问我们的DNS,而是用户所使用的DNS(比如说广州ADSL用户的默认DNS)负责访问我们的DNS,网通的DNS就保存有我们网通的IP,如果用户自行修改了DNS,比如说电信的用户硬要用网通的DNS,或者网通的用户使用国外的DNS(比如opendns之类的),就会导致判断失误
trac续
Posted on October 9, 2007 - Filed Under 互联网
上一篇blog介绍了怎么在windows下安装并使用trac,但是只能说基本能用
在公司里面使用trac,我们还有一些额外的需求
比如,如何用windows service来运行,可以用web server的方式来跑吗,如何身份认证
其实,所有的这些问题,都可以用apache跑trac解决,而且效果也非常好。下面我就来说说我现在用的配置
首先说一下trac可以使用的运行方式,一共有4种
第一种就是tracd,就是上一篇文章所说的,使用相当便捷,可以作为调试使用,不推荐生产环境
第二种是cgi模式,cgi出名低效率了,直接跳过
第三种是mod_python,一开始我也是使用这种,配置也很方便,不过遇上一个专有问题了
在TracInstall中有描述
> if using mod_python together with xml-related things (like 0.11, or xml-rpc plugin), use python-2.5. expat is namespaced there and does not cause apache to crash any more(see here for details).
刚好我们需要使用xml-rpc,然后apache不停报错,虽然不影响使用,但是还是挺烦的
最后一种方法,就是我们目前在使用的方法,就是使用mod_wsgi
wsgi是最近python提出的一种类似cgi的模型,希望能统一web server <-> app server的通讯,似乎很多人都很推崇,不过因为比较新生,所以似乎用的人也不是很多,刚好trac提供了支持。搜索到mod_wsgi for windows编译好的包,使用非常稳定,下面是我的apache配置
LoadModule wsgi_module modules/mod_wsgi.so
WSGIScriptAlias /trac d:/trac/apache/trac.wsgi
Order deny,allow
Allow from all
呵呵,很简单
然后就是认证问题,好像有多种方法,我使用的是apache内置的认证,trac直接支持
刚好我们的svn也是用这种方式来配置认证的,可以使用同一个user文件,这样svn和trac的帐号就可以互通了
AuthType Basic
AuthName “xxxx”
AuthUserFile d:/svn-repo/users
Require valid-user
在windows下安装trac
Posted on September 10, 2007 - Filed Under 互联网
trac是一个很不错的wiki+bug tracker软件
公司急需一个bug tracker软件来管理bug和一些小任务
经过评估之后,终于决定使用trac(有空我再写一篇比较和评估的依据)
trac的安装有点麻烦,因为他用了不少外部库,有些还是c写的。这个也是影响我评估的其中一个因素,差点就不打算使用它了
经过几天的研究,发现trac在windows下的安装异常简单,但是有好多需要注意的细节,于是变有了这篇文章
说实在话,现在我甚至觉得windows下的安装比linux还要简单,呵呵
Trac Guide里面的[Trac Installation Guide](http://trac.edgewall.org/wiki/TracInstall)仅仅是一个通用的描述,并不是具体的步骤,所以这个页面只能当成是参考的部分。不过,页面里面也穿插了很多细节,什么可以用什么不能用,所以最后还是得详细看一遍才清楚
真正正确和详细的步骤其实有一份[Trac on Windows](http://trac.edgewall.org/wiki/TracOnWindows)的文档,但是藏的比较隐蔽,具体的入口在Trac FAQ中
让我们来看看这份文档吧,基本上,跟随这份文档你就能在windows安装一个trac
首先是python的版本选择问题,虽然python2.5已经出了很久,但是,因为trac依赖了一个c写的模板引擎ClearSilver,并没有for python2.5 windows的编译好的包,因此,你必须自己编译ClearSilver,那是相当的麻烦。linux呢?linux反正是要编译的,所以就算用python2.4情况也是一样(所以linux的安装还是比较麻烦的)
除了ClearSilver以外,其他包也可能遇到类似的问题,因此,使用python2.4是最佳的选择
题外话,其实还有另外一个选择,就是使用trac 0.11dev。不知道具体的原因,trac已经决定使用Genshi来代替ClearSilver作为模板引擎,具体的文档是[Trac with Python 2.5](http://trac.edgewall.org/wiki/TracOnWindows/Python2.5),不过我觉得还是不要使用测试版比较好。另外说一下,Genshi也是trac出品的
接下来,文档提供了4种安装方法。我最后选择了第二种,也比较推荐这种,使用单独的Installer,Setuptools 的确是一个好工具,但是感觉不太好控制
下载并运行trac-0.10.4.win32.exe、clearsilver-0.9.14.win32-py2.4.exe,Installer会自动找到python的位置。trac使用sqlite来做后端存储,所以你还需要pysqlite-2.3.4.win32-py2.4.exe,如果你还想用trac的svn browser功能,你还需要svn-python-1.4.4.win32-py2.4.exe
关于数据库的选择,trac最初只支持sqlite,现在支持postgresql和mysql,但是官方不推荐使用mysql,说是因为字符集问题?(这个理由有点烂),但是官方不推荐是比较麻烦的,专门装个postgresql也不太现实。其实,sqlite的表现相当好,而且,备份起来相当方便,所以最后还是决定用sqlite
然后。。。没有了,呵,其实trac已经安装完成了
运行
\Python24\Scripts\trac-admin.py my-project initenv
\Python24\Scripts\tracd.py -p 8000 my-project
开始试用你的trac吧
总结一下:
1. 使用python2.4
2. 安装trac-0.10.4.win32.exe、clearsilver-0.9.14.win32-py2.4.exe、pysqlite-2.3.4.win32-py2.4.exe
3. 开始使用!
比较高效的关键字过滤代码
Posted on July 26, 2007 - Filed Under Uncategorized
public String keywordMask(String str) { StringBuffer buffer = new StringBuffer(str); for (String keyword : getKeyword()) { int index = 0; while (true) { index = buffer.indexOf(keyword, index); if (index < 0) { break; } for (int i = 0; i < keyword.length(); i++) { buffer.setCharAt(index + i, '*'); } } } return buffer.toString(); }
再战mac下的BT软件
Posted on July 26, 2007 - Filed Under 苹果
linux最好用的BT软件rtorrent在mac下面竟然遇上中文问题,到现在都没有解决的办法
同样用rtorrent的核心libtorrent的bitrocket开发进度缓缓慢慢的,竟然也有中文问题,而且经常突然退出,基本上不能用
不过有一个好消息就是,utorrent这个可能是windows下面最好的BT软件正在开发mac的版本,已经有运行截图放出来了,不过还没有可以试用的版本
最后找了一个Transmission来用,优点嘛,没有,至少能用
下载速度还可以,资源占用也不高
准备推出的0.8版增加了不少新特性,比如可以选择某些文件不下载(不要怀疑,现在的版本的确没有)等等
ibatis 3.0
Posted on June 20, 2007 - Filed Under Uncategorized
第一版的ibatis已经5年
ibatis2也已经3年
现在是时候开始第三版的ibatis了
你可以参与讨论第三版需要什么功能
http://opensource.atlassian.com/confluence/oss/display/IBATIS/iBATIS+3.0+Whiteboard
不过其实我觉得ibatis2已经很好用了
卓越7周年,满100返20+免费配送
Posted on June 9, 2007 - Filed Under Uncategorized
http://www.joyo.com/static/haof_070604_zh_freeship2.asp
让我们来分析一下究竟有多少优惠
> 单张订单现金购物每满100元即返2张10元卓越礼品券
> 单个订单满100元限使用1张返券
也就是说300元优惠20元
至于免费配送,本来100元以上就是的了
现在是不限金额
servlet 2.5的web.xml
Posted on March 17, 2007 - Filed Under Uncategorized
sun从来不把servlet各个版本的web.xml的规格公布一下,即使上网查找,也很难发现。倒是跟随支援的servlet容器会发布一些范例程序,好运的话,里面将会有最新版本的web.xml写法,比如说,tomcat6正式版里面有了servlet 2.5的写法,如下:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd" version="2.5">
别以为看到这里就结束了,很可惜地告诉你,这段代码是错误的。不信你尝试打开一下这个链接http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd,你会发现是no page found。
那为什么tomcat6的范例程序能够工作呢,那是因为在tomcat6的lib里面,已经存在这个文件,所以也不需要从网络上面抓取。其实你按照这个web.xml写了servlet 2.5的程序,在tomcat6里面也是可以运行的。
可是当我使用eclipse+xmlbuddy的时候,问题就出来了,因为web-app_2_5.xsd一直不能下载,xmlbuddy一直报错,并且没有语法提示功能。通过搜索,我发现了web-app_2_5.xsd的真实地址其实是http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd,而它的namespace是http://java.sun.com/xml/ns/javaee,于是代码应该改成:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
留意一下不同的部分,其实是因为sun把j2ee改名为javaee。
ps,另外附上servlet 2.4的写法
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
iBATIS for Java 2.3.0 General Availability
Posted on March 15, 2007 - Filed Under Uncategorized
iBATIS是一个经常与hibernate一起被提及的o/r工具,跟完全o/r化的hibernate不同,iBATIS算是一个半o/r工具,他仅仅提供了基本的映射功能,如果你要做一个很oo的db操作,可能hibernate比较适合你,如果你坚持使用JDBC,或许使用iBATIS会对你有不少帮助。尤其你想专注SQL语句的性能的话,hibernate并不适合。
最新版的iBATIS 2.3.0在2月11日发布了,没有太多大的更新,但是有两个很重要的功能废弃。其中一个是iBATIS的DAO部分被废弃,官方推荐使用spring。我倒不是不喜欢使用spring的事务功能,它的确做了很多事情,但是始终有些场景不是很适合使用。首先,spring的事务使用起来比较笨重,声明性的使用方法还好,但是要通过AOP,AOP相对麻烦一点,而且性能不高。编程性的使用方法用起来非常麻烦,使用模板的方法比较难看,不使用模板也难看。而且spring的事务速度会比较慢。其实iBATIS的事务做得挺简单的,其实就是JDBC的事务了,不过iBATIS有一点比较好的就是它使用而且
SendTransaction的风格
try {
beginTransaction();
xxxx
commitTransaction();
} finally {
endTransaction();
}
比起传统的
try {
beginTransaction();
xxxx
commitTransaction();
} catch(Exception e) {
rollbackTransaction();
}
的好处是,传统的做法其实是miss了Error的部分,而使用finally的做法,是肯定会执行的。
另一个废弃的功能就是paginate。的确ibatis做得比较鸡肋,仅仅是使用了jdbc的定位,废弃也是必然。hibernate里面这个特性倍受推荐,其实也做得并不完美。
生活态度
Posted on March 14, 2007 - Filed Under Uncategorized
1\. 做你喜欢的事情
2\. 做30年
0\. 找到你喜欢做的事情
« go back — keep looking »