本人曾经号称Linux+Apache+MySQL+PHP环境的搭建是闭着眼睛也能做的事情。历史上也的确曾经无数次闭着眼睛半小时就能搞定从下载到编译到最终配置成生产环境的服务器整个过程。然而昨天遇到的一切,却实实在在让我睁开眼睛集中精力总计用了8个小时才部署起一套Linux+Apache+MySQL+PHP+Ruby on Rails。
回忆总是痛苦的,不过为了大家不再痛苦重蹈覆辙,我还是愿意重走长征路,分析一下我犯过的错误吧。

1. Are we ready for x64?

我们实验室的德国学弟向来使用Linux。当年他到我们这里来的时候,作为网管的我需要给他安装一套英文版操作系统。我手上有Windows Server Computing Cluster Edition,正好是英文版,而且是正版,可惜是64位系统。在我询问他的过程中,他问我觉得64位版本的Windows怎么样。我回答”Only more troubles.”,他笑,告诉我看来Windows并没有准备好,还是Linux的64位支持比较好吧。其实我还是持某种怀疑态度。
我觉得,作为生产环境的网络管理员,使用64位版本操作系统总是要三思的事情。因为有太多太多兼容性问题需要考虑。在这方面,好像其实Windows做的反而更好一些,因为.NET编译的exe程序拿到64位版本Windows上不需要重新编译直接就可以原生64位地运行。64位Windows中还包含一个32位虚拟机,可以近乎完美地模拟32位环境,提供向下支持。
Linux就不是这么幸运了。很多库都没有考虑过这些问题,这也是导致这次部署麻烦多多的根源。

2. 64位Fedora 9和32位Fedora 10

今天用的机器是一台IBM x3200服务器。本来上面装好Fedora 9的64位版本。因为很久没登陆上去,我并不知道这是一台跑着64位版本的系统。
于是上来安装Apache,似乎一切顺利。下载最新版MySQL,版本5.1的二进制版本并安装,也没有遇到什么问题。
然后安装PHP,配置make使用以下命令:
[code=’c#’]
‘./configure’
‘–with-mysql=/usr/local/mysql’
‘–with-apxs2=/usr/local/apache/bin/apxs’
‘–with-zlib’
‘–with-bz2’
‘–with-gd’
‘–with-png-dir=/usr/lib’
‘–with-zip-dir=/usr/lib’
‘–enable-track-vars’
‘–enable-exif’
‘–enable-mbstring’
[/code]
然后出现错误:
[code=’c#’]
checking for MSSQL support via FreeTDS… no
checking for MySQL support… yes
checking for specified location of the MySQL UNIX socket…
no
checking for MySQL UNIX socket location… no
checking for mysql_close in -lmysqlclient… no
checking for mysql_error in -lmysqlclient… no
configure: error: mysql configure failed. Please check
config.log for more information.
[/code]

3. 错怪MySQL 5.1

接下来我犯下了第一个错误:让新闻影响了经验。我受到影响的新闻是:MySQL创始人力劝用户暂缓部署MySQL 5.1,鉴于我不下10次地用这个配置命令装过LAMP环境,我第一个矛头指向了MySQL 5.1。
然后我在Google中发现,这个问题被当作Bug在MySQL的项目管理和PHP的项目管理系统中多次出现:

我看到几种所谓解决方案:

  • 主张将“–with-mysql=/user/local/mysql”改成“–with-mysql-dir=/user/local/mysql”
  • 主张将Makefile里面的-L/usr/lib/mysql改为-L/usr/lib64/mysql

我犯的第二个错误是过于自信,其实现在看起来有很多地方提升我,这个问题是由64位的Linux导致的,但是盲目的我当时选择了视而不见。

4. Ruby on Rails

为了避免将来更多的麻烦,我选择了最复杂的方式:换64位Fedora到32位Fedora 10。接下来的过程很顺利。
全部安装好之后我决定把原来实验室的Redmine也搬进来,于是需要集成Passenger到Apache中。
使用yum和gem安装Ruby on Rails的过程只需要用愉悦来形容,很顺利。
在gem装好Passenger之后,执行:
[code=’c#’]
passenger-install-apache2-module
[/code]
的时候出现一个小细节,Passenger安装脚本发现Apache在/etc/sbin/httpd下,其实我安装在/usr/local/apache下。这时候需要用几个环境变量来纠正一下。
[code=’c#’]
export APU_CONFIG=/usr/local/apache/bin/apu-1-config
export APR_CONFIG=/usr/local/apache/bin/apr-1-config
[/code]

懒惰、急躁和骄傲。——拉里·沃尔

只想说说懒惰,因为我很急躁,没时间瞎扯,此外我很骄傲,我觉得其他两点可以暂时不说。
懒惰说的是当程序员想做一件事情的时候,他(她(囧(我不是性别歧视)))的时候,会先假设这件事情别人已经做过了,然后只需要找到这段代码,拿过来用就好。
无可非议吧。

这样导致了一群蜕化的程序员:我们基于.NET上可以非常非常强大,写出一个一个Killer Apps,我们讲究算法研究,即便是.NET程序依然觉得%比/还要慢很多很多。
然而对于传统的RFC之类的东西,已经没人关注。现在,谁又能告诉我RFC 1945RFC 2068说了些什么呢?

口口声声号称互联网解决方案专家的人们却连基本的HTTP协议头都说不清楚了。

[singlepic=18212,640,610]

Redmine.NET是我最近一段时间的心血。在之前我曾经写过几篇Redmine的博文,Redmine我也一直在用。现在既然DreamHost支持Ruby,何不建一个Redmine给自己管理项目呢?
一开始是这么想的,但是发现Redmine.NET域名尚未注册我立刻心动了。那段时间Godaddy被GFW掉,我冒着一定的风险用PVN连上Godaddy注册到了这个域名。真的是很难得。
做到现在也快一个月了吧,现在把自己个人SVN里面的东西全都搬进去了,感觉超方便。尤其是事情多的时候,在Issues里面自己给自己提一下,总归不会忘记的。
我给Redmine.NET的定位是“免费的项目管理平台”,目标是像SourceForge一样给开源项目提供家。不过就我自己的力量肯定是不行的,暂且先做我的项目管理系统吧。

今天寻找一个写好的MD5加密类想做个文件校验工具,在Google里搜索“MD5”看到的第一个搜索结果让我震惊:

[singlepic=18209]

这是一个提供在线MD5破解的网站!
虽然当年的山东大学副教授王小云冲上国际密码大会的讲坛公布了对对MD5、HAVAL-128、MD4和RIPEMD的破解成果后,MD5已经被认为是不安全的。不过据王小云原始算法,破解MD5至少也要比较好的计算机计算几个小时能够找出一个碰撞而已。注意,碰撞,而不是破解。用碰撞密码可以一样实现登陆,但是知道破解,就意味着拿到密码明文。相比所有人的密码多少都有那么一点点意义在里面,被人知道你使用的密码的含义和规律是多么可怕的一件事情!
这个网站,提供在线MD5破解的查询,简单说,就是已知一些密码的MD5,然后把密码和MD5一起存起来,供人查询。当人们提交的MD5足够多,或者达到覆盖大部分有含义字符串后,就达到了比较好的破解效果。

本站4T硬盘已经上线,共有MD5记录457,354,352,282条,宇宙第一,且还在不断增长中,已包含12位及12位以下数字、8位字母、全部7 位及以下字母加数字等组合,并针对国内用户做了大量优化,例如已经包含所有手机号码、全国部分大中城市固定电话号码、百家姓、常用拼音等大量组合,另加入了大型网站真实会员密码数据100万条。本站数据量大,查询速度快,同时支持16位及32位密码查询。通过对10万会员的真实动网论坛样本数据的测试,本站对于动网论坛密码的命中率达到83%。全国独此一家。另感谢一热心网友给本站奉上数百万条数据库原始密码样本,大大提高了命中率!

我来说说为什么震惊。

隐患及应用情景

网络管理员要求第一要政治过硬,他能看到很多东西,设计为人类不该看到的,但是他要禁得住这份诱惑,坐怀不乱…
但是不是每个网络管理员都是这样的人。首先我们可以相信,大型商业网站的网络管理员,在公司制度的限制下,是政治合格的。
但是在我们的生活中还是大量地用到了MD5,比如国内大部分论坛至少是Discuz和动网,这两家都采用MD5加密。论坛是如此之多,甚至不可能没有人不使用基于MD5的论坛等。一旦你的论坛注册信息出现在一个政治不可靠的网络管理员面前,问题就出现了。如果你的密码比较弱,他是可以通过在线破解查询到明文的。注意,是明文。因为找到碰撞并不是什么大事,他本身已经是网络管理员,不需要明文也能把你密码改掉,看到你在这个站的信息。
比如说,我看到123456的MD5是e10adc3949ba59abbe56e057f20f883e,于是我忍不住拿e10adc3949ba59abbe56e057f20f883e在同济网数据库里用户表里搜了一下,发现有5293个用户的密码是123456…P.S. 同济网总计233959个用户,2.2%的经典懒人。
问题是你还可能留下一个真实邮箱,或者没留下真实邮箱,但是用了“主号”当作用户名注册,这样很容易Google到你的邮箱。
虽然邮箱服务可能使用非MD5加密的形式,这样拿MD5的碰撞去登陆自然失败,问题是他拿到的是明文,这样任何加密都会失败。
一旦邮箱被攻破…基本上你在互联网的身份就已经被盗用了(告诉我你邮箱里没东西,我只能说你是土人了)。
这自然是一个严重的安全隐患吧!

个人密码的Best Practices

一个人至少有两组密码。银行卡6位数字密码那是没办法,网络上使用的密码肯定是另外一组。懒人是如此之多,以至于同一个密码到处用的人太多太多。最好的密码策略是使用分级密码,一个人应当设计至少五组密码。按照密码等级介绍如下:

  • 公用银行卡密码:对的,公用,比如这张卡你和家人一起用,这是最简单的,有意义的6位数字密码。建议用电话号码变换一下(如第二位到第七位,或第三位到第五位重复两遍),这样大家都清楚,密级也不算太低。
  • 私有银行卡密码:私房钱之类的,只有自己知道的密码。因为是6位数字,密级高不了。
  • 公共论坛注册密码:要有一定复杂度的,注册的时候尽量不用真实邮箱,必须要验证的时候用一个非主要邮箱。
  • 工作计算机密码:为什么工作计算机要单独设置密码呢?因为总有的时候,当你不在计算机旁边时,有急事发生,这时候你必须授权另外一个人打开你的计算机获取一些资料,这时候就要口述密码。建议这个密码等级不能太低(Windows域要求字母数字和符号),但是也容易记忆,而且便于口述,且与等级最高的密码生成规律不同。这样授权结束后,你可以继续按照这个密码的生成规律再生成一个新的密码即可。
  • 支付宝密码:这个密码需要一定复杂度,因为直接和钱相关。在极少的情况,这个密码也要授权给别人的。可以按照工作计算机密码等级去设置。
  • 信息中心密码:最高级的密码,这个密码管理你的个人信息中心,如QQ、主Email和个人计算机。这个密码的泄露,基本就完蛋了,别人可以伪装成你,这个问题就大了…

论坛和Email还在使用同样密码的孩子们,快改密码吧。

前几天Google黑板报上出现了一篇介绍新产品的帖子,《看图新体验,贴图新选择:谷歌看图、谷歌贴图论坛插件发布》。按理说,Google发布新产品咱都得去捧捧场,看看有啥新想法不是。进去一看大惊:谷歌看图(Google Viewer)和谷歌贴图(Google Uploader)居然标称:谷歌看图支持Discuz! 6.0及其以上各个语言及编码版本。

[singlepic=18208]

Google啊,Google是做平台的,目的是和微软一样一统天下,你们都用我的,我说了算。这下怎么和Discuz搞起来了?
决定学习一门技术的时候主要有两个考量,第一个是是否很快上手,比如有C基础的人接下来学C++、C#和JavaScript以及PHP都是正常的事情,学Ruby就费点劲。第二个是有没有前途,现在相信没人去学ASP(非ASP.NET)和Foxpro了吧,没前途不是。当然这个事情也不是绝对的,全靠命。参加这篇文章:《Windows Azure使COBOL焕发新机》
其实还有一个重要因素,说出来有点崇洋媚外嫌疑,就是这个东西是谁推出的,基本上国外公司推出的平台会好一些。咱都是中国人,中国人怎么做事情在学校咱都看得清楚,忽悠人是必然的,中国产品说10估计也就只能信其5。外国人比较纯洁,至少人家觉得欺骗别人是比较大的错误吧。所以平时我用的东西都是国外品牌,而且我从来不用百度(除了搜盗版MP3的时候…中国人嘛)。
说说Discuz怎么了。Discuz的确是我见过的最好的论坛程序,并且开源且免费。要命的是Discuz年年一个大版本号,5.0,6.0,7.0,更要命的是每个大版本都互相不兼容啊!辛辛苦苦为前一个版本开发的模板和插件,换了新的大版本号,就要做不小的修改。
真搞不懂Google为什么会去趟这滩浑水。还是因为谷歌不等于Google?

此番人民币升值,稳固了Godaddy作为我的主要域名注册商的位置…
虽然我很厌恶Godaddy一副典型老牌美国电子商务网站乱七八糟的排版,但是价格说明一切。
11月初的某天,忽然就被GFW了。好郁闷,中间注册了两个域名都是用VPN注册的,也不知道这样子用的https是不是还是安全的。
今天忽然发现Godaddy被解禁了啊。其实我是不反对GFW的,毕竟屏蔽些敏感网站对国内形势有帮助,尤其是在这样一个普遍教育程度不高的国家。只是,因为拿不到奥运冠军名字的cn域名就去屏蔽GFW,或者因为NotePad++的作者说了那么几句话,就去屏蔽SourceForge,无疑是杀鸡取卵的自杀行为,屏蔽SourceForge,这不就等于屏蔽中国IT产业吗?
Anyway,看到一个域名没被注册,很适合GFW:NAINAI.DE