数字化技能提升教程,数字化时代生存宝典

数字化百科 / 词条 / 在Unix和类Unix系统中的编译和安装Apache

在Unix和类Unix系统中的编译和安装Apache

查看全部词条命名空间:Main

本文仅阐述Apache在Unix和类Unix系统中的编译和安装

像其它许多开源项目一样,Apache使用libtool和autoconf建立编译环境。

如果你只进行很小的版本升级(比如2.2.54→2.2.55),请直接跳转到下面的升级部分。

针对心急者的概述

下载 $ lynx http://httpd.apache.org/download.cgi

解压 $ gzip -d httpd-NN.tar.gz

$ tar xvf httpd-NN.tar

$ cd httpd-NN

配置 $ ./configure --prefix=PREFIX

编译 $ make

安装 $ make install

配置 $ vi PREFIX/conf/httpd.conf

测试 $ PREFIX/bin/apachectl -k start

其中NN必须用当前的副版本号替代;PREFIX是服务器被安装到文件系统中的路径名,如果没有指定PREFIX,默认会装到/usr/local/apache2

下面从编译和安装Apache httpd的要求开始详细阐述编译和安装的每个步骤。

== 要求 ==

编译Apache的要求如下:

磁盘空间

必须保证有50MB以上的自由临时磁盘空间。Apache安装完毕后会占据10MB左右的空间,实际的磁盘空间需求会因编译设置和是否安装第三方模块而有所不同。

ANSI-C编译器及编译环境

必须装有ANSI-C编译器,推荐使用自由软件基金会(FSF)的GCC。如果没有GCC,那么要确保使用的编译器符合ANSI标准,而且PATH中必须包含指向基本编译工具比如make的路径。

确保准确的时间

由于HTTP协议的元素都会用到时间,有必要了解一下你的系统所使用的时间同步机制。在基于网络时间协议(NTP)的系统中,一般是用ntpdate或xntpd来同步时间。有关NTP软件的资料请参见NTP主页。

Perl 5 [可选]

有些用Perl写的支持脚本,如apxs或dbmmanage ,需要Perl5解释器(5.003或以上的版本就足够了)。如果系统中存在多个Perl解释器,比如有系统提供的Perl 4,还有你自己安装的Perl 5,推荐你使用 --with-perl 选项来确保configure脚本使用正确的版本。如果configure没有没找到Perl 5也没关系,这并不影响Apache httpd的编译和安装,只是相关的支持脚本不能使用而已。

apr/apr-util >= 1.2

apr和apr-util包含在Apache httpd的发行源代码中,并且在绝大多数情况下使用都不会出现问题。当然,如果apr或apr-util的1.0或1.1版本已经安装在你的系统中了,则必须将你的apr/apr-util升级到1.2版本,或者将httpd单独分开编译。要使用发行源代码中自带的apr/apr-util源代码进行安装,你必须手动完成:

# 编译和安装 apr 1.2

cd srclib/apr

./configure --prefix=/usr/local/apr-httpd/

make

make install

# 编译和安装 apr-util 1.2

cd ../apr-util

./configure --prefix=/usr/local/apr-util-httpd/ --with-apr=/usr/local/apr-httpd/

make

make install

# 配置 httpd

cd ../../

./configure --with-apr=/usr/local/apr-httpd/ --with-apr-util=/usr/local/apr-util-httpd/

[译者添加] apr与apr-util的configure选项

由于语法、配置选项、安装目录、系统类型、环境变量部分与httpd的configure完全相同,所以这些部分略过不表。

用于apr的configure脚本的选项

可选特性

--enable-experimental-libtool

启用试验性质的自定义libtool

--disable-libtool-lock

取消锁定(可能导致并行编译崩溃)

--enable-debug

启用调试编译,仅供开发人员使用。

--enable-maintainer-mode

打开调试和编译时警告,仅供开发人员使用。

--enable-profile

打开编译profiling(GCC)

--enable-pool-debug[=yes|no|verbose|verbose-alloc|lifetime|owner|all]

打开pools调试

--enable-malloc-debug

打开BeOS平台上的malloc_debug

--disable-lfs

在32-bit平台上禁用大文件支持(large file support)

--enable-nonportable-atomics

若只打算在486以上的CPU上运行Apache ,那么使用该选项可以启用更加高效的基于互斥执行的原子操作。

--enable-threads

启用线程支持,在线程型的MPM上必须打开它

--disable-threads

禁用线程支持,如果不使用线程化的MPM ,可以关闭它以减少系统开销。

--disable-dso

禁用DSO支持

--enable-other-child

启用可靠子进程支持

--disable-ipv6

禁用IPv6支持

可选的额外程序包

--with-gnu-ld

指定C编译器使用 GNU ld

--with-pic

只使用 PIC/non-PIC 对象[默认为两者都使用]

--with-tags[=TAGS]

包含额外的配置

--with-installbuilddir=DIR

指定APR编译文件的存放位置(默认值为:'${datadir}/build')

--without-libtool

禁止使用libtool连接库文件

--with-efence[=DIR]

指定Electric Fence的安装目录

--with-sendfile

强制使用sendfile(译者注:Linux2.4/2.6内核都支持)

--with-egd[=DIR]

使用EDG兼容的socket

--with-devrandom[=DEV]

指定随机设备[默认为:/dev/random]

用于apr-util的configure脚本的选项:

可选的额外程序包

--with-apr=PATH

指定APR的安装目录(--prefix选项值或apr-config的路径)

--with-ldap-include=PATH

ldap包含文件目录(带结尾斜线)

--with-ldap-lib=PATH

ldap库文件路径

--with-ldap=library

使用的ldap库

--with-dbm=DBM

选择使用的DBM类型DBM={sdbm,gdbm,ndbm,db,db1,db185,db2,db3,db4,db41,db42,db43,db44}

--with-gdbm=PATH

指定GDBM的位置

--with-ndbm=PATH

指定NDBM的位置

--with-berkeley-db=PATH

指定Berkeley DB的位置

--with-pgsql=PATH

指定PostgreSQL的位置

--with-mysql=PATH

参看INSTALL.MySQL文件的内容

--with-sqlite3=PATH

指定sqlite3的位置

--with-sqlite2=PATH

指定sqlite2的位置

--with-expat=PATH

指定Expat的位置或'builtin'

--with-iconv=PATH

iconv的安装目录

== 下载 ==

Apache可以从Apache HTTP服务器下载站点及其镜像站点下载。大多数类UNIX系统的Apache用户最好的选择是下载源代码并编译一个适合自己的版本,这个过程(下面将要讲述)是很简单的,它允许你根据自己的需求进行定制。另一方面编译好的二进制版本通常没有进行及时的更新。如果你下载的是编译好的二进制版本,请按照其中的INSTALL.bindist文件进行安装。

下载完毕后,应该对下载来的tar包作PGP签名校验,以确保其完整而且未被篡改过。(PGP下载页面)

== 解压 ==

解压Apache httpd的tar包很简单:

$ gzip -d httpd-NN.tar.gz

$ tar xvf httpd-NN.tar

这样就在当前目录下新建了一个包含发行版源代码的目录,必须cd进入这个目录以继续服务器的编译。

== 配置源代码树 ==

这一步是根据你的特定平台和个人需求配置源代码树。位于发行源代码根目录的configure脚本会完成这个步骤(对下载Apache CVS版源代码的开发者,需要装有autoconf和libtool ,并需要执行buildconf ,对于官方的发行版则没这个必要)。

要想用所有的默认值配置源代码树只要简单的执行 ./configure 命令就可以了,同时configure还可以接受命令行参数以改变默认值。

最重要的选项是Apache安装目录的前缀:--prefix ,因为Apache需要知道这个目录才能正常运作。更多的微调选项请参考配置选项详解。

这样,你就可以通过在配置选项中指定要启用或禁用哪些模块来定制Apache的特性。Base组的模块默认包含在Apache中。其他组的模块可以通过 --enable-module 指令启用。其中module是模块名去掉"mod_"并将下划线转换成连字符后的字符串。你也可以使用 --enable-module=shared 指令将模块编译为可在运行时加载和卸载的动态共享对象(DSO)。同样的,你也可以使用 --disable-module 指令禁用Base组的模块。注意,使用这些指令的时候configure不会对你拼写错误的模块发出警告说找不到某某模块,而只是简单的忽略这个选项。

另外,有时候还必须提供给configure脚本关于编译器、库、头文件位置的更多信息。这些可以通过环境变量或者命令行选项传递给configure脚本。要了解更多信息,请参考配置源代码树。

为了让你对能指定什么有一个简单的印象,此例演示编译Apache ,并将其安装在/sw/pkg/apache目录,指定了一个特定的编译器以及编译参数,而且允许今后将两个附加的模块mod_rewrite和mod_speling通过DSO机制在运行时动态加载:

$ CC="pgcc" CFLAGS="-O2" \

./configure --prefix=/sw/pkg/apache \

--enable-rewrite=shared \

--enable-speling=shared

configure需要运行几分钟,以测试指定的功能在你的系统中是否有效,并建立稍后编译时所需的许多Makefile文件。

== 编译 ==

运行以下命令你就可以编译Apache的各个部分了:

$ make

请耐心等候,因为对一个基本配置的编译,需要运行几分钟左右,实际需要的时间会因为你的硬件和选择的模块数量有很大不同。

== 安装 ==

现在可以在PREFIX目录(参见上述的 --prefix 参数)下安装了,执行:

$ make install

如果是升级,安装程序不会覆盖你的配置文件和文档。

== 配置 ==

接着,通过修改PREFIX/conf/目录下的配置文件,来配置Apache HTTP服务器。

$ vi PREFIX/conf/httpd.conf

docs/manual/下有Apache使用手册,http://httpd.apache.org/docs/2.2/有最新的文档,你还可以查看完整的指令索引。

== 测试 ==

现在,可以执行下述命令立即启动你的Apache HTTP服务器:

$ PREFIX/bin/apachectl -k start

你应该可以用http://localhost/来请求你的第一个网页了,这个网页位于DocumentRoot目录下,通常是PREFIX/htdocs/ 。随后,可以这样停止服务器:

$ PREFIX/bin/apachectl -k stop

== 升级 ==

升级的第一步是阅读源代码目录中的发布公告(release announcement)和CHANGES文件以寻找可能会对你的站点产生影响的变化。如果主板本号的变化(例如1.3→2.0或2.0→2.2)表明编译时和运行时的配置发生了重大变化,需要手动调整,所有模块也需要升级以兼容新版本的模块API 。

小幅度的版本升级(例如:2.2.55→2.2.57)很容易。make install 的过程不会改写任何已经存在的文档、日志、配置文件。此外,开发者也会尽量兼容上一版本的configure选项、运行时配置、模块API 。大多数情况下,你将能够使用与上一版本完全相同的configure命令行和运行时配置,而你原来的所有模块也将正常工作。

如果你保存了上一次安装后build子目录中的config.nice文件,升级将更加平滑。这个文件精确地保存了所有对目录树进行配置的configure命令行。你只需要将config.nice文件复制到新的源代码目录树的根文件夹并进行你希望的修改后,然后运行下面的命令即可完成升级:

$ ./config.nice

$ make

$ make install

$ PREFIX/bin/apachectl -k graceful-stop

$ PREFIX/bin/apachectl -k start

你应该总是在将新版本的Apache投入正式运行前,对这个新版本进行足够的、针对你的实际运行环境的测试。比如,你可以使用一个不同的 --prefix 设置将新版本安装在一个不同的目录,并使用Listen指令在一个不同的端口监听。经过一段时间的测试以发现可能存在的问题,然后再做出最后的决定。