善意提醒

如果您打开本站很慢,布局排版混乱,并且看不到图片,那么可能是因为您还没有掌握用科学的方法上网的本领。
显示标签为“MySQL”的博文。显示所有博文
显示标签为“MySQL”的博文。显示所有博文

2006-04-20

服务器整备手记(二)

装好了操作系统之后,接下来就是安装各种应用系统了。按照计划,这台服务器的主要工作任务,是作为 Oracle 中心数据库服务器,以及 Web / WAP / 流媒体服务器。中心数据库目前可能还用不上,因为必须要周围的应用系统也要进行相应的修改才能使用它,所以前期的主要用途就落在做Web服务器了。

Linux 下架设 Web 服务器,Apache 肯定是不二之选了。数据库除了以后要安装的 Oracle,MySQL 也要装上。按照计划,一些轻量级的、独立的应用,将用 MySQL 来作数据库,以便与主数据库隔离开,也方便今后这些系统和主营系统进行分离。至于服务器端脚本,计划支持 Perl CGI / PHP / JSP,先以我最熟悉的 PHP 进行安装吧。

PHP要支持的功能,包括:iconv、XML、MySQL 5 Client(废话)、GD(PNG/JPEG)、ZLIB、Oracle。其中,XML 和 ZLIB 是自带的,Oracle 功能依靠以后安装的 Oracle 客户端。其他功能都需要相应库文件的支持。因此,先要把以下的库安装或升级好:

  1. libiconv-1.9.2.tar.gz(PHP 需要它来提供 iconv 功能,以进行各种字符编码的转换。Linux AS 3.0 只带了动态链接库)
  2. gettext-0.14.5.tar.gz(它有用到 libiconv,因此放在第二位)
  3. openssl-0.9.8a.tar.gz(Linux AS 3.0 有自带,不过是 0.9.7a 版本的)
  4. jpegsrc.v6b.tar.gz(让 PHP 的 GD 功能能够对 JPEG 图片进行操作)
  5. libpng-1.2.2-25.src.rpm(让 PHP 的 GD 功能能够对 PNG 图片进行操作。Linux AS 3.0 有自带,不过是 1.2.2-16 版本的)

其中要注意的是,除了 openssl 可以装在 /usr/local/openssl,其它的几个库都最好设置 --prefix=/usr。这样以后编译 PHP 的时候可以省点心。特别是 libiconv,如果按默认设置装在 /usr/local 下面,那启动 Apache 都不行的。原因?ldconfig 默认的配置不包含 /usr/local/lib。

另外,libpng 是一个 src.rpm 包,安装步骤如下:

rpm –ivh libpng-1.2.2-25.src.rpm
cd /usr/src/redhat
rpmbuild –bb SPECS/libpng.spec
rpm –Uvh RPMS/i386/libpng-devel-1.2.2-25.i386.rpm

尤其要注意的是这最后一步。选项用 U 而不用 i,是因为系统内已经有了 1.2.2-16 的版本了,若用i则会提示有文件冲突。而且,一定要安装这个 devel 版本的包。若安装 libpng-1.2.2-25.i386.rpm,将会发现静态链接库不会出现。

好了,现在一切就绪,可以开始 APM 的安装了。MySQL 无论何时装都可以,我就先装了。根据 INSTALL-BINARY 文件内的提示,可以很容易地搞定。最后把 support-files/my-medium.cnf 复制为 /etc/my.cnf,并把 support-files/mysql.server 复制为 /etc/init.d/mysqld。然后 chkconfig –add mysqld,添加其为系统服务,运行 setup 打开它的启动选项。reboot 测试,OK。

  • 编译 Apache,编译选项是:--prefix=/usr/local/apache2 --enable-so --enable-ssl --with-ssl=/usr/local/openssl --enable-rewrite
  • 编译 PHP,编译选项是:--with-apxs2=/usr/local/apache2/bin/apxs --enable-inline-optimization --with-xml --with-iconv=/usr --with-gd --with-zlib-dir=/usr/lib --with-mysql=/usr/local/mysql --with-jpeg-dir=/usr --with-png-dir=/usr/lib

由于以前已经在不同的机器上配置测试过多次,选项都已经很固定了,因此安装过程非常顺利,乏善可陈,按下不表。

2006-03-24

OpenBSD研究手记(六)

把 OpenBSD 重装了。

这次,严格使用从来没使用过的密码(用生成器生成),以免它被攻破之后危急其它的系统。
按照以前的经验,重新安装 Apache2,这次没有遇到任何困难。在新电脑上架设的虚拟机也升级到了 5.5.1,而且硬盘没有使用压缩模式,因此编译、安装的速度快了很多很多。

安装完 Apache2 之后,我把虚拟机停掉,将整个目录打包作了个备份。这样,以后要是安装时出了什么差错,起码系统可以回到这个还原点上。

接着,安装 MySQL。这次我不用那个 5.0.19 的源代码分发包了,改用从 http://www.openbsd.org/3.8_packages/i386.html 处下载的 MySQL 4.0.24 的二进制分发版本。这个版本比较奇怪,分为 Client 和 Server 两部分(这倒不特别奇怪),而且安装的路径不是通常的 /usr/local/mysql,而是直接丢在了 /usr/local/lib、 /usr/local/libexec、 /usr/local/include、 /usr/local/bin 等目录里面。我想,这大概是 BSD 上的 mysql 的安装习惯吧?当然,步骤还是一样,直接在 /usr/local 把它们解压掉就行。

然后,还是要建立 mysql 用户。不过,这个版本奇怪的一个地方在于。它要求创建 _mysql 组,而不是 mysql 组。因此:

groupadd _mysql
useradd -m -g _mysql mysql

当然,mysql_install_db --user=mysql 还是要运行的。然而,接下来要修改的权限又是一个麻烦的地方。因为它的安装路径和我以前装过的 for Linux 版本不一样,因此要修改的目录也就不同。

chown -R mysql /var/mysql
chgrp -R _mysql /var/mysql
chown -R mysql /var/run/mysql

这最后一个目录,一开始不一定有,运行一次 mysqld_safe 可能就会钻出来。

安装 MySQL,我瞥见压缩包里面有着各种 so 文件。估计这次编译 PHP 应该不有什么问题了,实际情况也是如此。很快地,我就又可以安装 discuz 了。
后面的过程和以前是一致的。这次 discuz 的运行没有遇到上次那样的问题。我用管理员帐号登录论坛,打开控制面板,OK,页面出现。不过,还是有点小问题。在「头像」的位置上,出现了一个页面错误的提示,说 Zend Optimizer 没有被安装。

我的确是在 discuz 的官方网站上看到过它需要 Zend Optimizer 的支持。不过既然它到目前为止都表现良好,那也许需要 Zend Optimizer 的只是其中的一小部分功能吧。我去 Zend Optimizer 的官方网站查找 for OpenBSD 的版本下载,结果却令我大失所望。网站上只提供 for OpenBSD 3.3 / 3.4 的版本的下载,连 3.7 都不支持,别说 3.8 了。

我只好下载了 Zend Optimizer 2.6.0 for OpenBSD 3.4。上传到 OpenBSD 服务器上解压,发现有一个 install.sh 可以执行。但执行的结果是告诉我 libm.so.1.0 这个文件不存在,继续执行,发现还有 libc.so.30.0 和 libutil.so.9.0 都找不到。locate 的结果发现,这三个文件的高版本都存在,只是名字不同而已。OpenBSD 为什么没有把不同版本的 so 文件给符号链接到一个通用文件名上的习惯呢?我手动创建了到这些低版本的符号链接,再执行 install.sh,得到的是一个错误。

查看 Zend Optimizer 的安装指南。上面说 OpenBSD 的安装方法是要把 ZendOptimizer.so 拷贝到 /usr/local/lib,然后在 php.ini 中增加两行配置:

zend_optimizer.optimization_level=15
zend_extension="/usr/local/lib/ZendOptimizer.so"

我一看我的 PHP 连 php.ini 都没有生成。看来功能全部是靠编译链接出来的。拷贝了一个 php.ini-recommended 到 /usr/local/lib,加上这两行。然后再检查 phpinfo(),果然 Zend Optimizer 在功能表中出现了。

整个过程还是比较曲折。综合评价后,我得出的结论是:

  • 目前,OpenBSD 确实是最安全的服务器操作系统之一,网络服务器(如路由、DNS、DHCP 等)的功能它肯定可以胜任;
  • OpenBSD 可以胜任一台 Apache + PHP + MySQL 服务器的工作;
  • 要在 OpenBSD 上安装 Oracle 是不行的,至少我没有找到 Oracle for OpenBSD 的任何版本。数据库只能指望 MySQL 和 PostgreSQL,而且最好是使用 OpenBSD 官方提供的版本;
  • 应用软件系统对 OpenBSD 的支持还不够,要想随时用上最新版本不是那么容易的。 

OpenBSD研究手记(五)

总算把 OpenBSD 的 Apache + PHP + MySQL 架设完毕,可以开始应用系统的安装了。

虽然目前比较急切的是 blog 的需求,但是我打算先用 discuz 来下手。discuz 可能不是很出名,它是一个国人开发的 PHP + MySQL 的论坛。号称自己比 LB5000 要好,特别是在性能和负载上面,但是我看了看界面,并不是很喜欢。不过 LB5000 是文本论坛,相信代码再怎么优化,在数据查询上还是有先天劣势的。

从 discuz 官方网站(也是一个论坛)上下载了 discuz 的 UTF-8 简体版论坛程序。不错,才 1.2x 个 MB,尺寸蛮不错的。按照安装指南,先解压到本地,然后用 FTP 上传到服务器。修改几个指定目录的权限为 777,编辑配置文件指明数据库连接字符串,然后运行安装脚本 install.php。只经过了很快的几个步骤,就安装完成了,可见有很多设置都是有默认值的。对比 LB5000 的安装,似乎要简单一些。

从安装脚本的执行情况来看,似乎没有什么错误,于是我又继续进行下面的操作。注册了一个用户,正常。用管理员登录,没问题。进系统设置看了看,选项太多,花了眼,又退了出来。打开控制面板……,出错了。

出现错误的 SQL 也打印了出来,错误信息也写在页面上,这点倒是蛮友好的。我看了看那行 SQL,没有什么问题,一个简单的连接查询而已。我在 MySQL Client 上手动执行这条语句,一样的错误。错误信息居然是「无法打开文件:./discuz/cdb_subscription.frm」。

去数据库目录下看了看,有这个文件在啊。ls -l、cat,都没有任何问题。而当我在 MySQL Client 里面 use discuz 之后试图 show tables 的时候,也出现了文件无法打开的错误。我想,这只有可能是 MySQL 本身有问题了。在重启过之后,问题依然无法解决。

真郁闷。最后决定,把虚拟机删了,一切重头来过。正好趁此加大它的硬盘,并把它放在新电脑上。这样一来空间不是问题,速度也要快很多。

OpenBSD研究手记(四)

终于轮到了最后的步骤,PHP。然而,没想到过程是意外的艰苦。按照以前设想的,以支持 MySQL、iconv、GD(PNG)、XML 为目的的 PHP 编译行动,却遇到了预想之外的麻烦。

当然,首先要准备好外围的库文件。要支持 iconv,需要 libiconv。要支持 GD,需要 libpng。而且我还得确认 libz 也要存在才行,GD 也需要它,虽然一般操作系统都有默认安装。

我个人比较喜欢用 locate 来在 Linux / Unix 系统上找文件。不过当前系统刚装,显然 locate 数据库中还没有信息,因此需要让数据库得到一次填充才行。在 RedHat Linux 上,可以通过 locate -u 来做到,可 OpenBSD 下面的 locate 根本没有 -u 这个选项。但是我知道 locate 的数据库肯定是有一个定期更新的定时事件的,通过查找 cron 的配置,我很快找到了 locate 数据库的更新者——/usr/libexec/locate.updatedb。这是个可执行程序,运行它就可以让 locate 自动扫描硬盘,生成所有文件的路径索引了。

用 locate,我轻易地发现了 libz,也确认了 libpng 和 libiconv 在 OpenBSD 上没有默认安装。这两个软件包,都可以从 http://www.openbsd.org/3.8_packages/i386.html(链接已失效)处下载。下载完了之后,将它们上传到 /usr/local,然后就地 tar -zxf 即可。多出来的 +DESC 和 +CONTENT 是一些说明性的文本,可以删掉。

外围的库文件准备好了。接下来,就该编译 PHP 本身了。我首先试用了在 RedHat Linux 上的 configure 参数。然而,在执行 ./configure 的时候出现了一些问题。按照提示的错误信息,我把 png.h 和 pngconf.h 在 /usr/include和/usr/local/include 处都做了 ln -s,并在参数中对 iconv、png 都手动指明路径。OK,configure 没问题了。

接下来是 make。这次出现了一些不同寻常的信息,说什么找不到 real path of libmysqlclient,只好编译成静态的版本。make install 之后,我草草修改了 httpd.conf,马上去看 phpinfo() 的结果。结果我沮丧地发现,除了 --with-apxs2 参数有生效,其它的参数全部都没有起作用。

当时我的机器非常的慢,完全编译一次要花二十分钟左右。因此我不得不第二天来接着处理这个问题。暂停一下,经过思考,我觉得,不可能所有的选项都有问题。我决定单独添加每个选项,逐个测试,看到底是哪个出了问题。而实践证明,这个方法是有效的。我发现会出问题的只有 --with-mysql=[dir] 这个选项,若去掉它,使用其它的选项都能正常编译。同时,也证明了 PHP 在编译的时候,选项的顺序也是可能会影响编译结果的。我之所以会仅仅生效一个 --with-apxs2,就是因为它的后面紧接着就是 --with-mysql=[dir],所以后面的选项全部失效掉了。

确定了是 MySQL 的问题就好说了。我注意到,不论是否在 --with-mysql 参数中指定 mysql 的安装路径,编译都能通过(这也正常,不指定路径,PHP 就使用自带的 mysqlclient 代码),但是若指定参数,就会出现那个错误信息。不过两者的 phpinfo() 并没有什么实质上的区别,mysqlclient 的版本都是 3.23.*。我试了一下,都无法连接 MySQL 5 的数据库。

无论如何都不行,我郁闷了。只有上 Google,嗬,还真有找到东东。一个叫 Kelly Martin 的人在 MySQL 的官方站点上报告了一条信息,说 MySQL for OpenBSD 3.8 的版本,别的都没有问题,就是和 PHP 4 / 5 编译的时候就会出错。他的帖子链接如下:

http://dev.mysql.com/doc/refman/5.0/en/openbsd.html(链接已失效)

按照他提供的办法。我从 MySQL 官方站点上下载了源代码分发版(5.0.19),根据他指定的参数进行了编译,然后安装 MySQL。果然,这次编译 PHP 不会出现问题了。phpinfo() 的信息也显示,mysqlclient 已经更新为 5.0.19 的版本。

然后,正式调整 httpd.conf 的内容。编辑主机名;修改 DocumentRoot;调整目录权限,把 Index 权限去掉;添加默认首页面文件名;调整编码字符集;至于 AddType application/x-httpd-php .php 那是早就做了。调整完后,重启 Apache,总算!大功告成!

OpenBSD研究手记(三)

装完 Apache,接下来应该是安装 MySQL 了。

若换在 Win32 系统上,应该是先装 PHP 比较合理。但在 Linux / Unix 系统上,这个顺序应该倒过来才对。因为在 Linux / Unix 下安装 PHP 是用编译的,而不是像 Win32 下面那样通过 extension 来进行扩展。而若编译时使用 PHP 自己带的 MySQL Client 库,那么生成的 PHP 引擎不能访问高版本(5.0.* 以上)的 MySQL 服务器。所以一定要先安装 MySQL,再编译 PHP,这样才能正常使用它们。

为了使用一些新特性……,其实,也是为了追新,我下载了 MySQL 5.0.19 的 for OpenBSD 3.8 的版本。和 MySQL 的许多版本一样,这是一个二进制代码分发版本。既然是特意为 OpenBSD 3.8 特意制作的版本,那我就受用啦。解压,安装,一切还算顺利。不过在安装和运行的时候,都出现了一些 warning 信息,说某些 so 库的版本不够,但是仍然「use it anyway」。既然它这么说,那我也就不管了。

一切都按照安装包内的指导进行。大致过程如下:

  1. tar -zxf 文件到 /usr/local,然后做一个 ln -s 到 /usr/local/mysql
  2. groupadd mysql,建一个组。这是按安装指南中的要求
  3. useradd -m -g mysql mysql

    建用户的时候,按照安装指南中的步骤是有问题的。useradd -g mysql mysql 会提示 /home/mysql 目录不存在。在 RedHat Linux 里面,新建用户时会自动创建它的个人目录的,但 OpenBSD 3.8 至少是不会。出错提示指出,要加一个 -m 参数。这参数还不能加在后面,一定要写成 useradd -m -g mysql mysql 才行,由此可见 OpenBSD 的外部命令对参数的顺序也是有讲究的。而且这个参数我在 man 里面没有找到。不知是因为这个特性是新近加上的还是一个疏漏?要人命的疏漏啊。

  4. 运行那个 mysql_install_db。安装脚本嘛,但一定要带上 --user=mysql,这样才有正确的权限。
  5. 设置权限。按照安装指南上的步骤,其实质就是要让 /usr/local/mysql 的用户归 root,组归 mysql,然后 /usr/local/mysql/data 的用户归 mysql,当然都是递归的。
  6. 手动启动的命令。mysqld_safe,还是要加 --user=mysql,而且还要用 & 来运行。土啊。不过也习惯了。
  7. 设置自动启动。这步我没做,因为我对于 OpenBSD 的自动启动部分还不太熟悉。

然后的步骤,是各种平台下面都要做的。首先把 'root'@'localhost' 和 'root'@'主机名' 的 MySQL 用户密码改掉。然后 Create Database,再 Grant 创建新用户。再做测试,就略过不提了。