本人曾经号称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]