# 在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
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航