不知你是否感兴趣把你的计算机设置为当今互联网中的一部分,是否愿意加入到不断发展壮大的Web中来?如果是,你也许对架设自己的web服务器感兴趣。在本文中,我将介绍如何建立和配置这样的服务器,同时,将检查一下有关需求,并精确决定究竟要何处配置,以便完成相应的功能。
  本文定位为手册性的指南介绍。如果你对web服务器的性能特别关注,请留意不久后即将发表的另一篇文章,在那篇文章中,将介绍了不同的平台和多种服务器。
  因为免费的Apache web服务器约占了所有的web服务器软件中的半壁江山,同时Sun公司的硬件也占了所有服务器硬件的大多数比例。我将介绍一下这样的配置。事实上,为了方便起见,我所详细介绍的就是一个现实的网站目前所用的服务器。
  该机器的型号为SPARCstation 20,其配置:256 MB内存, 单个SM71 处理器模块。操作系统为Solaris 7, 服务器软件为Apache 1.3。 无论硬件是否不同,以及运行哪一种UNIX平台, Apache的配置方法不变。
  硬件配置
  如前所述,该机器型号为SPARCstation 20。为何要采用Sun公司的机器,而不在Intel架构下运行Linux或者Windows NT?基本上,原因分为下面四点,我将用一个例子分别加以阐述:
  兼容性
  可扩性
  维护和管理
  开销
  兼容性
  如果你已经有了一个网站,为了保持兼容性,将尽可能维持类似的配置,这一点也许是重要的。这也许意味着如果你运行的是Windows NT server,就会坚持采用兼容Windows NT的硬件,或者如果现在运行的是Linux平台,也会保持现状不变。
  前面介绍的服务器是运行Solaris操作系统的Sun机器。尽管是个小容量的小型机器,自从配置安装好之后,作为我们的web服务器,已经成功运行约6个月,自那时起,我们的网站服务器就一直保持为Solaris/Apache平台。
  此时,我们尤为关注停机维护时间和保护最初的投资。通过保持不变的硬件和软件平台,就可以保证代码级的兼容性,和最小的停机维护时间。
  可扩性
  你的新服务器是否提供了可扩空间?过了6个月之后,是否需要升级?显然,如果你打算完全替换硬件,需要的服务器数量将同你的网站内容数量一起水涨船高。根据你的网站需求,你也许需要更高的CPU处理能力,或者更高的磁盘传输率。如果你的机器在哪方面有不足,就需要对那一方面的不足进行改进。有时,这就可能意味着需要采用能够安装两个或者四个处理器的主板,或者意味着需要采用更强大的RAID控制器。
  前面所述的服务器已经充分扩充,没有进一步升级的余地了,我们觉得选择服务器时不仅要看它是否可扩空间,也要看它是否能够在群集环境中工作良好,这一点是重要的。
  我们现在使用的SPARCstation 20最多可扩到四个处理器,带有8条SIMM,四个扩展槽,以及四个磁盘驱动器接口,另外,该机器主板上还具有SCSI和以太网接口。另外一个重要的方面是整个机器只有3英寸高, 16英寸宽,深度16英寸。这就非常适宜安装到机架上。
  维护和管理
  该部分主要涉及到软件,当服务器发生故障时,没人愿意每次重新安装服务器软件。基本的管理功能应该总是能够通过远程进行,而且要能够进行重启动等。能够远程控制也是一个优点。
  Solaris同大多数UNIX系统一样,提供了不少工具,来帮助用户进行远程管理。对于我们的机器,从添加新用户和改变web服务器参数,到重启动和配置新的硬件,都可以远程进行。
  成本
  你可以保护多少初始投资?要求既能满足你的当时需求,也能用满足将来的升级需要,哪一种服务器最经济?
  成本也是重要的因素。尽管我们可以购买得起比现在这台机器更贵的Sun 系统。但是,由于该Sun机器已经内置SCSI和ethernet,就无需购买这两种适配器,软驱和CDROM驱动器也不需要,因为可以通过网络进行软件的安装。视频卡也不需要,因为该机器完全可以通过telnet或者远程X会议系统进行访问。
  你可以看到,在这种场合下,Sun机器远比相应的PC廉价,因为我们仅需要基本的单元(主板和机箱),CPU和内存。而对于一台PC服务器,不仅需要购买一个基本单元,也需要购买视频卡, SCSI卡,网卡,软驱,CDROM驱动器,另外也需要借一台显示器,用于软件安装。
  你将需要多少硬件?
  这完全取决于你要发布的内容,以及要服务的人数。实际上,如果仅用于发布静态的HTML网页,采用90 MHz的Pentium, 适当容量的RAM, 能够适用于1.5Mbps T1连接速度的磁盘,就足够了。基于服务器的动态HTML, ASP, PHP以及其他更复杂的文档类型,在用户发出请求时,将消耗更多的CPU时间。通常,用ASP或者PHP来查询数据库,得到信息后,再传输到web文档中去。在这些场合,在同样的网络连接速度下,你需要有比发布静态网页的机器更强有力的web服务器。
  通常,一次硬件升级可以提升两倍的性能,如果再加上更高级的软件,性能可以最大提升到100倍以上。一个小小的例子可以说明这一点,在我们的网站上,原来采用PERL脚本把数据写入到文件中,在升级到采用数据库实现之后,在我们留言簿上生成索引的时间减少到为原来的50分之一。查询数据库并生成客户端可以看到的HTML文档的实际代码仅为600行,而采用CGI/PERL实现时,则产生超过3000行代码,且功能较少,而且启动的灵活性较低。
编译和安装Apache
 
  虽然我不打算介绍配置操作系统方面的事宜,你还是需要根据所运行的操作系统,正确配置网络连接。在不同的操作系统中安装Apache时有一些注意点。
  我们服务器上使用的Apache版本为1.3.9,所以我将详细介绍该版本下的安装过程。是否选择自己编译源代码的版本,还是下载一个预编译好的版本,其安装过程略有差异。在此,我将详细介绍编译源代码的步骤,但如果你不打算采用该版本,可以跳过这段。
  做任何其他事情之前,确保你的操作系统系统支持Apache(检查这个网站,而且你的编译器应为最新版)。由于GCC的一些版本的编译器在某些方面仍然处于测试开发阶段,这些版本在某些平台上构建的代码未经优化。如果你正在使用GCC,你需要查看一下,预编译过的版本是否提供了更好的性能。
  从这里下载Apache源代码包。
  解压缩该包文件。
  运行 ./configure
  基于你的需要,可以忽略特定的配置参数。在最低限度下,你需要指定安装路径,使用如下参数标志: --prefix=APACHE_INSTALLATION_PATH 。更为复杂的配置参数如下:
  ./configure --prefix=/usr/local/apache --activate-module=src/modules/php/libphp.a
  运行 make
  运行 make install
  运行 APACHE_INSTALLATION_PATH/bin/apachectl start
  配置Apache
  当然,编译Apache仅仅是实际安装和配置web服务器过程中的一小部分工作。根据需求,设置Apache,这仍是必需的。在Apache安装后的目录中,你会找到conf/ 目录。该目录包含了有关Apache启动和运行的所有的配置文件。这些配置文件包括下列一些:
  httpd.conf, 初始服务器配置文件
  access.conf, 配置web服务器访问设置,以及所服务的目录。
  srm.conf, 服务器名称空间和请求处理的配置
  我将在下面详细介绍Apache启动和运行时的配置。本文虽不是技术大全,但足够让你入门。如果你正在从现有的服务器或者新安装的服务器中,寻求更好的性能配置,我也将尽可能介绍一下有关性能问题。
  httpd.conf
  该文件保存了Apache自身的一些最重要的配置信息。也是在调整性能时的首要去处。我将介绍一下主要的配置选项,
  Servertype
  本选项决定Apache的执行方式。Apache既可以作为独立应用程序运行,也可以在透过适当的端口(通常为80端口)的HTTP请求到来时,被inetd调用。其中当inetd 运行时,将消耗少得多的资源,因为对于每一次请求都需要启动Apache,这将降低web服务器的总体性能。独立工作模式的设置更好些。
  Port
  该参数仅用于在独立模式下工作的服务器。通常为port 80。
  HostnameLookups
  该设置决定web服务器是否为每一个访问的IP地址,解析主机名。如果设置为on,访问日记中将存储主机名,而非IP地址。缺点是影响速度。因为打开该功能,将对每次请求都进行名称查询。如果服务的请求数量多,会严重降低服务器的性能。Apache在缺省情况下,把该参数设置为off,并提供了一个工具(logresolve),以便过后解析主机名。
  User
  服务器进程用户,通常设为“nobody”。
  Group
  运行服务器的组名,通常设为“nobody”。
  ServerAdmin
  服务器管理员的email地址。这会出现在出错页面上。
  ServerRoot
  指定配置文件和服务器日记文件的存储位置。除非你有特别原因,需要改变设置,一般与Apache所在目录相同。
  ErrorLog
  该参数告诉Apache出错日记文件的存储位置。可以设置记录内容, 一般将记录如下重要信息:启动时间,停止时间,用户遇到的任何错误 (例如404错误等等)。
  LogLevel
  决定让你的日记文件填满的时间。选项“Warn”在大多数场合足够了,除非你打算仔细诊断遇到的问题。
  LogFormat
  该功能指定服务器上日记文件的格式。你可以创建包含额外信息(如referrers)的特定格式。下面为一个常见组合格式的日记格式例子。
  LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
  CustomLog
  该命令同LogFormat alias 同时使用。
  Timeout
  建立连接所允许的时间,以秒记。
  KeepAlive
  打开该选项,可以进行持久连接。这表示单个的连接可以用于不止一个请求。这当然是好事,因为减少了建立连接所需的总体时间,尤其在一个单个的web文档可能需要5或者6个请求(如图像)。
  MaxKeepAliveRequests
  每个持久连接的最大请求数量。该数字应该设置高些(至少100)。
  KeepAliveTimeout
  该选项用来告诉服务器在下次请求到来时的等待时间。 缺省为15秒,可以根据同客户的连接情况,加长或者缩短该等待时间。同客户连接较慢时,需要更多的等待时间。记住,该数值设置太高,可能会导致服务器进程空等永不会到来的连接。
  MinSpareServers
  等待随时出现的请求的服务器进程数的最小值。改变该参数将可能在加载进程时,提高服务器的性能。缺省值为5。
  MaxSpareServers
  这个数值告诉Apache,多余的进程数达到多少时为过多。通过确保不会产生过多进程,这将帮助保护系统资源。
  StartServers
  初始启动时服务器的进程数。通常与MinSpareServers 的设置值相同。
  MaxClients
  随时可以连接的最大客户数。因为Apache服务器的客户同进程数相关,在极端情况下,可能会出现占用资源非常集中的现象,此时该设置值将保护你的服务器不发生崩溃。但也别把该值设置过低,因为一旦这样做,用户在高峰期可能会连不上去。
  MaxRequestsPerChild
  任何单个进程所能处理的最大请求数。为避免内存溢出,而强迫终止超出该设定值的请求。缺省值为30。
  Listen
  把Apache同指定的的端口或者地址绑定。可指定多个监听选项值,此时单个的服务器可以用作几个不同的网站。
  and
  该选项允许Apache为多个地址服务,例如多个域名。该项同Listen一起使用。同时,任何httpd.conf 选项也可以放到一个VirtualHost命令中。这意味着你可以为每个虚拟服务器指定不同的ServerAdmins, logfiles等等。下面为一个例子:
  DocumentRoot /usr/docs/mysite
  ServerName [url]www.mysite.com[/url]
  ErrorLog /var/log/web/mysite.log
  TransferLog /var/log/webmysite-access.log
  access.conf
  access.conf包含了Apache中了大部分同安全和用户访问相关的设置。在该文件中,目录索引, SSI include命令等等,可以按照目录逐一配置。下面为重要的配置选项:
  and (Also and )
  这是access.conf文件中主要的选项。当构建access.conf文件时,在启动时,参数应该先设置为限制范围最严格的值,然后对服务器上不同的文档逐渐放宽限制。
  Options
  使用该项参数,可对每个目录控制打开或者关闭某项功能。通常不设定为All,你可以随意指定选项的多少,因为Includes 和 ExecCGI 有时可能带有安全隐患。除了不允许包含执行CGI程序的#include exec 语句之外, IncludesNOEXEC 同Includes 的作用一样(在文档中允许使用<--#include --> 语句)。
  AllowOverride
  该选项定义了使用.htaccess文件可以得到的控制水平。这些文件可以放到内容目录中,以便替换指定目录中的缺省设置(在access.conf文件中)。在一些场合中,这非常方便,因为在重新配置指定目录时,无需访问根目录,但使用这样的文件时,会轻微影响性能,因为web服务器在访问决定该目录功能的选项时,必须读入该文件。access.conf在这些文件中可以控制使用哪一个参数,除此之外,.htaccess 文件同初始的ccess.conf 文件一样用。
  Order
  同Allow From 和Deny From (在下面介绍)一起使用。指定访问验证的次序。例如它可在deny 之前指定allow ,然后除在应被禁止的场合值之外,允许进行访问。如果先指定deny ,缺省情况下,访问该目录将被拒绝。
  Allow From and Deny From
  决定谁应该访问该命令所指定的该目录。None 和 All 的用途相当直截了当,也可以基于用户域名允许或者拒绝访问(简单地指定域名作为参数即可)。
  为了更好阐述这些选项,以及它们是如何在access.conf文件中配合使用的,下面为一个简单的例子:
  Options FollowSymLinks
  AllowOverride None
  Options IncludesNOEXEC FollowSymlinks
  AllowOverride None
  Order allow,deny
  Allow From All
  AllowOverride None
  deny from all
  srm.conf
  srm.conf 文件决定服务器如何处理诸如索引格式,内容类型定义等等更多方面的请求。
  DocumentRoot ""
  存放所有在线内容的根目录。
  UserDir
  用户存放其HTML文档的home目录。如果带有 ~username 参数,服务器将寻找在该用户的home目录中查找该目录。
  DirectoryIndex
  当在URL中没有指定文件时,所请求的特定目录中的缺省文件名。通常为index.html。
  FancyIndexing
  决定目录索引的显示风格 (当DirectoryIndex 不存在)。如果你已经关闭索引,该参数就不起作用。
  HeaderName
  指定目录中包含在index顶部的头文件名称,如果找到的话。
  ReadmeName
  readme文件的名称,如果找到的话,将标记为一个索引。
  AccessFileName
  每个目录中要被查找的访问控制文件名称,缺省名为.htaccess
  ScriptAlias ""
  在脚本的URL中使用的特定目录的别名。
  ScriptAlias /cgi-bin/ "/usr/local/mysite/scripts/"
  AddType
  该参数允许你配置web服务器能够识别的某种类型的文件,并带有文件扩展名,例如:
  AddType application/x-httpd-php .php
  AddHandler
  通过文件扩展名,允许把文件同特定的“handlers“,或者server-side 帮助应用程序联系起来。例如,通过使用AddHandler ,可以允许使用CGI脚本和服务器端动态生成的HTML。请看下例:
  AddHandler cgi-script .cgi
  AddHandler server-parsed .shtml
  一切完毕
  此时,你应该拥有一个配置适当,运行正常的Apache web服务器了