# 在Microsoft Windows上编译Apache
在你开始编译Apache之前有许多重要问题需要注意。开始之前请先看看[在Microsoft Windows上使用Apache](#calibre_link-269) 。
## 系统要求
编译Apache需要正确安装以下环境:
* 磁盘空间
确保至少有50MB空闲磁盘空间可用。安装以后Apache使用大约10MB磁盘空间,再加上会快速增长的日志和缓存文件需要的空间。 实际需要的空间大小会在相当大程度上取决于你选择的配置以及使用的第三方模块和库。
* Microsoft Visual C++ 5.0 或更高版本
可以使用命令行工具,也可以在Visual Studio集成开发环境内编译Apache。使用命令行工具要求环境变量中包含 `PATH`, `INCLUDE`, `LIB` 和其他一些变量,这些环境变量可以用`vcvars32`批处理文件来设置:
```
"c:\Program Files\DevStudio\VC\Bin\vcvars32.bat"
```
* Windows Platform SDK
Visual C++ 5.0 编译需要一套新版的Microsoft Windows Platform SDK来允许Apache的某些特性。 对于命令行编译,用`setenv`批处理文件来设置环境变量:
```
"c:\Program Files\Platform SDK\setenv.bat"
```
随Visual C++ 6.0 及以后版本发布的Platform SDK文件足以满足要求,所以新版本的用户可以略过这个要求。
注意,需要新版的Windows Platform SDK来使得Apache支持的全部`mod_isapi`特性可用。没有新版SDK的话,在 MSVC++ 5.0 下编译Apache会出现某些`mod_isapi`特性将被禁止的警告。在[http://msdn.microsoft.com/downloads/sdks/platform/platform.asp](http://msdn.microsoft.com/downloads/sdks/platform/platform.asp)可以找到新版的Microsoft Winodws Platform SDK。
* awk工具(awk, gawk或类似软件)
为了在编译系统内安装Apache ,用`awk.exe`工具修改了几个文件。选择awk是因为它很小,易于下载(与Perl或者WSH/VB相比),而且能够完成生成文件的任务。Brian Kernighan的[http://cm.bell-labs.com/cm/cs/who/bwk/](http://cm.bell-labs.com/cm/cs/who/bwk/)站点有一个编译好的本地Win32代码版本,这个文件[http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe](http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe)你必须将它名字保存为`awk.exe`而不是`awk95.exe` 。
注意Developer Studio集成开发环境只能在Tools - Options菜单中的Directories页上列出的可执行文件搜索路径列表中查找 `awk.exe`(对于Developer Studio 7.0 是在the Projects - VC++ Directories 面板)。 把`awk.exe`的路径加入到列表中,并按要求加入到系统`PATH`环境变量里。如果你用的是Cygwin ([http://www.cygwin.com/](http://www.cygwin.com/))需要注意,awk工具的文件名是`gawk.exe`而文件`awk.exe`实际上是`gawk.exe`的一个符号连接。 而Windows命令行解释程序不认识符号连接,因此编译二进制安装文件会失败。可行的变通办法是从cygwin安装目录删除文件`awk.exe`并把`gawk.exe`改名为`awk.exe` 。
* [可选] OpenSSL库(因为`mod_ssl`和`ab.exe`用到ssl支持)
**警告:在整个世界范围使用和发布高强度密码体系与专利知识产权都有相当大的限制和严格的禁令。**OpenSSL包括了在美国及其他国家和地区受到出口条例、国内法律以及受专利保护的知识产权所限制的高强度密码体系。对于OpenSSL项目提供的代码,不管是Apache软件基金会还是OpenSSL项目都不能提供关于拥有、使用和发布该代码的法律建议。**向你自己的法律顾问咨询,你需要为你自己的行为负责。**
为了编译 `mod_ssl`或abs项目(`ab.exe`用到SSL支持),OpenSSL必须安装到`srclib`目录下名为`openssl`的子目录中,openSSL可以从[http://www.openssl.org/source/](http://www.openssl.org/source/)获得。要是准备既编译`release`版本又编译`debug`版本,而且要禁止 0.9.7 版中受专利保护的特性,你应该使用下列编译命令:
```
perl Configure VC-WIN32
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl dll no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile
perl util\mk1mf.pl dll debug no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile.dbg
perl util\mkdef.pl 32 libeay no-asm no-mdc2 no-rc5 no-idea >ms\libeay32.def
perl util\mkdef.pl 32 ssleay no-asm no-mdc2 no-rc5 no-idea >ms\ssleay32.def
nmake
nmake -f makefile.dbg
```
* [可选] zlib源码 (用于`mod_deflate`)
Zlib必须安装到`srclib`目录下的`zlib`子目录,但是你不需要去编译那些源码。编译系统会直接把压缩源码编译到`mod_deflate`模块中去。 Zlib可以从[http://www.gzip.org/zlib/](http://www.gzip.org/zlib/)获得 -- `mod_deflate`已经经过验证可以使用版本 1.1.4 正确编译。
## 命令行编译
首先,将Apache源码包解压到合适的目录。打开一个命令提示符窗口并用`cd`切换到那个目录。
主要的Apache make文件命令都包含在文件`Makefile.win`中。要在Windows NT上编译Apache ,只需要简单地使用下列命令之一就可以编译`release`或`debug`版本,分别是:
```
nmake /f Makefile.win _apacher
nmake /f Makefile.win _apached
```
两条命令都可以编译Apache 。后者会在编译结果文件中包含调试信息,使发现bugs和跟踪问题更容易。
## Developer Studio集成开发环境的工作区编译
Apache也能够用VC++的Visual Studio集成开发环境编译。为了简化过程,提供了一个Visual Studio工作区文件:`Apache.dsw` 。 它阐述了完整的Apache二进制发行版需要的全部`.dsp`项目列表。 它包含了项目之间的依存关系来保证编译按合适的顺序进行。
打开 `Apache.dsw` 工作区文件,选择 `InstallBin` (根据需要选择编译`Release` 或者`Debug` 版本) 为活动项目。`InstallBin`会引发编译相关的项目并调用 `Makefile.win` 移动编译后的可执行文件和动态链接库。你可以改变`InstallBin`项目的设置来定制 `INSTDIR=` 选项,修改设置中General页里面的Build Command line条目。`INSTDIR`的缺省值是 `/Apache2`目录。如果你只是想要测试编译(不安装),就用 `BuildBin`项目代替。
`.dsp`项目文件使用Visual C++ 6.0格式发行。Visual C++ 5.0 (97)也能识别这种格式。而Visual C++ 7.0 (.net)必须把`Apache.dsw`和`.dsp` 文件转换成`Apache.sln`和`.msproj`文件, 如果有任何一个`.dsp`源文件改变了,必须重新转换相应的`.msproj`文件! 这很容易,只需要在VC++ 7.0 集成开发环境中重新打开 `Apache.dsw`文件。
Visual C++ 7.0 (.net)的用户还应该使用Build 菜单下的Configuration Manager对话框来不选中模块abs ,`mod_ssl`和`mod_deflate` , 对编译`Debug`和`Release`版本都是。 仅当`srclib`目录下至少存在`openssl`或者`zlib`子目录二者之一, 才能调用`nmake`或者明白地使用`BinBuild`目标直接从集成开发环境来编译这几个模块。
导出的那些`.mak`文件造成很大的争议,但对于 Visual C++ 5.0 的用户它们是编译`mod_ssl` 、abs(带SSL支持的ab)和`mod_deflate`是必需的。 VC++ 7.0 (.net)的用户也能从中受益,用`nmake`编译比用 `binenv`要快。 从VC++ 5.0 或 6.0 集成开发环境编译所有项目,再使用Project菜单 - Export导出所有make文件。 为了创建全部自动产生的动态目标你必须首先编译项目,以便互相之间的依存关系可以被正确解析。运行下面命令修正路径使之能编译到任何位置:
```
perl srclib\apr\build\fixwin32mak.pl
```
你必须在`httpd`源码树的_顶层_目录输入这个命令。 当前目录及其子目录下所有的`.mak` 和 `.dep`项目文件都将被改正,并且时间戳被调节到与`.dsp`一致。
如果你贡献修正项目文件的补丁,我们必须以Visual Studio 6.0 格式来确认项目文件。 改动应该简单而且只带有最少的编译和连接标记以便能够被从VC++ 5.0 到 7.0 的所有环境识别。
## 项目组件
`Apache.dsw`工作区文件和`makefile.win` `nmake`脚本都是以下列顺序编译Apache服务器的`.dsp`项目文件:
1. `srclib\apr\apr.dsp`
2. `srclib\apr\libapr.dsp`
3. `srclib\apr-util\uri\gen_uri_delims.dsp`
4. `srclib\apr-util\xml\expat\lib\xml.dsp`
5. `srclib\apr-util\aprutil.dsp`
6. `srclib\apr-util\libaprutil.dsp`
7. `srclib\pcre\dftables.dsp`
8. `srclib\pcre\pcre.dsp`
9. `srclib\pcre\pcreposix.dsp`
10. `server\gen_test_char.dsp`
11. `libhttpd.dsp`
12. `Apache.dsp`
此外,`modules\`子目录树包含了大多数模块的项目文件。
`support\`子目录包含了一些附加程序的项目文件,它们运行时不是Apache的一部分, 但是管理员要使用它们来测试Apache和维护密码与日志文件。 Windows平台特有的支持项目在`support\win32\`目录下。
1. `support\ab.dsp`
2. `support\htdigest.dsp`
3. `support\htpasswd.dsp`
4. `support\logresolve.dsp`
5. `support\rotatelogs.dsp`
6. `support\win32\ApacheMonitor.dsp`
7. `support\win32\wintty.dsp`
一旦编译了Apache,它需要被安装在服务器根目录,缺省是在同一个盘符下的`\Apache2`目录。
要自动编译和安装所有文件到指定的目录_dir_ ,使用下列`nmake`命令之一:
```
nmake /f Makefile.win installr INSTDIR=_dir_
nmake /f Makefile.win installd INSTDIR=_dir_
```
`INSTDIR`的_dir_参数给出了安装目录;如果要安装到`\Apache2`目录可以省略。
安装结果如下列:
* `_dir_\bin\Apache.exe` - Apache可执行文件
* `_dir_\bin\ApacheMonitor.exe` - 服务监视器托盘图表工具
* `_dir_\bin\htdigest.exe` - 摘要授权密码文件工具(Digest auth password file utility)
* `_dir_\bin\htdbm.exe` - SDBM授权数据库密码文件工具(SDBM auth database password file utility)
* `_dir_\bin\htpasswd.exe` - 基本授权密码文件工具(Basic auth password file utility)
* `_dir_\bin\logresolve.exe` - 日志文件dns名称查找工具
* `_dir_\bin\rotatelogs.exe` - 日志文件遍历工具
* `_dir_\bin\wintty.exe` - 控制台窗口工具
* `_dir_\bin\libapr.dll` - Apache可移植运行时共享库
* `_dir_\bin\libaprutil.dll` - Apache运行时共享库工具
* `_dir_\bin\libhttpd.dll` - Apache核心库
* `_dir_\modules\mod_*.so` - Apache可装载模块
* `_dir_\conf` - 配置目录
* `_dir_\logs` - 空日志目录
* `_dir_\include` - C语言头文件
* `_dir_\lib` - 连接库文件
### 关于从开发树编译Apache的警告
在每次发布`发行`版本之间,只有`.dsp`文件被维护。 考虑到会对审阅者的时间造成巨大浪费,并不重新产生`.mak`文件。 因此,你不能依靠上述的`NMAKE`命令来编译修订过的`.dsp`项目文件,除非你自己从项目中导出全部`.mak`文件。如果你在Microsoft Developer Studio环境中编译这样做是不必要的。同时注意在导出make文件之前编译`BuildBin`目标项目是非常值得的(或者用命令行目标 `_apacher` 或 `_apached`)。 许多文件在编译过程中自动产生。只有一次完全编译才提供为正确的编译行为编译正确的依存关系树所需要的全部依赖文件。
为创建供发布的`.mak`文件,一定要检查`.mak` (或`.dep`)中Platform SDK和其他头文件的依存性。 `DevStudio\SharedIDE\bin\`(VC5)或者`DevStudio\Common\MSDev98\bin\`(VC6) 目录包含了`sysincl.dat`文件,其中列出了所有的例外情况来告诉VC++创建依存关系时不扫描列表中的文件, 更新此文件以包含这些头文件 (同时包括正斜杠和反斜杠路径,比如`sys/time.h`和`sys\time.h`要同时列出)。 在发布的`.mak`文件中包含一个本地安装路径将使编译完全失败,所以不要忘了运行`srclib/apr/build/fixwin32mak.pl`来修正`.mak`文件中的绝对路径。
- Apache HTTP Server Version 2.2 文档 [最后更新:2006年3月21日]
- 版本说明
- 从1.3升级到2.0
- 从2.0升级到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 参考手册
- 编译与安装
- 启动Apache
- 停止和重启
- 配置文件
- 配置段(容器)
- 缓冲指南
- 服务器全局配置
- 日志文件
- 从URL到文件系统的映射
- 安全方面的提示
- 动态共享对象(DSO)支持
- 内容协商
- 自定义错误响应
- 地址和端口的绑定(Binding)
- 多路处理模块
- Apache的环境变量
- Apache处理器的使用
- 过滤器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重写指南
- Apache虚拟主机文档
- 基于主机名的虚拟主机
- 基于IP地址的虚拟主机
- 大批量虚拟主机的动态配置
- 虚拟主机示例
- 深入研究虚拟主机的匹配
- 文件描述符限制
- 关于DNS和Apache
- 常见问题
- 经常问到的问题
- Apache的SSL/TLS加密
- SSL/TLS高强度加密:绪论
- SSL/TLS高强度加密:兼容性
- SSL/TLS高强度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 认证、授权、访问控制
- CGI动态页面
- 服务器端包含入门
- .htaccess文件
- 用户网站目录
- 针对特定平台的说明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上编译Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服务器和支持程序
- httpd - Apache超文本传输协议服务器
- ab - Apache HTTP服务器性能测试工具
- apachectl - Apache HTTP服务器控制接口
- apxs - Apache 扩展工具
- configure - 配置源代码树
- dbmmanage - 管理DBM格式的用户认证文件
- htcacheclean - 清理磁盘缓冲区
- htdbm - 操作DBM密码数据库
- htdigest - 管理用于摘要认证的用户文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本认证的用户文件
- logresolve - 解析Apache日志中的IP地址为主机名
- rotatelogs - 滚动Apache日志的管道日志程序
- suexec - 在执行外部程序之前切换用户
- 其他程序
- 杂项文档
- 与Apache相关的标准
- Apache模块
- 描述模块的术语
- 描述指令的术语
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模块 mod_actions
- Apache模块 mod_alias
- Apache模块 mod_asis
- Apache模块 mod_auth_basic
- Apache模块 mod_auth_digest
- Apache模块 mod_authn_alias
- Apache模块 mod_authn_anon
- Apache模块 mod_authn_dbd
- Apache模块 mod_authn_dbm
- Apache模块 mod_authn_default
- Apache模块 mod_authn_file
- Apache模块 mod_authnz_ldap
- Apache模块 mod_authz_dbm
- Apache模块 mod_authz_default
- Apache模块 mod_authz_groupfile
- Apache模块 mod_authz_host
- Apache模块 mod_authz_owner
- Apache模块 mod_authz_user
- Apache模块 mod_autoindex
- Apache模块 mod_cache
- Apache模块 mod_cern_meta
- Apache模块 mod_cgi
- Apache模块 mod_cgid
- Apache模块 mod_charset_lite
- Apache模块 mod_dav
- Apache模块 mod_dav_fs
- Apache模块 mod_dav_lock
- Apache模块 mod_dbd
- Apache模块 mod_deflate
- Apache模块 mod_dir
- Apache模块 mod_disk_cache
- Apache模块 mod_dumpio
- Apache模块 mod_echo
- Apache模块 mod_env
- Apache模块 mod_example
- Apache模块 mod_expires
- Apache模块 mod_ext_filter
- Apache模块 mod_file_cache
- Apache模块 mod_filter
- Apache模块 mod_headers
- Apache模块 mod_ident
- Apache模块 mod_imagemap
- Apache模块 mod_include
- Apache模块 mod_info
- Apache模块 mod_isapi
- Apache模块 mod_ldap
- Apache模块 mod_log_config
- Apache模块 mod_log_forensic
- Apache模块 mod_logio
- Apache模块 mod_mem_cache
- Apache模块 mod_mime
- Apache模块 mod_mime_magic
- Apache模块 mod_negotiation
- Apache模块 mod_nw_ssl
- Apache模块 mod_proxy
- Apache模块 mod_proxy_ajp
- Apache模块 mod_proxy_balancer
- Apache模块 mod_proxy_connect
- Apache模块 mod_proxy_ftp
- Apache模块 mod_proxy_http
- Apache模块 mod_rewrite
- Apache模块 mod_setenvif
- Apache模块 mod_so
- Apache模块 mod_speling
- Apache模块 mod_ssl
- Apache模块 mod_status
- Apache模块 mod_suexec
- Apache模块 mod_unique_id
- Apache模块 mod_userdir
- Apache模块 mod_usertrack
- Apache模块 mod_version
- Apache模块 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航