在Microsoft Windows中使用Apache

此文档阐述了如何在Microsoft Windows平台上安装、配置和运行Apache 2.0 。 如果你发现了bug,或者希望以其他方式作出贡献,请使用我们的bug报告页面

本文档的大多数内容假定你是从一个二进制发布版安装Apache到Windows上。 如果你想自己编译Apache(可能有助于开发和跟踪bugs),参看编译Windows下的Apache

基于当前的Windows版本状况,本文档使用到的缩写及其意义解释包括:

  • Windows NT: 指所有基于NT核心的Microsoft Windows操作系统的版本,包括Windows NT, Windows 2000, Windows XP, Windows.NET Server 2003及后续版本。
  • Windows 9x: 指所有定位于家庭使用的Microsoft Windows操作系统的版本,包括 Windows 95 , Windows 98, Windows ME 。

对操作系统的要求

Apache 2.0被设计为在Windows NT上运行。它的二进制安装程序只能在x86处理器上运行,比如Intel和AMD的芯片。Apache可能也能够运行在Windows 9x上,但是并没有经过测试, 也不建议在实际工作的系统上这样使用。

任何情况下都必须确保TCP/IP网络协议已经安装。如果在Windows 95上运行,必须安装"Winsock2"升级补丁。 "Winsock2" for Windows 95可以在这里下载。

如果在NT 4.0上运行,建议安装Service Pack 6 ,因为Service Pack 4有众所周知的TCP/IP和Winsock完整性的问题,在以后的Service Pack中解决了这些问题。

下载 Apache for Windows

关于Apache最新版本的有关信息可以在http://httpd.apache.org/download.cgi上找到。那里会列出当前发行版本、 所有最近的alpha和beta测试版本以及镜像web站点和匿名ftp服务器的信息。

你应该下载带有.msi扩展名的Apache for Windows版本。 这是一个单一的Microsoft Installer文件,包含了Apache ,可以立即安装并运行。 还有一个单独的.zip文件只打包了源码, 可以用Microsoft Visual C++ (Visual Studio)工具来编译。

安装 Apache for Windows

Apache的安装需要有Microsoft Installer 1.2或更高版本。 在Windows 9x中,你可以从这里升级Microsoft Installer到2.0 ,在Windows NT 4.0和2000中,2.0的升级版在这里。Windows XP/2003不需要这个升级。

注意,使用这个安装包不能在同一个机器上安装两套Apache 2.0。 但是,在同一个机器上,安装一个1.3系列一个2.0系列的Apache则没有问题。 如果你需要在同一个机器上安装两套不同的2.0版本, 则必须用代码编译和安装Apache

运行已下载的上述Apache .msi文件。安装程序会要求提供下列信息:

  1. Network Domain 你的服务器已经或者将要注册的DNS域名。比如你的服务器的全称DNS域名是server.mydomain.net ,你应当在这里输入:mydomain.net

  2. Server Name 你的服务器的全称DNS域名,如上情况你应当在这里输入:server.mydomain.net

  3. Administrator's Email Address 服务器管理员的email地址。这个地址将会在默认的出错页面上显示给客户端。

  4. For whom to install Apache 如果你希望Apache在80端口监听,并被安装为服务(即使无人登陆,Apache仍将运行),就选择"for All Users, on Port 80, as a Service - Recommended";如果你希望将Apache安装为个人试验使用,或者已经有一个运行于80端口的WWW服务器,就选择"only for the Current User, on Port 8080, when started Manually"。

  5. The installation type 选择Typical会安装除开发模块需要使用的源码和库以外的所有内容。选择Custom可以自定义安装哪些项目。完整安装大约需要13MB磁盘空间,这其中并不包含你的网站文件所用空间。

  6. Where to install 安装Apache的文件夹,默认为C:\Program Files\Apache Group文件夹下的Apache2子文件夹。

安装期间,Apache将会配置你所选择的安装目录下的conf文件夹中的文件。 但是如果那个目录下已有同名文件存在,原有文件将不会被覆盖, 而相应的新文件将会被加上.default扩展名。 所以,举例来说,如果conf\httpd.conf已经存在,那么不会对它做任何改变, 而新版本conf\httpd.conf的内容将会被写入文件conf\httpd.conf.default 。 安装完成以后你应该检查.default文件中的内容看看有没有不同, 如果必要,更新你原有的配置文件。

而且,如果你已经有一个名为htdocs\index.html的文件,它不会被覆盖掉 (也不会安装index.html.default文件)。 这意味着你在一个旧版本Apache上安装新版本是安全的 (但是你必须在安装之前首先停掉原有服务器然后在安装完成后重新启动它)。

安装Apache以后,你应该编辑conf目录下的配置文件。这些文件已在安装期间被配置好以便Apache能够从安装目录运行,文档目录被配置为安装目录下的子目录htdocs 。在你开始真正使用之前还有很多选项需要设置。但是为了尽快开始,可以使用安装时自动配置的配置文件。

配置 Apache for Windows

与Unix系统下的版本一样,Apache使用conf目录下的文件进行配置,但是Windows版本有几个不同的指令,参见指令索引察看全部可用指令。

Apache for Windows主要的不同点是:

  • 因为Apache for Windows是多线程的,它并不像Unix版本那样为每个请求使用一个单独的进程。 而是通常运行两个Apache进程:一个父进程,和一个处理请求的子进程。在子进程内部由多个单独的线程来处理每个请求。

    因此与进程管理相关的指令是不同的:

    MaxRequestsPerChild就像Unix版本中的指令一样,这条指令控制一个进程退出前将为多少个请求提供服务。 然而,与Unix不同的是,一个进程将为所有请求而不是只为一个请求服务,因此如果设置这条指令,建议将它设为一个很大的值。默认设置 MaxRequestsPerChild 0 使得进程从不退出。

    警告: 启动新的子进程时将会重新读入服务器配置文件。如果你修改了httpd.conf ,新的子进程将有可能不能启动或者可能得到预期之外的结果。

    ThreadsPerChild是一条新的指令,用来告诉服务器应该使用多少个线程,指明了服务器可以立刻处理的最大连接数;如果你的站点有大量的点击,请确认你设置了足够大的值。推荐的默认设置是 ThreadsPerChild 50

  • 接收文件名作为参数的指令必须使用Windows文件名而不是Unix文件名。 但是,因为Apache内部使用Unix风格的名字,你必须使用正斜杠而不是反斜杠。可以使用盘符;如果省略盘符,将假定使用Apache可执行文件所在盘符。

  • Apache for Windows具有运行时装入模块的能力,不需要重新编译。如果Apach在正常情况下编译,它会在\Apache2\modules目录下安装许多可选模块。 要激活它们或其他模块,必须使用新的LoadModule指令。 举例来说,要激活状态模块,使用下列指令(除了access.conf中的状态激活指令以外):

            LoadModule status_module modules/mod_status.so
    

    也可使用创建可加载模块中的信息。

  • Apache也可以加载ISAPI(Internet Server Applications Programming Interface)扩展,例如被Microsoft IIS服务器和其他一些Windows服务器所使用的。这里有更多相关信息。注意Apache不能加载ISAPI 过滤器。

  • 当运行CGI脚本时,Apache查找脚本解释器是由ScriptInterpreterSource指令配置的。

  • 由于在Windows下管理具有像.htaccess这样名字的文件是很困难的,你会发现在配置文件中使用AccessFilename指令改变它的文件名是很有用的。

  • 在Windows NT上,Apache启动时发生的错误将会记入Windows事件日志(event log)。这个机制将在Apache尚不能使用error.log文件的时候运作。你可以通过"事件查看器"的MMC接口查看Windows事件日志。

    注意,在Windows 9x上不存在事件日志机制,因此无法记录启动错误。

以服务方式运行Apache for Windows

Apache仅能够在Windows NT上作为服务运行。

你可以选择在安装Apache时自动将其安装为一个服务。如果你选择"for all users",那么Apache将会被安装为服务。如果你选择了"only for the Current User",你可以在安装后手动将Apache注册为服务。注意,你必须是Administrators组的成员才能成功注册服务。

使用Apache Service Monitor工具,可以查看和管理你所在网络上的所有机器上安装的Apache服务的状态。为了能够使用这个工具管理Apache服务,你必须首先自动或手动安装Apache服务。

你可以在Apache安装目录的bin子目录下,使用如下命令将Apache安装为Windows NT服务:

      apache -k install

如果你想指定服务的名称,可以使用下面的命令。当你在同一机器上安装多个Apache服务时,你必须为它们指定不同的名字。

      apache -k install -n "服务名"

如果你想为不同名称的服务使用不同的配置文件,则安装时需要指定配置文件:

      apache -k install -n "服务名" -f "c:\files\my.conf"

如果你使用的是第一个命令,也就是除 -k install 外没有其它命令行参数,那么被安装的服务名称将是:Apache2 ,配置文件将使用conf\httpd.conf

要移除一个Apache服务很简单:

      apache -k uninstall

或者使用下述命令移除特定名称的Apache服务:

      apache -k uninstall -n "服务名"

通常,启动、重启、关闭Apache服务的方法是使用Apache Service Monitor工具,另外也可以使用控制台命令:NET START Apache2NET STOP Apache2 或者通过Windows服务控制面板。在启动Apache服务之前,你应当使用下面的命令检查一下配置文件的正确性:

      apache -n "服务名" -t

你可以通过命令行开关来控制Apache服务。要启动一个已经安装的Apache服务,可以使用:

      apache -k start

要停止一个已经安装的Apache服务,可以使用:

      apache -k stop

      apache -k shutdown

要重启一个运行中的Apache服务,强制它重新读取配置文件,可以使用:

      apache -k restart

默认情况下,Apache服务将被注册为以本地系统用户(LocalSystem帐号)身份运行。LocalSystem帐号没有网络权限,不能通过任何Windows安全机制访问网络,包括文件系统、命名管道、DCOM或secure RPC ,但是它对于本地资源却拥有广泛的特权。

永远不要把网络权限授予LocalSystem帐号!如果你需要Apache能够访问网络资源,最好按照下述方法为Apache另外建立一个单独的帐号。

你应该建立一个单独的帐号来运行Apache服务。特别是在必须通过Apache访问网络资源的时候,我们更加强烈建议你这样做。

  1. 创建一个普通域用户帐号,并牢记对应的密码。
  2. 授予这个新建的帐号作为服务登陆作为操作系统一部分运行权限。在Windows 2000/XP/2003上你可以使用"组策略"或通过"本地安全策略"的MMC接口来完成这个操作。
  3. 确认新建的帐号是Users组的一个成员。
  4. 确认新建的帐号具有读取和执行(RX)所有文档和脚本目录(例如:htdocscgi-bin)的权限。
  5. 确认新建的帐号对Apache的logs目录具有读/写/删除(RWD)的权限。
  6. 确认新建的帐号对Apache.exe二进制文件具有读取和执行(RX)的权限。

一个很好的实践经验是赋予运行Apache服务的用户读取和执行(RX)整个Apache2目录的权限,并且对logs子目录具有读/写/删除(RWD)的权限。

如果你允许使用这个帐号作为一个用户和服务登录,你就可以用这个帐号登录上去测试执行脚本、读取web页的权限,还可以通过控制台窗口启动Apache 。如果这样工作正常,你又执行了上述的操作,那么Apache就能够正常地作为服务运行了。

错误代码2186是一个很好的提示,说明你需要检查"登陆为"选项,因为服务器不能访问必要的网络资源。

当启动Apache服务时你可能会遇到一个来自Windows服务管理器的错误信息。 例如,如果你想使用控制面板中的服务小程序启动Apache,可能会得到下面这条信息:

      Could not start the Apache2 service on \\COMPUTER 

      Error 1067; The process terminated unexpectedly.

只要启动Apache出错你就会得到这个错误信息。为了弄清是什么引起了错误, 你应该遵循作为控制台程序运行Apache中的建议。

对于让Apache在Windows 9x下以类似Windows NT服务的方式运行有一些支持。都是高度试验性的,即使能够工作,Apache软件基金会将不会证实其可靠性和未来的支持。继续进行你自己的冒险吧!

这两种"服务"有相当大的区别:

如果你输入下列命令,Apache会尝试启动,如果成功他将在后台运行:

      Apache -n "服务名" -k start

例如,通过桌面的快捷方式运行,如果服务启动成功一个控制台窗口会快速闪过并立刻消失。如果启动时Apache检测到比如httpd.conf文件中有不正确的设置这样的问题,则控制台窗口会保持可见。这样将显示一个有助于追踪错误原因的错误信息。

Windows 9x不支持NET START或者NET STOP命令,因此你在命令中必须使用Apache的服务控制选项。你可能希望为每个命令设置一个快捷方式以便你能够只需要从开始菜单或者桌面一点就能执行所需的操作。

Apache和Windows 9x没有提供让Apache服务以特定的具有网络权限的用户身份运行的支持。实际上,Windows 9x在本地机器上根本没有提供安全性。这就是Apache软件基金会从不支持使用Windows 9x作为公用httpd服务器的原因。这个便利存在的唯一目的是协助用户开发web内容和学习Apache服务器,或者也许在一个安全的、私有的网络上充当intranet服务器。

作为控制台程序运行Apache

虽然通常推荐将Apache作为服务来运行,但是在某些情况下从命令行运行反而更加容易。在Windows 9x上,从命令行运行Apache是推荐的方法,因为这些系统中缺乏可靠的服务支持。

可以使用下列命令将Apache作为控制台程序从命令行运行:

      apache

Apache将会一直保持运行,直到被Ctl+C组合键中断。

你还可以在安装后通过 开始按钮 --> 程序 --> Apache HTTP Server 2.2.xx --> Control Apache Server 在控制台中运行Apache 。这将会打开一个控制台窗口并在其中启动Apache 。如果你没有将Apache安装为服务,该窗口将一直保持打开,直到被Ctl+C组合键中断,并在几秒钟后退出。如果你已经将Apache安装为服务,那么那个快捷方式将会启动服务,如果Apache服务已经启动了,则什么也不做。

你可以在另外一个控制台窗口中输入以下命令停止正在运行的Apache服务:

      apache -k shutdown

这种方法比使用Ctl+C组合键更好,因为它可以让Apache完成所有当前的操作并且优雅的清理所占用的资源。

Apache可以被从新启动,这将导致它重新读取配置文件,重启前所有正在进行的操作都将不被打断的完成。可以使用下面的命令重启Apache :

      apache -k restart

请熟悉Unix版本Apache的用户注意,这些命令对应于Unix命令 kill -TERM _pid_kill -USR1 _pid_ 。命令中之所以使用 -k 选项,就是为了提醒用户这是源自Unix下的kill命令。

如果Apache控制台窗口在启动后出乎意料的立即关闭,请打开一个新的控制台窗口,切换到Apache的安装目录下bin子目录中,运行apache命令并读取错误信息。然后再到日志目录中查看error.log文件以寻找可能的配置错误。如果你的Apache采用的是默认安装,这些命令应当是:

      c: 

      cd "\Program Files\Apache Group\Apache2\bin" 

      apache

等候Apache停止,或者使用Ctl+C组合键,然后输入下列内容:

      cd ..\logs 

      more < error.log

可以在命令行中为Apache指定一个配置文件,有两种方法可以在命令行中指定配置文件:

  • -f 可以指定一个绝对路径或相对路径的配置文件:

            apache -f "c:\my server files\anotherconfig.conf"
    

            apache -f files\anotherconfig.conf
    
  • -n 可以指定已安装的Apache服务所使用的配置文件:

            apache -n "服务名"
    

在这两种情况下,必须在配置文件中设置正确的ServerRoot值。

如果你没有使用 -f-n 指定配置文件的路径,Apache将会使用硬编码在服务器内的路径,比如:conf\httpd.conf 。这个内置的路径是相对于安装目录的,要想检查这个内置的路径,你可以通过 -V 开关调用Apache ,查看名为SERVER_CONFIG_FILE的变量值:

      apache -V

Apache将会按照下列顺序检查ServerRoot值:

  1. 通过 -C 命令行开关指定的ServerRoot值。
  2. 通过 -d 命令行开关指定的值。
  3. 当前工作目录。
  4. 安装二进制文件时在注册表中登记的项目。
  5. 编译进二进制文件的值,该值默认为:/apache ,你可以使用 apache -V 命令查看显示出来的HTTPD_ROOT变量的值。

在安装过程中,将会在注册表中新建一个版本特定的注册表键。这个键的位置取决于安装类型。如果你选择的是"for all users",那么将位于HKEY_LOCAL_MACHINE分支下,如下所示:

      HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache\2.0.43

如果你选择的是"for the current user only",那么将位于HKEY_CURRENT_USER分支下,其中的内容取决于当前登陆的用户,如下所示:

      HKEY_CURRENT_USER\SOFTWARE\Apache Group\Apache\2.0.43

这个键已经被编译进了服务器,使得你可以测试新版本而又不影响老版本。当然,你必须注意不要在同一个目录中安装两个不同的版本。

如果你没有使用二进制安装,在某些情况下Apache将会抱怨注册表键丢失。如果在这种情况下服务器仍然可以找到正确的配置文件,那么就可以安全的忽略它。

这个注册表键其实就是包含conf子目录的ServerRoot目录。Apache将要从中读取httpd.conf文件。如果该配置文件中又包含了一个ServerRoot指令,并且指向的目录与注册表中登记的不同,Apache将以配置文件中的指令为准。如果你复制了配置文件或者整个Apache目录到一个新的位置,你要千万记得修改httpd.conf中的ServerRoot指令,使其指向正确的位置。

安装的测试

启动Apache运行以后(不管是控制台窗口还是作为服务), 它会在80端口上进行监听(除非你改变了配置文件中的Listen指令。 要连接到服务器访问默认页面,启动一个浏览器并输入下列URL :

      http://localhost/

应该出现一个欢迎页面,并且页面上有到Apache用户手册的链接。 如果什么都没有发生或是得到了一个错误,检查logs子文件夹中的 error.log文件。如果你的主机没有联网或者DNS配置有严重问题,你也许需要输入这样的URL :

      http://127.0.0.1/

如果你将Apache配置为在非80端口监听(比如:8080),你应当使用下面的URL明确指定端口:

       http://127.0.0.1:8080/

一旦你的基本配置可以工作了,你应该编辑conf目录下的文件来恰当地配置Apache 。 此外,如果你改变了作为NT服务运行的Apache的配置,你应该首先尝试从命令行启动来保证能够正确地启动Apache服务。

因为Apache不能与其他TCP/IP应用程序共享同一端口,你可能需要先停止或者卸载或者重新配置某些特定的服务。这包括(但不限于)别的web服务器和BlackIce那样的防火墙。如果你只能在禁止其他服务的情况下启动Apache ,那么需要重新配置Apache或者其他程序使它们不监听同一个TCP/IP端口。