Submitted by gouki on 2008, September 12, 3:59 PM
打开google reader,好开心,发现一篇精品文章,不敢独享,放上来。毕竟,独乐乐不如众乐乐嘛。没看这篇文章之前,我一直没有想通,那些空间商是怎么让一个用户注册一下就生成一个空间,而不用重启apache的。这一直是我的心头疑问,直到看到这篇文章的黑体字,所以。。。。转摘一下,哈哈
作者:FinalBSD
日期:2008-09-11
原文地址:http://www.sanotes.net/html/y2008/181.html
需求:
一台apache上要服务很多的虚拟主机,这些虚拟主机的域名具有规律性,比如说是:xxx.example.com
实现:
使用mod_rewrite进行跳转
优点:
* 不需要为每一个虚拟主机配置一段;
* 新增了vhost不需要重启apache,只需要编辑vhosts.map即可;
缺点:
* 无法为特定的vhosts设定具体配置
配置:
XML/HTML代码
- RewriteEngine On
- RewriteMap lowercase int:tolower
-
- RewriteMap vhost txt:/usr/local/etc/apache22/vhost.map
- RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
- RewriteCond ${vhost:%1} ^(/.*)$
- RewriteRule ^/(.*)$ %1/$1
/usr/local/etc/apache22/vhost.map的内容是:
XML/HTML代码
- site1.example.com /usr/local/www/data/1
- site2.example.com /usr/local/www/data/2
- site3.example.com /usr/local/www/data/3
- site4.example.com /usr/local/www/data/4
- site5.example.com /usr/local/www/data/5
- site6.example.com /usr/local/www/data/6
原理:
1.构建2个映射表,分别是lowercase和vhost;
2.对每个URL进行RewriteCond检查,比如http://Site5.Example.com/index.html
2.1 第一条RewriteCond:
XML/HTML代码
- RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
1)这里首先查询lowercase表,lowercase表属于int类型,使用apache内部函数tolower将
XML/HTML代码
- key:Site5.Example.com替换为value:site5.example.com.
2)查完之后用查询到的Value进行RewriteCond判断
XML/HTML代码
- input='site5.example.com' pattern='^(.+)$' => matched
2.2 第二条RewriteCond:
XML/HTML代码
- RewriteCond ${vhost:%1} ^(/.*)$
1)这里首先查询vhost表,vhost表属于txt类型,key:site5.example.com对应value为/usr/local/www/data/5.
2)查完之后用查询到的value进行RewriteCond判断
XML/HTML代码
- input='/usr/local/www/data/5' pattern='^(/.*)$' => matched
3.在2条RewriteCond都符合的情况下,执行RewriteRule规则:
XML/HTML代码
- RewriteRule ^/(.*)$ %1/$1
将/下面的所有文件重写到%1/$1,这里的
%1:是上一个RewriteCond的value:/usr/local/www/data/5
$1:即(.*)的括号里面的内容,即请求的文件名
最终的执行为:
XML/HTML代码
- rewrite '/index.html' -> '/usr/local/www/data/5/index.html'
可以看详细的日志了解整个过程。
requested uri /index.html
XML/HTML代码
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (3) applying pattern '^/(.*)$' to uri '/index.html'
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (5) map lookup OK: map=lowercase key=site5.example.com -> val=site5.example.com
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (4) RewriteCond: input='site5.example.com' pattern='^(.+)$' => matched
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (6) cache lookup FAILED, forcing new map lookup
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (5) map lookup OK: map=vhost[txt] key=site5.example.com -> val=/usr/local/www/data/5
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (4) RewriteCond: input='/usr/local/www/data/5' pattern='^(/.*)$' => matched
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (2) rewrite '/index.html' -> '/usr/local/www/data/5/index.html'
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (2) local path result: /usr/local/www/data/5/index.html
- 192.168.1.2 - - [11/Sep/2008:22:09:25 +0800] [site5.example.com/sid#2840feb8][rid#28cbe050/initial] (1) go-ahead with /usr/local/www/data/5/index.html [OK]
Reference:Apache模块 mod_rewrite
更强大的方法:使用mod_vhost_alias(由Tonny推荐):
XML/HTML代码
- UseCanonicalName Off
- VirtualDocumentRoot /usr/local/www/data/%0
那么对http://site1.example.com/file.html的请求将会返回文件/usr/local/www/data/site1.example.com/file.html
Reference:Apache模块 mod_vhost_alias
Appendix:比较专业的模块(i_amok推荐)
http://www.oav.net/projects/mod_vhs/
Tags: apache, mass vhosts, mod_rewrite, 精华
Software | 评论:1
| 阅读:761
Submitted by gouki on 2008, September 12, 10:21 AM
Heap数据表只存在于内存中,它主要的用途是充当临时数据表。它采用了散列索引(hash index),这使得数据的存取速度非常快。heap表与临时表还是有区别的,它对于访问数据库的连接是永远可见的,即使连接丢失,表也不会消失。
虽然它的存取速度是最快的,但缺点也同样的明显。
1、因为使用的是内存,所以一旦断电或出现意外的时候,里面的数据将全部丢失
2、因为使用内存,所以text字段和blob字段是不允许使用的
3、对于heap表,只能使用 = 和 <=> 操作符来进行记录的搜索,而不能使用 < , > ,<= ,>= 这些操作符
4、heap表不允许有自增字段
5、heap表的大小有限制,通过mysql配置文件中的:max_heap_table_size来决定
临时数据表,一般是指采用create temporary table或者mysql为了存储中间结果而临时创建的数据表,表的类型可以是myisam,innodb,heap三种类型中的任何一种。这种数据表在MYSQL意外掉电的时候,一般不会消失(除了heap表),但MYSQL正常关机、MYSQL连接结束、MYSQL执行意外中断时,都将全部丢失。另外,这种数据表对于访问同一个数据库的MYSQL连接是不可见的,不同的用户即使创建相同名字的临时表而不会发生冲突,这点就与heap有区别。因为heap表是可见的,所以不能创建两个相同名字的heap表。
一般而言,人们提到的“临时表”更多的是指MYSQL为了保存select查询的中间结果而自动创建的临时表。因为在实际运用当中,很少会主动创建这些临时表。
临时表的存储也和MYSQL默认的存储位置不一样,在windows下面,一般来说是在c:\windows\temp目录下,而在unix/linux环境里通常在/tmp或/var/tmp/或/usr/tmp目录下。这个子目录是可以在mysql启动时进行配置。
除了上面这些常用的数据表类型,mysql还支持一些其他数据表,但这需要自行编译时加入或者直接使用MAX版本的数据库。要想知道你的数据库支持哪些类型的数据表,你可以通过执行:show engines来查看。
MYSQL所支持的数据表还有:BDB表,ARCHIVE表(压缩数据表,从4.1开始支持),CSV表(4.1开始支持),NDB表(mysql集簇,4.1开始支持),FEDERATED表(外部数据表,5.0开始支持)
下面简单的介绍一下,都是看来的,因为我都没有用过,黑黑
1、BDB表,这是最早具备事务功能的MYSQL数据表,但随着innodb驱动的日趋成熟,BDB已经几乎没有人使用了。
2、ARCHIVE表,和前面的提到的Mysql Compress表差不多,都是用于保存和备份数据而设计的。这种类型的表的优点是在保存数据之前会先对数据记录进行压缩。它只允许使用INSERTR命令,不允许执行UPDATE和DELETE命令。因为该表不允许数据被修改,同时,ARCHIVE表不支持索引,如果要进行SELECT操作,就必须遍历全部数据。因此,它只适合用于一些数据访问量很小的场合。
3、CSV表,这种类型大家应该很熟悉了,在使用excel的时候,就可以把数据存为CSV文件,一般采用逗号分割。基本上就是一文本文件,所以不支持索引功能。
4、NDB表。NDB集成在MYSQL MAX的版本中,是属于mysql集簇功能中的一种。NDB是英文network database的缩写,由名字也可以看出,它一般用来建设数据分布在大量计算机上的网络数据库,该表类型支持事务功能。如果需要使用该功能,必须在多台装有mysql max版本的联网计算机,并配置使他们都支持集簇功能时,才可以使用。
5、FEDERATED表。这种表的类型可以让用户去访问外部数据库里的数据表,而那个数据库系统可以位于本地网络中的另一台计算机上。在目前的MYSQL版本里,该功能所支持的外部数据库也必须是MYSQL,但未来,应该是可以支持更多版本。个人感觉,这就象一个proxy一样。在现有的版本里,通过FEDERATED进行的查询和事务都没有办法使用Query Cache工具优化,也不支持外部数据表的结构修改,但可以修改数据。即使用FEDERATED表时,不能使用alter table命令,但可以使用insert,update和delete命令。
最多的信息,也可以查看:http://dev.mysql.com/doc/mysql/en/storag-engines.html。
接下去就是介绍数据表文件和MYSQL所支持的一些数据类型了。
Tags: mysql, 精通, 数据库, 连载
DataBase | 评论:0
| 阅读:555
Submitted by gouki on 2008, September 11, 10:15 PM
前段时间搞的phpoo.com,好象,没有办法使用mail.phpoo.com进行访问,在网上查找了一下原因才发现,原来,google.com提供的cname,在国内是无法访问的,所以,只能通过https://mail.google.com/a/phpoo.com来进行访问,一下子感觉好不方便啊。
于是跑到live.com上面申请live domains的服务,而且,还能用来当作live messae的ID哦。现在已经开放申请了。
在每个内容详细页面,右边都有一个申请的图标,点击sign up,就可以开使申请了。
这个域名,我该用来提供一些其他什么服务呢?真犹豫啊。
谁给我点好建议?
Tags: neatdns, 邮箱, 注册, 开放
Software | 评论:0
| 阅读:559
Submitted by gouki on 2008, September 11, 9:40 AM
今天,又是911了,不知道这个日子大家还能记得多少,不过我想估计大家也就记得:摩天大楼断层,五角大楼缺角吧。但更多的,我还是想起了那些逝去的生命。
从军五年,虽然没有上过火场,但身边或者周围还是经常可以看到,住在虹口的时候,也是动不动就看到消防队员的出动。每年也基本上都会去公安博物馆参观一下,怀念一下那些英模和英烈。基本上每年也都有消防队员的生命在救灾中消失,也很痛苦。和平年代,消防兵应该算是最危险的兵种了吧。可是国内每年都在播放纪念这种部队纪念那种部队,却没有人会拍电影来反映一下消防部队的。
香港、美国都曾拍过烈火雄心之类的电影,可是我们国内呢?虽然在国外,消防并不是兵种之一,只是一种职业,但这种职业却是十分高尚的,也是最危险的。即使911的时候,也是消防队员最早冲进去救人。
又发牢骚了。再次纪念一下那些逝去的生命。
Tags: 911, 生命, 纪念
Misc | 评论:2
| 阅读:1024
Submitted by gouki on 2008, September 11, 9:38 AM
前两天我们介绍了myisam和innodb两种类型的表结构,可是:to be or not to be ,that's a question。
在我的实际应用中,我到底应该选择哪个呢?用myisam还是innodb,确实是让人伤脑筋的问题。所幸,这两种表结构可以存在于同一个数据库中,DBA们也就可以根据实际应用来设计数据表是使用哪种类型的了。
虽然一般情况下认为myisam的存取速度超过innodb,但这也不是绝对的。确实innodb所占用的空间要比myisam大的多,但是相对的,innodb在存储数据时,是行锁定,而并非myisam的表锁定,所以,在这一点上,又不能说谁快谁慢了。
相对于安全性方面,innodb毫无疑问是首选,至少不用再担心多人同时操作表时会发生什么意外的状况了。可是从节约时间和空间上来选择,myisam又是远超innodb。
究竟应该选用哪种呢?实在是一个非常头疼的问题。所以说,一般情况下只能根据系统的需求来决定到底使用哪种类型的表结构。如果你为了追求速度,认为数据丢失一条两条无所谓,错误一下问题也不大,那么毋庸置疑,myisam是首选。如果需要用到事务,那innodb就是不得不选的。如果你实在没法确定需要哪种类型的表结构,那么,创建两个不同类型的表,逐步增加数据量的大小,多测试几个重要的SQL(以后系统中可能会使用的SQL),看看哪个效率更高就选择哪个。
虽然这些都是根据特性来选择的,但我们也不能忽略服务器自身的配置。如果服务器是8核、12G内存,却只用来处理一个小小的留言板,你还会在乎是使用哪种类型的表结构吗?
官方网站上也有关于这两种数据表在细节方面的优劣对比:http://dev.mysql.com/doc/mysql/en/innodb-restrictions.html
随便说说而己。。。明天继续介绍heap表和一些不常用的表结构类型。
Tags: mysql, innodb, myisam, 选择, 连载
DataBase | 评论:0
| 阅读:530