Red Hat Enterprise Linux 5.0服务器构建与故障排除
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第4章 Apache服务器的安装配置和故障排除

本章要点

● Web服务器软件Apache简介

● 安装Apache服务器

● Apache服务器的一般配置

● 在Apache服务器上配置虚拟主机

● 为Apache服务器配置WebDAV

● 多种开发环境语言在Linux下的整合

● Apache服务器的进阶配置

● Apache服务器的安全设置

● Apache服务器的优化

● Apache服务器的故障排除

4.1 Web服务器软件Apache简介

随着网络技术的普及、应用和Web技术的不断完善,Web服务已经成为Internet上重要的服务形式之一。原有的客户端/服务器模式正在逐渐被浏览器/服务器模式所取代,本章将重点Apache服务器安装配置和故障排除的方法。

4.1.1 Apache的发展历史

Apache源自于NCSA(University of Illinois, Urbana-Champaign)所开发的httpd。在1994年中期,许多Web主管自行发展自己的外加功能及修正码。一批Web主管通过私人电子邮件聚集在一起来实现其改变(以“patches”,即补丁的形式出现)。1995年2月底,8位核心贡献者成立原始的Apache组织(取自A PAtCHE),1995年4月,Apache 0.6.2公布。

在1995年5月~7月,一个新的服务器架构被开发出来(程序名为“Shambhala”)。其中包含模块结构及API,该架构是基于存储池的存储器配置及要调整的预设分支处理模式开发的。这个开发群体在7月份将此服务器架构转换到新的服务器上,并为Apache 0.7.x新增特色,于8月推出了Apache 0.8.8。在一年之内,Apache服务器超过了NCSA的httpd,成为Internet上排名第1位的服务器。

Apache的强项是极大的市场占有率,远远地将竞争者抛在后面,特别是如下所述优势使对方望尘莫及。

(1)起源于HTTP协议,从而降低了用户加入协议来支援新的应用软件的门槛。

(2)为UNIX/Linux带来生机,Apache走到哪里,UNIX/Linux就走到哪里。

(3)支援厂商的支持为Apache提供的工具/模块保持了持续成长。

IBM宣布将把Apache作为其WebSpehre应用服务器的一部分,这一轰动的宣布被商业报纸称为是开放源代码软件的一次突破。

4.1.2 市场情况

统计显示,最流行的Web服务器是OSS/FS。Apache是现在排行第1位的Web服务器,其市场份额比位于第2位的IIS高出了一倍多。

1.Internet上Web服务器统计

Netcraft在Web服务器上的统计(http://www.netcraft.com/survey)显示,自从1996年4月以后,Apache成为Web服务器领域应用最为广泛的软件。而在此前,使用最广泛的Web服务器是NCSA Web服务器(这是Apache的前身,也是OSS/FS)。它在1995年8月~1996年3月间占据了Web服务器市场份额第1的位置。从2000年开始,Netcraft就尝试只计算那些“活跃”的Web站点。因为很多Web站点被创建以后并未被使用(比如,虽然注册了域名,但并未使用),这样的站点属于“非活跃”的站点。很显然,这种统计方式更能反映实际的情况。在统计活跃的站点时,2006年6月的数据是Apache占据了56.25%的市场份额,IIS占据了31.71%,而Sun的份额是1.53%,Zeus的份额是0.62%。图4-1所示为1995年9月~2007年6月Web服务器市场份额的变化情况(http://news.netcraft.com/archives/web_server_survey.html)。

图4-1 Netcraft公司统计的Web服务器使用情况

2.商业网站统计

E-soft(http://www.securityspace.com/s_survey)进行的另外一个独立调查也显示了Apache在Web服务器领域中占有统治地位。截止2006年7月1日,这个调查把Web服务器进行了细分。共调查了8676 467台Web服务器,得出商业站点(.com)使用的Apache名列第一,市场份额是70.60%,其后是IIS(23.93%)。访问http://www.securityspace.com/s_survey/data/200606/domain.html,如图4-2所示。

图4-2 E-soft统计的.com网站使用Web服务器的情况

3.安全服务器领域

Netcraft报道,Apache已经超越Microsoft成为开发者首选的SSL服务器,有44.0%的加密链接网站使用Apache作为服务器,43.8%使用Microsoft产品。作为SSL协议的最初开发者,Netscape原本拥有最多的市场。但是很快被Microsoft借助IIS所超越,IIS在几年内始终拥有40%~50%的市场。Apache的第1个版本不支持SSL,因为美国对加密算法有出口限制。所以开源项目的加密部分必须放到美国境外开发,同时必须单独发布。因此许多独立的项目为Apache提供了SSL支持,包括Apache-SSL和mod_ssl。但是当时一些商业版本的SSL模块,比如,c2net的Stronghold更为流行。到了Apache第2个版本,mod_ssl被作为默认模块包含进来,Apache开始成为一个流行的SSL服务器。Netcraft关于SSL的调查自从1996年开始跟踪Internet上不断增多的支持SSL的Web服务器所用的服务器软件、操作系统和验证算法(http://news.netcraft.com/archives/2006/04/26/apache_now_the_leader_in_ssl_servers.html)。

E-soft也专门对安全的服务器(支持SSL/TLS的Web服务器,比如电子商务站点)进行了调查。即使在这些领域,Apache的市场份额也有52.07%,而IIS的份额是39.66%。因为Stronghold是将Apache重新打包以后发行的产品,所以Apache这个领域的实际市场份额应该更多。很显然,各个Web服务器的市场份额经常都处于变化之中,最新的情况我们可以查看上述的相关链接。实际上,在最新的数据中Apache依然遥遥领先。

4.1.3 Apache的工作原理

Web系统是客户端/服务器式的,所以应该有服务器程序和客户端程序两个部分。常用的服务器程序是Apache,常用的客户端程序是浏览器(如IE、Netscape和Mozilla)。我们可以在浏览器的地址栏内输入统一资源定位地址(URL)来访问Web页面,Web最基本的概念是超文本(Hypertext)。它使得文本不再是传统的书页式文本,而是可以在阅读过程中从一个页面位置跳转到另一个页面位置。用来书写Web页面的语言称为“超文本标记语言”,即HTML。WWW服务遵从HTTP协议,默认的TCP/IP端口是80,客户端与服务器的通信过程简述如下。

(1)客户端(浏览器)和Web服务器建立TCP连接,然后向Web服务器发出访问请求(如get)。根据HTTP协议,该请求中包含了客户端的IP地址、浏览器的类型和请求的URL等一系列信息。

(2)Web服务器收到请求后,将客户端要求的页面内容返回到客户端。如果出现错误,则返回错误代码。

(3)断开与远端Web服务器的连接。

下面是一个客户端发送给Web服务器请求的数据包内容:

GET /engineer/ideal/list.htm HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/vnd.ms-powerpoint,application/vnd.ms-excel,application/msword,*/*
Referer: http://www.linuxar.com.cn/engineer/ideal/
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Host: www.linuxar.com.cn
Connection: Keep-Alive

从代码中可以看到,在客户端的请求中包含很多有用的信息,如客户端类型等。Web服务器会将请求的Web页内容发送返回给客户端。HTTP/1.1(超文本链接协议1.1版本)是HTTP协议的最新版本,该协议是运行在TCP/IP协议组上的万维网应用协议。HTTP/1.1提供了比前一版本更快的访问网站速度,同时针对网络资源进行优化,降低了网络流量。HTTP/1.1由Internet工程任务组开发,现在大部分服务器和网站都支持该协议。

下面是一些HTTP/1.1能够加快网页访问速度的原因。

(1)以往的HTTP协议每次访问应用程序时都会执行创立及撤销链接的步骤,HTTP/1.1在首次访问网站时建立持久链接,将多个请求批量或通过管道发送到输出缓冲区内。TCP协议允许将多个来自IP层的数据包请求或回复命令集中到一个TCP段中,因此减少了反复建立链接所需的时间。同时由于没有了不必要的申请链接数据包,也降低了网络流量。由于将命令通过管道输送,所以大大提高了TCP段的效率。总之,网络流量降低了,性能提高了。

(2)当支持HTTP/1.1的浏览器发现网页是未压缩网页时会将网页压缩后传输,这样可以节约更多流量空间。不过由于网页中的图片文件一般都已经被压缩过,因此这种压缩对图片多的网页不太有效。除持久链接及其他改进后的性能之外,HTTP/1.1还允许多个域名共享同一IP地址,从而简化了网络服务器对虚拟主机数目管理的处理量。

4.1.4 Apache服务器的特点

对一部分人而言,高级Apache 2.2版本的引入具有里程碑的意义,因为它能更紧密地使用轻量级目录存储协议(Lightweight Directory Access Protocol)。在RHEL 4中,使用的是Apache Web服务器的2.0版本。然而在移植到Apache 2.2之前,Web应用程序需要做大量测试。如同当年从Apache 1.3移植到Apache 2.0相类似,也是一次“凤凰涅磐”的过程。尽管如此,Apache 2.2的健壮性依然诱惑着很多用户,如引入了更灵活的验证支持,但是模块应用程序编程接口稍有不同。Apache的主要特征如下。

(1)支持HTTP/1.1协议。Apache是最先使用HTTP/1.1协议的Web服务器之一,它完全兼容HTTP/1.1协议并与HTTP/1.0协议向后兼容,同时为新协议所提供的全部内容做好了必要的准备。

(2)支持CGI(通用网关接口)。Apache用mod_cgi模块来支持CGI,它遵守CGI/1.1标准并且提供了扩充的特征,如定制环境变量和很难在其他Web服务器中找到的调试支持功能。

(3)支持HTTP认证。Apache支持基于Web的基本认证,还为支持基于消息摘要的认证做好了准备。它通过使用标准的口令文件DBM SQL调用,或通过对外部认证程序的调用来实现基本的认证。

(4)集成的Perl语言。Perl已成为CGI脚本编程的基本标准,现在Apache比以往任何时候都更加支持Perl。通过使用其mod_perl模块可以将基于Perl的CGI脚本装入内存,并根据需要多次重复使用该脚本,从而消除了经常与解释性语言联系在一起的启动开销。

(5)集成的代理Proxy服务器,Apache可作为前向代理服务器或后向代理服务器。

(6)服务器的状态和可定制的日志。Apache在记录日志和监视服务器本身状态方面提供了很大的灵活性,可以通过Web浏览器来监视服务器的状态,也可根据需要来定制日志。

(7)允许根据客户主机名或IP地址限制访问。

(8)支持CGI脚本,如Perl和Php等。

(9)支持用户Web目录。Apache允许主机上的用户使用特定的目录存放用户自己的主页,可以通过如下URL地址来访问,如用户zhang,http://hostname/~zhang

(10)支持虚拟主机。即通过在一台机器上使用不同的主机名来提供多个HTTP服务,Apache支持包括基于IP、名字和Port共3种类型的虚拟主机服务。

(11)支持动态共享对象。Apache的模块可在运行时动态加载,这意味着这些模块可以被装入服务器进程空间,从而减少系统的内存开销。

(12)支持服务器包含命令SSI。Apache提供扩展的服务器包含命令该项功能,为Web站点开发人员提供了更大的灵活性。

(13)支持安全Socket层(SSL)。

(14)通过使用HTTP cookies,一个称为“mod_usertrack”的Apache模块可以在用户浏览Apache Web站点时跟踪用户。

(15)Apache使用mod_fcgi模块来实现FastCGI环境,并使FastCGI应用程序运行得更快。

(16)支持Java Servlets。Apache的mod_jserv模块支持Java Servlets该项功能可使Apache运行服务器的Java应用程序。

(17)支持多进程。当负载增加时,服务器会快速生成子进程来处理,从而提高系统的响应能力。

4.1.5 Apache服务器的模块

与Apache 1.3类似,Apache 2.0系列仍旧使用模块的方式运行。Apache由内核、标准模块和第三方提供的模块3个层次组成,其中的标准模块如下。

(1)Core:Apache HTTP服务器核心模块。

(2)mpm_common:MPM执行的一组指令。

(3)mpm_netware:专为Novell NetWare服务器优化的MPM模块。

(4)mpm_winnt:专为Windows NT优化的MPM。

(5)Perchild:独立子进程(Perchild)运行方式的MPM。

(6)Prefork:预派生(Profork)运行方式的MPM。

(7)Worker:工作者(Worker)运行方式的MPM。

(8)mod_access:提供基于主机名、IP地址或者其他客户请求的访问控制。

(9)mod_actions:模块为基于媒体类型请求方式执行CGI脚本。

(10)mod_alias:提供文档树中主机文件系统各部分的映射和URL重定向。

(11)mod_asis:传送包含只有HTTP头的文件。

(12)mod_auth:使用文本文件的用户身份验证。

(13)mod_auth_anon:允许匿名用户访问身份验证。

(14)mod_auth_dbm:提供使用DBM数据库文件的用户身份验证。

(15)mod_auth_digest:使用MD5深层身份验证的用户身份验证。

(16)mod_autoindex:自动生成类似于UNIX的ls命令或Windows 32 dir shell命令的目录索引。

(17)mod_cache:通向URI的内容cache。

(18)mod_cern_meta CERN http:原文件语意。

(19)mod_cgi:执行CGI脚本(用于进程方式的MPM)。

(20)mod_cgid:执行CGI脚本(用于线程方式的MPM)。

(21)mod_charset_lite:设定翻译和重编码的特别字符。

(22)mod_dav:实现分布式授权和版本发行(DAV)功能。

(23)mod_deflate:传送至客户端前进行内容压缩。

(24)mod_dir:提供用于“trailing slash”重定向和服务的目录索引文件。

(25)mod_echo:解释协议模块的简单映射服务器。

(26)mod_env:调整传送给CGI脚本和SSI页的环境。

(27)mod_example:解释Apache模块的API。

(28)mod_expires:根据用户限定标准生成到期的HTTP头。

(29)mod_ext_filter:在传达给客户之前通过外部程序发出回应体。

(30)mod_file_cache:在内存中缓存一个文件静态列表。

(31)mod_headers HTTP:请求和回应头的个性化处理。

(32)mod_imap:服务器端镜像处理。

(33)mod_include:支持SSI。

(34)mod_info:生成服务器配置信息。

(35)mod_isapi Apache中为Windows提供的ISAPI扩展。

(36)mod_log_config:记录发向服务器的请求日志。

(37)mod_mime:联合被请求文件扩展名和文件行为(处理和筛选)的内容(mime类型、语言、字符集和编码)。

(38)mod_mime_magic:通过查看文件内容的几个字节确定MIME类型。

(39)mod_negotiation:提供内容协商。

(40)mod_proxy:支持HTTP/1.1协议的代理/网关服务器。

(41)mod_rewrite:提供URL请求的复杂重定向功能。

(42)mod_setenvif:允许基于请求类型的环境变量设置。

(43)mod_so:在启动或重启时提供可执行编码和模块的启动。

(44)mod_speling:试图更正因用户忽略大小写或一处错误拼写而引起的错误URL。

(45)mod_ssl:使用SSL和TLS的密码技术。

(46)mod_status:提供服务器运行性能信息。

(47)mod_suexec:允许作为特殊用户或组运行CGI脚本。

(48)mod_unique_id:为每个请求提供具有单一身份的环境变量。

(49)mod_userdir:设置基于每个用户的站点目录。

(50)mod_usertrack:跟踪用户在访问一个站点时的行为,记入日志。

(51)mod_vhost_alias:提供大量虚拟主机的动态配置。

除了标准模块之外,还可以找到许多第三方模块,可以连接网址http://modules.apache.org查看有关信息。

4.2 安装Apache服务器

4.2.1 安装

安装步骤如下。

(1)查看是否安装了Apache:

# rpm -qa|grep httpd

(2)将RHEL5的dvd安装光盘放入光驱后挂载:

# mount /mnt/cdrom

(3)进入光盘的Red Hat/RPMS目录:

# cd /mnt/cdrom/Red Hat/RPMS

(4)安装所需的RPM包:

# rpm -ivh httpd-2.2.3-6.el5.i386.rpm
# rpm -ivh httpd-manual-2.2.3-6.el5.i386.rpm

(5)弹出光盘。

# cd;eject

4.2.2 启动Apache服务器并且测试

启动并测试Apache服务器步骤如下。

(1)pache服务器:

#service httpd start
启动httpd:(确定)

(2)查看进程树:

#pstree|grep httpd
|-httpd---8*[httpd]

(3)查看运行状态:

service httpd status
httpd (pid 293929382937293629352934293329322930) 正在运行...

(4)通过浏览器检查。

在一台和Apache服务器连接的计算机上打开浏览器,输入“http://ip”命令。按回车键,如果出现图4-3所示界面,即可证明Apache服务器已经启动。

图4-3 通过浏览器检查apache服务器是否启动

(5)自动启动Apache。

若希望httpd在下次计算机启动时自动启动,使用命令:

# ntsysv

选中httpd即可。

(6)Apache服务器启动命令。

httpd是Apache超文本传输协议服务器的主程序,被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。通常httpd不应该被直接调用,而应该在类UNIX系统中由apachectl调用,命令格式如下:

httpd [ -d serverroot ] [ -f config ] [ -C directive ] [ -c directive ] [ -D parameter ][ -e level ] [ -E file ] [ -k start|restart|graceful|stop|graceful-stop ] [ -R directory ] [ -h ][ -l ] [ -L ] [ -S ] [ -t ] [ -v ] [ -V ] [ -X ] [ -M ]

参数说明如下。

● -d serverroot:将ServerRoot指令设置初始值为serverroot,可以被配置文件中的ServerRoot指令所覆盖,其默认值是/usr/local/apache2。

● -f config:在启动中使用config作为配置文件。如果config未以“/”开头,则其为相对于ServerRoot的路径。默认值是conf/httpd.conf。

● -k start|restart|graceful|stop|graceful-stop:发送信号使httpd启动、重新启动或停止。

● -C directive:在读取配置文件之前处理directive的配置指令。

● -c directive:在读取配置文件之后处理directive的配置指令。

● -D parameter:设置参数parameter,配合配置文件中的<IfDefine>段用于在服务器启动和重新启动时有条件地跳过或处理某些命令。

● -e level:在服务器启动时设置LogLevel为level,用于在启动时临时增加出错信息的详细程度,以帮助排错。

● -E file:将服务器启动过程中的出错信息发送到文件file。

● -R directory:当在服务器编译中使用了SHARED_CORE规则时,指定共享目标文件的目录为directory。

● -h:输出一个可用的命令行选项的简要说明。

● -l:输出一个静态编译在服务器中的模块的列表,不会列出使用LoadModule指令动态加载的模块。

● -L:输出一个指令的列表,并包含各指令的有效参数和使用区域。

● -M:输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块。

● -S:显示从配置文件中读取并解析的设置结果(目前仅显示虚拟主机的设置)。

● -t:仅对配置文件执行语法检查,在语法解析检查结束后立即退出,或者返回“0”(OK),或者返回非0值(Error)。如果还指定了“-D DUMP_VHOSTS”,则会显示虚拟主机配置的详细信息。

● -v:显示httpd的版本后退出。

● -V:显示httpd的版本和编译参数后退出。

● -X:以调试模式运行httpd,仅启动一个工作进程并且服务器不与控制台脱离。

4.2.3 目前运行的Apache服务器的相关信息

1.查看Red Hat发布的Apache 2.0的相关信息

执行如下步骤可以查看Red Hat发布的Apache 2.2.3的一些相关信息。

(1)查看编译配置参数使用httpd -V命令,例如:

httpd -V
Server version: Apache/2.2.3
Server built:   Nov 292006 06:33:19
Server's Module Magic Number: 20051115:3
Server loaded:  APR 1.2.7, APR-Util 1.2.7
Compiled using: APR 1.2.7, APR-Util 1.2.7
Architecture:   32-bit
Server MPM:    Prefork
  threaded:    no
    forked:    yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
-D DEFAULT_PIDLOG="logs/httpd.pid"
-D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
-D DEFAULT_LOCKFILE="logs/accept.lock"
-D DEFAULT_ERRORLOG="logs/error_log"
-D AP_TYPES_CONFIG_FILE="conf/mime.types"
-D SERVER_CONFIG_FILE="conf/httpd.conf"

从以上输出可以了解Apache服务器版本和编译的参数。

(2)查看已经被编译的模块使用httpd-l命令,例如:

httpd -l
Compiled in modules:
  core.c
  prefork.c
  http_core.c
  mod_so.c

说明:被编译的模块中包含mod_so.c,表示当前的Apache支持DSO(Dynamic Shared Objects),即用户可以在不重新编译Apache的情况下使用APache eXtenSion(apxs)编译Apache的第三方模块;被编译的模块中包含prefork.c,表示Red Hat发布的Apache是使用预派生(Profork)MPM模式运行的。

2.Apache服务器在RHEL 5.0中的配置文件

Apache服务器的设置文件位于/etc/httpd/conf/目录下,传统上使用3个配置文件,即httpd.conf、access.conf和srm.conf来配置Apache服务器的行为。在新版本的Apache中所有的设置都被放在了httpd.conf中,因此只需要调整这个文件中的设置。以下以使用默认提供的httpd.conf为例,#部分是解释Apache服务器的各个设置选项,Apache服务器的配置指令别分成3个相对集中的部分。

(1)配置Apache服务器在整个运行过程中的环境变量:

#第一区:全局环境参数
#当服务器响应主机头(header)信息时显示Apache的版本和操作系统名称
ServerTokens OS
#设置服务器的根目录
ServerRoot "/etc/httpd"
#设置运行Apache时使用的PidFile的路径
PidFile run/httpd.pid#若300秒后没有收到或送出任何数据就切断该连接
Timeout 300
#不使用保持连接的功能,即客户一次请求连接只能响应一个文件
/建议用户将此参数的值设置为On,即允许使用保持连接的功能
KeepAlive Off
#在使用保持连接功能时,设置客户一次请求连接能响应文件的最大上限
MaxKeepAliveRequests 100
#在使用保持连接功能时,两个相邻的连接的时间间隔超过15秒,就切断连接
KeepAliveTimeout 15
#设置使用prefork MPM运行方式的参数,此运行方式是Red Hat默认的方式
<IfModule prefork.c>
#设置服务器启动时运行的进程数
StartServers 8
#Apache在运行时会根据负载的轻重自动调整空闲子进程的数目,
#若存在低于5个空闲子进程,就创建一个新的子进程准备为客户提供服务
MinSpareServers 5
#若存在高于20个空闲子进程,创建逐一删除子进程来提高系统性能
MaxSpareServers 20
#限制同一时间的连接数不能超过150
MaxClients 150
#限制每个子进程在结束处理请求之前能处理的连接请求为1000
MaxRequestsPerChild 1000
</IfModule>
#设置使用worker MPM运行方式的参数
<IfModule worker.c>
...
</IfModule>
#设置使用perchild MPM运行方式的参数
<IfModule perchild.c>
</IfModule>
#设置服务器的监听端口
Listen 80
#将/etc/httpd/conf.d目录下所有以conf结尾的配置文件包含进来
Include conf.d/*.conf
#动态加载模块(DSO)
LoadModule access_module modules/mod_access.so
LoadModule auth_module modules/mod_auth.so
...........
LoadModule proxy_connect_module modules/mod_proxy_connect.so
#当使用内置模块prefork.c时动态加载cgi_module
<IfModule prefork.c>
LoadModule cgi_module modules/mod_cgi.so
</IfModule>
#当使用内置模块worker.c时动态加载cgid_module
<IfModule worker.c>
LoadModule cgid_module modules/mod_cgid.so
</IfModule>
# 信息(ExtendedStatus On),还是产生基本信息(ExtendedStatus Off)。默认为off
# ExtendedStatus On

(2)配置主服务器或默认服务器运行时的详细接口参数:

# 第二区:“主”服务配置
#设置运行Apache服务器的用户和组
User apache
Group apache
#设置Apache服务器管理员的E-mail地址
ServerAdmin root@localhost
#关闭此选项,当Apache服务器需要指向本身的连接时使用
#ServerName:Port作为主机名,例如www.jamond.net:80
#若打开此选项将使用www.jamond.net port 80作为主机名
UseCanonicalName Off
#设置根文档路径
DocumentRoot "/var/www/html"
#设置Apache服务器根的访问权限
<Directory />
#允许符号链接跟随,访问不在本目录下的文件
Options FollowSymLinks
#禁止读取.htaccess配置文件的内容
 AllowOverride None
</Directory>
#设置根文档目录的访问权限
<Directory "/var/www/html">
#Indexes:当在目录中找不到DirectoryIndex列表中指定的文件
# 就生成当前目录的文件列表
#FollowSymLinks:允许符号链接跟随,访问不在本目录下的文件
 Options Indexes FollowSymLinks
#禁止读取.htaccess配置文件的内容
AllowOverride None
#指定先执行Allow(允许)访问规则,再执行Deny(拒绝)访问规则
Order allow,deny
#设置Allow(允许)访问规则,允许所有连接
 Allow from all
</Directory>
#对Apache服务器根的访问不生成目录列表,同时指定错误输出页面
<LocationMatch "^/$>
Options -Indexes
ErrorDocument 403 /error/noindex.html
</LocationMatch>
#不允许每用户的服务器配置
<IfModule mod_userdir.c>
 UserDir disable
</IfModule>
#当访问服务器时,依次查找页面index.html、index.html.var
DirectoryIndex index.html index.html.var
#指定保护目录配置文件的名称
AccessFileName .htaccess
#拒绝访问以.ht开头的文件,即保证.htaccess不被访问
<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>
#指定负责处理MIME对应格式的配置文件的存放位置
TypesConfig /etc/mime.types
#指定默认的MIME文件类型为纯文本或HTML文件
DefaultType text/plain
#当mod_mime_magic.c模块被加载时,指定Magic信息码配置文件的存放位置
<IfModule mod_mime_magic.c>
MIMEMagicFile conf/magic
</IfModule>
#只记录连接Apache服务器的IP地址,而不记录主机名
HostnameLookups Off
#指定错误日志存放位置
ErrorLog logs/error_log#指定记录的错误信息的详细等级为warn级别
LogLevel warn
#定义四种记录日志的格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#指定访问日志的记录格式为combined(混合型),并指定访问日志存放位置
CustomLog logs/access_log combined
#设置Apache自己产生的页面中使用Apache服务器版本的签名
ServerSignature On
#设置内容协商目录的访问别名
Alias /icons/ "/var/www/icons/"
#设置/var/www/icons目录的访问权限
<Directory "/var/www/icons">
# MultiViews:使用内容协商功能决定被发送的网页的性质
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#设置Apche手册的访问别名
Alias /manual "/var/www/manual"
#设置/var/www/manual目录的访问权限
<Directory "/var/www/manual">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
#指定DAV加锁数据库文件的存放位置
<IfModule mod_dav_fs.c>
DAVLockDB /var/lib/dav/lockdb
</IfModule>
#设置CGI目录的访问别名
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#由于Red Hat中不使用worker MPM运行方式,所以不加载mod_cgid.c模块
<IfModule mod_cgid.c>
Scriptsock run/httpd.cgid
</IfModule>
#设置CGI目录的访问权限
<Directory "/var/www/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
#设置自动生成目录列表的显示方式
# FancyIndexing:对每种类型的文件前加上一个小图标以示区别
# VersionSort:对同一个软件的多个版本进行排序
# NameWidth=*:文件名子段自动适应当前目录下最长文件名
IndexOptions FancyIndexing VersionSort NameWidth=*
#当使用IndexOptions FancyIndexing之后,配置下面的参数,
#用于告知服务器在遇到不同的文件类型或扩展名时采用MIME编码格式
#辨别文件类型并显示相应的图标
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
#当使用IndexOptions FancyIndexing之后,配置下面的参数,
#用于告知服务器在遇到不同的文件类型或扩展名时采用所指定的格式
#并显示所对应的图标
AddIcon /icons/binary.gif .bin .exe
.....
AddIcon /icons/blank.gif ^^BLANKICON^^
#当使用IndexOptions FancyIndexing之后,且无法识别文件类型时
#显示此处定义的图标
DefaultIcon /icons/unknown.gif
#当服务器自动列出目录列表时,在所生成的页面之后显示README.html的内容
ReadmeName README.html
#当服务器自动列出目录列表时,在所生成的页面之前显示HEADER.html的内容
HeaderName HEADER.html
#设置在线浏览用户可以实时解压缩.Z .gz .tgz类型的文件
#并非所有浏览器都支持
AddEncoding x-compress Z
AddEncoding x-gzip gz tgz
#设置网页内容的语言种类(浏览器要启用内容协商)
#对中文网页,此项无实际意义
AddLanguage da .dk
...
AddLanguage hr .hr
#当启用内容协商时,设置语言的先后顺序
LanguagePriority en da nl et fr de el it ja kr no pl pt pt-br ltz ca es sv
# (tw ) Prefer:当有多种语言可以匹配时,使用LanguagePriority列表的第1项
# Fallback:当没有语言可以匹配时,使用LanguagePriority列表的第1项
ForceLanguagePriority Prefer Fallback
#设置默认字符集
AddDefaultCharset ISO-8859-1
#设置各种字符集
AddCharset ISO-8859-1 .iso8859-1 .latin1
.......
AddCharset shift_jis .sjis
#添加新的MIME类型(避免用户编辑/etc/mime.types)
AddType application/x-tar .tgz
#设置Apache对某些扩展名的处理方式
AddHandler imap-file map
AddHandler type-map var
#使用过滤器执行SSI
AddOutputFilter INCLUDES .shtml#设置错误页面目录的别名
Alias /error/ "/var/www/error/"
#设置/var/www/error目录的访问权限
<IfModule mod_negotiation.c>
<IfModule mod_include.c>
 <Directory "/var/www/error">
AllowOverride None
Options IncludesNoExec
AddOutputFilter Includes html
AddHandler type-map var
Order allow,deny
Allow from all
LanguagePriority en es de fr
ForceLanguagePriority Prefer Fallback
</Directory>
# 设置错误输出页面
ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
.....
 ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
</IfModule>
</IfModule>
#设置浏览器匹配
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4\.0" force-response-1.0
BrowserMatch "Java/1\.0" force-response-1.0
BrowserMatch "JDK/1\.0" force-response-1.0
BrowserMatch "Microsoft Data Access Internet Publishing Provider"
redirect-carefully
BrowserMatch "^WebDrive" redirect-carefully

(3)虚拟服务器设置部分。

设置虚拟服务器,使得在同一台Apache服务器上可完成不同IP地址或主机名的Web请求,即一台物理上的服务器可被设置为有多个IP地址或主机名的虚拟服务器:

#第三区“虚拟服务配置
# 使用基于域名的虚拟服务器.
#虚拟服务器的ip地址和端口
NameVirtualHost *:80
#服务器的ip地址
<VirtualHost *:80>
#  管理员邮箱
 ServerAdmin webmaster@dummy-host.example.com
#  存放网页的根目录
 DocumentRoot /www/docs/dummy-host.example.com
#   虚拟服务器名称
ServerName dummy-host.example.com
#  错误信息日志名称
  ErrorLog logs/dummy-host.example.com-error_log
#  一般信息日志名称
 CustomLog logs/dummy-host.example.com-access_log common
#</VirtualHost>

说明:不同发行版本的Linux的Apache配置文件(httpd.conf)的3个配置区的顺序可能会不同,另外不同Apache版本的Apache配置文件(httpd.conf)也有差异。但是其语法相同,这里提供的配置文件仅供参考。

4.2.4 Apache服务器默认配置的信息

Apache服务器默认配置的信息如下。

(1)配置文件:/etc/httpd/conf/httpd.conf。

(2)服务器的根目录:/etc/httpd。

(3)根文档目录:/var/www/html。

(4)访问日志文件:/var/log/httpd/access_log。

(5)错误日志文件:/var/log/httpd/error_log。

(6)运行Apache的用户:apache。

(7)运行Apache的组:apache。

(8)端口:80。

(9)模块存放路径:/usr/lib/httpd/modules。

prefork MPM运行方式的参数如下:

StartServers 8
MinSpareServers 5
MaxSpareServers 20
MaxClients 150
MaxRequestsPerChild 1000

4.3 Apache服务器的一般配置

4.3.1 基本配置选项

Apache服务器默认配置为用户提供了一个良好的模板,基本的配置几乎不需要修改,但用户应该考虑修改或添加如下基本配置指令。

(1)KeepAlive。

将KeepAlive的值设为On,以便提高访问性能。

(2)MaxClients。

根据服务容量修改此值。

(3)ServerAdmin。

将ServerAdmin的值设为Apache服务器管理员的E-mail地址。

(4)ServerName。

首先删除ServerName前的注释符号“#”,然后设置服务器的FQDN。

(5)DirectoryIndex。

在此指令后添加其他的默认主页文件名,例如可以添加index.htm等。

(6)IndexOptions。

可以在此指令后添加FoldersFirst表示让目录列在前面(类似于资源管理器)。

4.3.2 配置用户的个人Web空间

1.配置步骤

配置每个用户的Web空间的目的是使在安装了Apache的本地计算机上拥有用户账号的每个用户都能够架设自己单独的Web站点。配置每个用户的Web站点的步骤如下。

(1)修改主配置文件启用每个用户的Web站点配置。

(2)修改主配置文件为每个用户的Web站点目录配置访问控制。

2.配置实例

(1)修改配置文件httpd.conf的内容如下:

#/修改如下部分的配置
<IfModule mod_userdir.c>
#基于安全考虑,禁止root用户使用自己的个人空间
UserDir disable root
#配置对每个用户Web站点目录的设置
UserDir public_html
</IfModule>
#设置每个用户Web站点目录的访问权限
<Directory /home/*/public_html>
 AllowOverride FileInfo AuthConfig Limit
Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
<Limit GET POST OPTIONS>
 Order allow,deny
 Allow from all
</Limit>
<LimitExcept GET POST OPTIONS>
 Order deny,allow
Deny from all
</LimitExcept>
</Directory>

(2)重新启动httpd:

# service httpd restart

(3)创建目录和修改权限:

# mkdir public_html
# cd ..
# chmod 711 osmond

(4)创建index.html:

vi index.html
cjh  Web Site.

4.4 Apache服务器的访问控制、认证和授权

4.4.1 Apache服务器的访问控制

Apache使用下面3个指令配置访问控制。

(1)Order:指定执行允许访问规则和执行拒绝访问规则的先后顺序。

(2)Deny:定义拒绝访问列表。

(3)Allow:定义允许访问列表。

Order指令的两种形式如下。

(1)Order Allow,Deny:在执行拒绝访问规则之前先执行允许访问规则,默认情况下将会拒绝所有没有明确被允许的客户。

(2)Order Deny,Allow:在执行允许访问规则之前先执行拒绝访问规则,默认情况下将会允许所有没有明确被拒绝的客户。

说明:在书写Allow,Deny和Deny,Allow时,中间不能添加空格字符。

4.4.2 Apache服务器的认证和授权

1.认证

(1)在RFC 2617中定义了如下两种认证方式。

● 基本(Basic)认证

● 摘要(Digest)认证

说明:摘要认证比基本认证更加安全,但遗憾的是目前并非所有的浏览器都支持,所以大多数情况下只使用基本认证。

(2)Apache服务器认证命令

Apache服务器所有的认证配置指令既可以出现在主配置文件的Directory容器中,也可以出现在./htaccess文件中。下面列出了可用的认证配置指令。

● AuthName:定义受保护领域的名称。

● 格式:AuthName领域名称。

● AuthType:定义使用的认证方式。

● 格式:AuthType Basic或Digest。

● AuthGroupFile:指定认证口令文件的位置

● 格式:AuthGroupFile文件名。

● AuthUserFile:指定认证组文件的位置

● 格式:AuthUserFile文件名。

2.Apache服务器的授权命令

当使用认证指令配置了认证之后还需要为指定的用户或组授权,授权指令是Require,其3种使用格式如下。

(1)Require user用户名[用户名]:授权给指定的一个或多个用户

(2)Require group组名[组名]:授权给指定的一个或多个组。

(3)Require valid-user:授权给认证口令文件中的所有用户。

3.管理认证文件

(1)创建新的认证口令文件。

可以使用如下命令在添加一个认证用户的同时创建认证口令文件:

# htpasswd -c认证口令文件名用户名

说明:htpasswd建立和更新用于基本认证的存储用户名/密码的文本文件,如果htpasswd不能读写此文件,则返回一个出错代码,而不做任何修改。服务器中的资源可以被限制为仅允许由htpasswd建立的文件中的用户所访问,此程序只能管理存储在文本文件中的用户名和口令,但是它可以加密并显示口令信息。

(2)htpasswd格式:

htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
htpasswd -b [ -c ] [ -m | -d | -p | -s ] [ -D ] passwdfile username password
htpasswd -n [ -m | -d | -s | -p ] username
htpasswd -nb [ -m | -d | -s | -p ] username password

常用选项如下。

● -b:使用批处理方式,即直接从命令行获取口令而不提示。使用这个选项需要特别注意,因为命令行中的口令是清晰可见的。

● -c:创建passwdfile文件,如果该文件已经存在,那么将被清空并改写。该参数不能和-n同时使用。

● -n:在标准输出上显示结果,而不是更新文件,用于生成可以为Apache非文本输出存储格式所接受的口令记录。它改变了命令行语法,因为passwdfile参数(通常是第1个)被忽略。该参数不能和-c同时使用。

● -m:使用MD5加密密码,在Windows、Netware和TPF中是默认方法。

● -d:使用crypt()加密口令,在Windows、Netware和TPF以外的平台上是默认方法。虽然有可能在所有的平台上被htpasswd支持,但是在Windows、Netware和TPF中该方法不能被httpd所支持。

● -s:使用SHA加密口令,这种方法易于通过LDAP目录交换格式和Netscape server进行交换。

● -p:使用明文口令(不加密)。

● -D:如果username存在于passwdfile中,则删除该用户。

● Passwdfile:包含用户名和密码的文本文件的名称。如果使用了-c选项,并且文件已存在,则更新它;否则创建它。

● username:在passwdfile中添加或更新记录。若username不存在,则添加一条记录,并更新其口令。

● password:将被加密并存储到文件中的明文口令。必须和-b同时使用。

(3)修改认证口令文件。

可以使用如下命令在现有的口令文件中添加用户或修改已存在的用户口令:

# htpasswd认证口令文件名用户名

(4)认证口令文件的格式。

与系统中的/etc/shadow文件类似,认证口令文件中每一行包含一个用户的用户名和加密的口令:

用户名:加密的口令

4.5 在Apache服务器上配置虚拟主机

4.5.1 虚拟主机简介

虚拟主机简介如下。

(1)什么是虚拟主机?

虚拟主机是使用特殊的软硬件技术把一台运行在Internet上的服务器主机分为多台“虚拟”的主机,每一台虚拟主机都具有独立的域名或IP地址,以及完整的Internet服务器(WWW、FTP及E-mail等)功能。虚拟主机之间完全独立,并可由用户自行管理。在外界看来,每一台虚拟主机和一台独立的主机完全一样。

(2)把一台机器的资源分配给若干台虚拟主机后,每台虚拟主机的性能是否会下降?

从理论上分析是这样,但由于用做虚拟主机的都是性能很高的计算机,所以一台主机能够支持一定数量的虚拟主机。只有超过这个数量时,用户才会感到性能下降。如果配置得当,加上采用超高速的线路,虚拟主机的表现往往胜于采用较低速度(如256 Kb/s及1.544 Mb/s)线路连接的独立主机。

(3)虚拟主机的意义是什么?

虚拟主机的出现是对Internet技术的重大贡献,由于多台虚拟主机共享一台真实主机的资源,每个用户承受的硬件、网络维护及通信线路的费用均大幅度降低,Internet真正成为人人用得起的网络!(4)虚拟主机采用什么操作系统?

目前使用最多的操作系统是Linux和Microsoft的Windows 2000/2003,二者各有所长。

(5)一台独立主机能够支持多少虚拟主机?

这要看这台独立主机的CPU、内存容量、I/O通道速度及硬盘空间等性能,通常一台P4 2.8 GHz至强、250 GB硬盘及2 GB内存的服务器,可以支持80台~100台虚拟主机。

(6)管理一个虚拟主机是否很容易?

基本上不需要管理和维护主机,在需要管理时它也比管理一台独立的主机容易很多。

(7)在虚拟主机上的内容是否安全?

非常安全,未经许可的人都不可能看到主机中的内容。

(8)使用虚拟主机有什么限制?

以下行为是不允许的,即散布不受欢迎的电子邮件(SPAMing)或在新闻组中发布不妥的言论;运行与Web服务器无关的程序或进程,包括IRC、NEWSGROUP及其他;进行编译(Compile)工作;进行政治宣传和散布色情的和内容;进行任何试图改变系统的配置或破坏系统安全的操作;不使用聊天室和在线游戏等占用系统资源过大的程序。

(9)空间大小。

虚拟主机的空间容量是考核虚拟主机性能的一个重要指标,通常情况下必须要同时考核以下几种空间的容量大小。

● Web空间:即网页空间,是存储网页、程序及图片等文件的主要空间。

● 数据库空间:支持数据库的虚拟主机所提供的数据库存储空间。

● LOG空间:网站日志(LOG)文件的存储空间。

目前看来,服务商提供的空间都比较大。如100 MB的Web空间,若以标准网页计算,大致可容纳5000张A4纸信息或2000张图片信息,也可折算为7500万个汉字。

4.5.2 虚拟主机的类型

虚拟主机主要的类型如下。

1.基于IP地址的虚拟主机配置

这类服务器中每个基于IP的虚拟主机必须拥有不同的IP地址,可以通过配备多个真实的物理网络接口或使用几乎所有流行的操作系统都支持的虚拟界面来达到这一要求(详情请参见系统文档,这种功能一般被称为“IP别名”,用“ifconfig”命令来设置)。下列情况下,可能会需要使用基于IP的虚拟主机。

(1)一些古董级的客户端与基于域名的虚拟主机不兼容。

为了与基于域名的虚拟主机兼容,客户端必须发送Host头。HTTP/1.1规范中对此做了要求,所有常见的仅支持HTTP/1.0旧版本的浏览器都以附加的方式实现了这个要求。

(2)SSL协议的先天特性决定了基于域名的虚拟主机无法成为SSL安全服务器。

(3)一些操作系统和网络设备实现的带宽管理技术无法在多台主机共享一个IP的情况下区别它们。

2.基于域名的虚拟主机

基于IP的虚拟主机使用连接的IP地址来决定相应的虚拟主机,这样需要为每台虚拟主机分配一个独立的IP地址,而基于域名的虚拟主机是根据客户端提交的HTTP头中标识主机名的部分决定的。使用这种技术,很多虚拟主机可以共享同一个IP地址。基于域名的虚拟主机相对比较简单,因为只需要配置DNS服务器将每个主机名映射到正确的IP地址。然后配置Apache HTTP服务器,令其辨识不同的主机名即可,基于域名的服务器也可以缓解IP地址不足的问题。所以如果没有特殊原因必须使用基于IP的虚拟主机,最好还是使用基于域名的虚拟主机。

3.虚拟主机配置命令

下面是Apache服务器的虚拟主机配置样例:

<VirtualHost www.smallco.com>
ServerAdmin webmaster@mail.smallco.com
DocumentRoot  /groups/smallco/www
ServerName www.smallco.com
ErrorLog /groups/smallco/logs/error_log
TransferLog /groups/smallco/logs/access_log
</VirtualHost>

参数说明如下。

(1)ServerAdmin:设置虚拟主机管理员电子邮件地址。

(2)DocumentRoot:设置虚拟主机的根文档目录。

(3)ServerName:设置虚拟主机名称和端口。

(4)ErrorLog:设置虚拟主机的错误日志。

(5)TransferLog:设置虚拟主机的访问日志。

4.5.3 基于名称的虚拟主机配置

1.基于相同IP不同端口的虚拟主机

(1)使用vi命令修改配置文件/etc/http/conf/httpd.conf。

(2)将Listen字段改为:

Listen 80
Listen 8888

以上设置表示使用80及8888端口。

(3)更改虚拟主机部分为:

<VirtualHost 192.168.0.1:80>
DocumentRoot /var/www/html/website1
</VirtualHost>
<VirtualHost 192.168.0.1:8888>
DocumentRoot /var/www/html/website2
</VirtualHost>

(4)保存以上设置。

(5)创建目录及页面文件:

#mkdir -p /var/www/html/website1
#mkdir -p /var/www/html/website2
#cd /var/www/html/website1
#cat >index.html <<EOF
>website1
>EOF
#cd /var/www/html/website2
#cat >index.html <<EOF
>website2
>EOF

在/etc/httpd/conf/httpd.conf中有DirectoryIndex index.html index.html.var,表示只读取index.html,而不读取index.htm。

(6)service httpd restart。

完成以上设置后,可以通过以下方式访问:

(7)打开浏览器,输入http://192.168.0.1:80http://192.168.0.1:8888

2.基于相同端口不同IP地址的虚拟主机配置

(1)不同IP地址的配置:

#cd /etc/sysconfig/network-scripts
#cp ifcfg-eth0 ifcfg-eth0:1
#vi ifcfg-eth0:1
将eth0:1更改为:
DEVICE=eth0:1
ONBOOT=YES
BOOTPROTO=static
IPADDR=192.168.0.2
NETMASK=255.255.255.0

(2)使用vi命令修改配置文件。

更改虚拟主机部分为:

<VirtualHost 192.168.0.1:80>
DocumentRoot /var/www/html/website1
</VirtualHost>
<VirtualHost 192.168.0.2:80>
DocumentRoot /var/www/html/website2
</VirtualHost>

(3)创建目录及页面文件:

#mkdir -p /var/www/html/website1
#mkdir -p /var/www/html/website2
#cd /var/www/html/website1
#cat >index.html <<EOF
>website1
>EOF
#cd /var/www/html/website2
#cat >index.html <<EOF
>website2
>EOF

打开浏览器,输入http://192.168.0.1:80http://192.168.0.2:80

3.基于域名的虚拟主机的访问

(1)配置DNS,相关内容请参考第3章。

(2)使用vi命令修改配置文件:vi /etc/http/conf/httpd.conf。

更改虚拟主机部分为:

NameVirtualHost 192.168.0.1
<VirtualHost www1.example.com>
DocumentRoot /var/www/html/website1
ServerName www1.example.com
</VirtualHost>
<VirtualHost www2.example.com>
DocumentRoot /var/www/html/website2
ServerName www2.example.com
</VirtualHost>

创建目录及页面文件:

#mkdir -p /var/www/html/website1
#mkdir -p /var/www/html/website2
#cd /var/www/html/website1
#cat >index.html <<EOF
>website1
>EOF
#cd /var/www/html/website2
#cat >index.html <<EOF
>website2
>EOF

打开浏览器,输入http://www1.example.comhttp://www2.example.com

4.6 为Apache服务器配置WebDAV

4.6.1 WebDAV简介

1998年,IETF已经将WebDAV定为一个标准的规范,而且已经被广泛应用在多个平台和不同供应商的应用软件上。现在,在Apahe和Microsoft的Internet信息服务器上可以找到WebDAV的身影,业内主要的文档和内容管理供应商也为其提供支持。WebDAV功能嵌入了Windows和Mac OS X等普通台式机操作系统,以及Adobe、Lotus、Microsoft和其他公司的流行软件之中。该规范增加了一些新的特性,用户可以通过Internet访问和编辑文件。简而言之,它保证了来自Internet的任何地方之间的简单协作。

4.6.2 Wevdav技术的提出

将超文本传输协议(HTTP)扩展到在分布式的网络环境中,实现了协作的文件制作和编辑。这种扩展被称为“基于Web的分布式创作和控制协议”,即WebDAV,业内人士简称为“DAV”,(发音与DAVE相同)。WebDAV的开发源自1998年,现在Adobe、IBM、Microsoft及Oracle等许多大公司的相关产品已经支持这一协议。

4.6.3 从HTTP到WebDAV

HTTP是网络服务器和客户端(例如浏览器)通信时使用的协议。单击网页中一个文件链接时,浏览器将发送请求消息,这个消息包含消息头和方法参考。一般情况下,浏览器消息是“使用GET方法访问位于www.mysite.com/myPage.html中的文件”。请求的消息头包含的信息为发出请求的客户浏览器,被请求文件的名称和位置等。服务器的工作是处理这个请求,激活要求的方法(GET),并在响应信息中将结果发送给客户。这样响应是回流到浏览器的HTML文件,浏览器显示此HTML,然后与服务器的连接被释放。

WebDAV扩展了HTTP的基本请求/响应模型,新的方法使创作者能够在远程服务器上直接创建和修改基于Web的文件。从WebDAV标准如HTTP一样不受WWW联盟的控制;相反地,它被Internet Engineering Task Force(IETF)中的一个网络工作组Network Working Groups所管理。其规范是一个IETF的请求说明,并列为RFC2518。依据此规范,WebDAV的目标是提供一种让客户能够远程的创作Web内容的标准,在WebDAV中表明了一个创造交互式与协作应用的框架。

目前WebDAV的功能分为3类,即命名空间管理、锁和所有权管理。WebDAV增加了基本的(复制和移动方法),允许应用程序复制和移动单个的文件。另外,它提供了mkcol方法,使得工具能收集文件并提取文件的分级信息(例如,传统文件系统中的目录列表)。从技术上讲,这些方法属于命名空间管理类,它们通过允许创建目录和文件来实现基本的创作目标。分布式创作的一个重要方面是协作,为了支持这个特征,WebDAV采用了两个方法(加锁和解锁)以使一个用户在编辑文件时将其锁住以防止并发问题,并避免多个协作者相互覆盖其他人的改动。

WebDAV的所有权机制是其最有用的特征之一,从本质上讲,在WebDAV中所有权是元信息,表明这个文件的创建和最后修改者等。通过所有权可以发现和管理资源,并且所有权可以实现更加高级的特性。该规范建议创建一个“主题”所有权,允许以这些“主题”来检索所有的资源。

为支持这些特征,WebDAV提供了Propfind方法来查询文件的各种所有权。同样有一种方法允许客户端工具设置,修改和删除一个所有权,一旦所有权被设置,一种被称为“DASL”(DAV查找和定位协议)的辅助技术允许应用根据所有权值来查找Web资源。

对于互操作性,一个分布式创作应用应当独立于服务器平台,而忽略它是IIS、Apache或其他服务器。同时也应独立于浏览器,而忽略它是Microsoft的IE,Netscape的Navigator或是PALM的Pilot。因为WebDAV基于HTTP,所以它必定独立于平台。通过保留旧的HTTP的消息格式和增加新的HTTP消息头,WebDAV保留了平台独立的体系结构。这些消息头携带支持新的WebDAV应用的信息参数,以允许应用访问和设置所有权信息等。而且请求和响应消息以XML格式编码,此编码易于在以后增加新的特征,如所有权域。

4.6.4 WebDAV工作流程

WebDAV工作流程如图4-4所示。

图4-4 webdav工作流程

4.6.5 WebDAV工作方式

用户编辑存储在WebDAV服务器中的文档时,可以锁定该文档以保证自己的修订不会被其他用户覆盖。WebDAV的版本控制还可以让用户明白文档的最新版本,以减少不必要的混乱。

WebDAV的访问控制表提供了对每个文件的读、写和共享许可的高级控制,更进一步提高了系统的安全性,WebDAV的文件管理特性已经使它成为传统文档管理产品中性价比很高的一个替代方案。

WedDAV强制使用了一个通用的数据模型,包括收集、资源、锁定和所有权,并定义了使用自定义方式、标题和主体的HTTP通信的通用语法。它通过定义文件管理的一些程序,例如复制、移动和创建新Web文件夹的Mkcol程序,极大地扩展了HTTP,锁定和解锁程序使用户在改变一个文档时可以保护该文档。Propfind和Proppatch程序使文件夹可以被浏览,并提供了对元数据的弹性管理。所有的这些程序运行于HTTP的资源上,所以任何一个支持WebDAV的Web服务器都能提供安全创作的完整系统。

4.6.6 支持WebDAV的服务器工具

Apache从1.x版本开始通过mod_dav支持webdav,不过这个模块目前已经停止了开发,可以通过http://www.webdav.org/mod_dav/了解。推荐在Apache 2.0和2.2的版本上使用WebDAV。

4.6.7 在Apache 2.X系列服务器中设置Webdav

本节说明如何在Apache 2.X系列服务器中设置Webdav。

(1)编译apache服务器。

对于自己编译的Apache 2.2或者2.0服务器,编译时添加参数enable-dav。编译完成后执行以下命令:

# cd /etc/apache2/mods-enabled/
# ln -s /etc/apache2/mods-available/dav.load dav.load
# ln -s /etc/apache2/mods-available/dav_fs.load dav_fs.load
# ln -s /etc/apache2/mods-available/dav_fs.conf dav_fs.conf

在apache服务器的配置文件中添加如下两行:

DAVLockDB /tmp/DAVLock
DAVMinTimeout 600!

建立Webdav目录,并且添加访问权限:

# mkdir /var/www/webdav
# chown root:apache /var/www/webdav
# chmod 750 /var/www/webdav

建立一个最简单的配置:

<Directory /var/www/webdav>
    Dav On
</Directory>

到此为止,在Apache服务器配置Webdav工作基本完成,不过目前其安全性能不好。后面会逐步完善。

(2)在RHEL 5.0自身的Apache 2.2.3服务器上设置Webdav。

● 检查编译情况。

首先查看RHEL 5.0自身的Apache 2.2.3是否编译了dav模块,使用httpd-M命令,如图4-5所示。

图4-5 检查dav模块是否编译

从图中可以看到在RHEL 5.0自身的Apoache 2.2.3服务器中已经编译了Webdav。

● 修改Apache配置文件。

检查Apache服务器配置文件httpd.conf加载dav模块情况,删除以下两行前的#:

LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so

删除以下的#:

<IfModule mod_dav_fs.c>
    # Location of the WebDAV lock database.
    DAVLockDB /var/lib/dav/lockdb
</IfModule>

添加一行:

DAVMinTimeout 600!

● 设置客户端访问webdav目录:

<Directory /var/www/webdav/joe/>
          require user joe
</Directory>

● 设置权限:

# mkdir /var/www/passwd
    # htpasswd -c /var/www/passwd /htpass.dav joe
    # chown root:apache /etc/apache2/passwd/htpass.dav
    # chmod 640 /var/www/passwd /htpass.dav joe
    # mkdir /var/www/webdav/joe
    # chown apache:apache /var/www/webdav/joe
    # chmod 750 /var/www/webdav/joe

4.6.8 通过Webdav客户端软件访问Apache服务器

1.Webdav客户端软件

主要的Webdav客户端软件如表4-1所示。

表4-1 主要的Webdav客户端软件

说明:一个WebDAV应用就是一个内置WebDAV协议的程序,表4-1覆盖大多数支持WebDAV的流行程序。在Windows下,有一些有名的集成WebDAV客户端功能的软件,例如Microsoft的Office、Adobe的Photoshop和Macromedia的Dreamweaver。它们都可以直接打开和保存URL,也可以在编辑时大量使用WebDAV锁定。

2.Windows下的Webdav客户端访问服务器的使用方法

以Microsoft网络文件夹为例,Microsoft是WebDAV规范最早的支持者。在Windows 98配置客户端称为“网络文件夹”,这个客户端在Windows NT4和2000上也存在。最早的Webfolders客户端是浏览器的扩展,主要的浏览文件系统的GUI程序工作良好。在Windows 2003中,只需要添加一个新的网络位置,步骤如下。

(1)为了使用Windows 2003提供的Web文件夹,打开“网上邻居”窗口。然后双击“添加网上邻居”图标,打开添加网上邻居向导,如图4-6所示。

图4-6 添加网上邻居向导

(2)输入使用HTTP协议的URL,可以使用IP地址或FQDN,如图4-7所示。

图4-7 输入服务器IP或者域名

(3)单击“下一步”按钮,弹出认证对话框,如图4-8所示。

图4-8 认证对话框

(4)输入joe的用户名和口令,单击“确定”按钮打开如图4-9所示的对话框。

图4-9 输入网上邻居的名称

● 单击“下一步”按钮,显示如图4-10所示的webdav文件夹。

图4-10 webdav文件夹

用户可以像使用局域网资源一样来操作该文件夹,更新站点内容。

注意:为了安全的考虑,更新站点后,一定要删除webdav文件夹。

3.使用Linux下的Webdav客户端软件访问服务器的方法

(1)命令行工具。

Cadaver是一个用来浏览和修改WebDAV共享的Linux、Unix命令行程序,如同Subversion客户端,它使用了neon的HTTP库。Cadaver是自由软件(GPL许可证),可以在http://www.webdav.org/cadaver/下载。cadaver适合基本的WebDAV调试,它可以以压缩方式上传和下载文件,也会检验属性、复制、移动、锁定和解锁文件:

$ cadaver http://host/repos
dav:/repos/> ls
Listing collection '/repos/': succeeded.
Coll: > foobar                             0  May 10 16:19
      > playwright.el                    2864  May  4 16:18
      > proofbypoem.txt                  1461  May  5 15:09
      > westcoast.jpg                   66737  May  5 15:09
dav:/repos/> put README
Uploading README to '/repos/README':
Progress: [=============================>] 100.0% of 357 bytes succeeded.
dav:/repos/> get proofbypoem.txt
Downloading '/repos/proofbypoem.txt' to proofbypoem.txt:
Progress: [=============================>] 100.0% of 1461 bytes succeeded.

DAV Explorer是另一个独立运行的WebDAV客户端,使用Java编写。有一个类Apache的许可证,网站是http://www.ics.uci.edu/~webdav/。DAV Explorer与cadaver功能相似,优点是可移植,并有一个用户友好的GUI程序,它也是最早支持WebDAV访问控制协议(RFC 3744)的客户端。

(2)浏览器集成。

一些流行的文件浏览器程序支持WebDAV扩展,允许用户浏览DAV共享如同访问本机,并允许基本的目录树操作。例如,Windows的资源管理器可以把WebDAV服务器看做是一个“网络位置”,用户可以从桌面拖动文件到这个目录,或者重命名、复制或者删除文件。但是这只是文件浏览器的特性,DAV共享对于普通的应用不可见,所有的DAV操作需要通过浏览器界面完成。Linux下包括Nautilus及Konqueror。

Nautilus是GNOME桌面(http://www.gnome.org)官方的文件管理/浏览器,KDE桌面(http://www.kde.org)则是Konqueror。两个应用程序都是浏览器级别的WebDAV客户端,自动版本化的版本库工作良好。在GNOME的Nautilus从File menu中选择Open location,并且输入URL。就会显示版本库,如同其他文件系统。

在KDE的Konqueror中需要使用webdav://模式在地址栏中输入URL,如果输入http://的URL,Konqueror会像普通的web浏览器,会看到mod_dav_svn输出的普通HTML目录列表。通过输入webdav://host/repos代替http://host/repos,Konqueror成为一个WebDAV客户端,并且按照文件系统的方式显示版本库。在Konqueror中首先也要进行身份认证,如图4-11所示。

图4-11 身份认证

通过身份认证,即可使用Webdav管理文件,如图4-12所示。

图4-12 使用Webdav管理文件

4.7 多种开发环境语言在Linux下的整合

目前,常用的3种动态网页语言,即ASP(Active Server Pages)、JSP(JavaServer Pages)和PHP(Hypertext Preprocessor)中的后二者可以在Linux下使用。

4.7.1 在Apache服务器上运行CGI

CGI是独立于语言的网关接口规范,它实际上可以用任何广泛流行的应用程序开发语言来实现,包括C、C++、Perl、Shell脚本,甚至Java。Web服务器从客户端得到某个URL,通知必须运行一个CGI外部应用程序。Web服务器启动这一应用程序,等待完成并返回输出结果,最后将输出结果传输给另一端的Web客户。

mod_cgi模块Apache 2.x系列的默认安装支持的一个模块,通过它可以在Apache中直接使用CGI程序。可以使用httpd-M命令查看mod_cgi是否已经编译。修改apache配置文件的CGI目录部分如下:

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>
AddHandler cgi-script .cgi
#去掉该行注释

编写一个简单脚本文件,并且赋予权限。

vi /var/www/cg-bin/hello.cgi
!/usr/bin/perl
print "hello world".\n;
chmod 775 /var/www/cg-bin/hello.cgi

在浏览器的地址栏中输入IP,运行结果如图4-13所示。

图4-13 运行结果

4.7.2 在Apache服务器上运行PHP

1.PHP、MySQL和Apache关系

PHP是一种跨平台的服务器端的嵌入式脚本语言,它大量地借用C、Java和Perl语言的语法,并耦合PHP自己的特性使Web开发人员能够快速地写出动态产生页面。最新版本的PHP系列支持目前绝大多数数据库(MySQL、PostgreSQL、Oracle、DB2及Sybase等)。还有,PHP是完全免费的,可以从PHP官方站点(http://www.php.net)自由下载。PHP拓展了Web服务器的功能,实现了Web最佳服务的后端延展界面,如图4-14所示。

图4-14 PHP拓展了Web服务器的功能

以最新的PHP 5.01为例,支持它的Web服务器有Apache、Microsoft Internet information Sereve、Microsoft Personal web Server、AOL server和Netscape Enterprise等。PHP是一种功能强大的语言和解释器,无论是作为模块方式包含到Web服务器中,还是作为单独的CGI程序安装的,都能访问文件、执行命令或者在服务器上打开链接。而这些特性都使得PHP运行时带来安全问题,虽然PHP是特意设计成一种比用Perl或C语言所编写的CGI程序要安全的语言,但正确使用编译时和运行中的一些配置选项及恰当的应用编码将会保证其运行的安全性。一组庞大的可选参数能够保证将PHP用于许多不同的目的,但同时也意味着这些参数和服务端配置的组合会带来一些安全问题。PHP的配置与其代码相比,有着同样的灵活性。PHP可以用来建立完整的服务端应用程序,拥有所有外壳用户的权限。它也可以在被严格控制的环境下用做一个简单的服务端包含,仅承担很小的风险。如何建立该环境,以及其安全性如何,在很大程度上取决于PHP的开发人员。

2.安装MySQL

(1)编译:

cd mysql-4.0.15/
../configure --prefix=/usr/local/mysql
make
make install
cd ..

(2)增加MySQL用户:

adduser  -s /bin/false mysql

(3)初始化并设置目录权限:

/usr/local/mysql/bin/mysql_install_db
chown -R root /usr/local/mysql/
chown -R mysql /usr/local/mysql/var
chgrp -R mysql /usr/local/mysql/

(4)加入库:

echo /usr/local/mysql/lib/mysql/lib >>/etc/ld.so.conf
ldconfig

(5)使之启动时自动运行:

echo "/usr/local/mysql/bin/mysqld_safe &" >>/etc/rc.d/rc.local

(6)启动MySQL:

/usr/local//mysql/bin/mysqld_safe &

(7)安全性设定。

修改MySQL的root口令:

/usr/local/mysql/bin/mysqladmin -uroot password abcdefg

3.安装PHP

cd php-5.1.6
../configure--with-apxs2=/usr/local/httpd/bin/apxs --with-mysql=/usr/local/mysql
make
make install
cp php.ini-dist /usr/local/lib/php.ini

这种安装方式是将PHP作为Apache的SAPI模块来安装,它仅是其中的一种安装方式,更多的方法请参阅相关文档。

4.安装Apache 2.2.3

cd httpd-2.2.3/
../configure --prefix=/usr/local/httpd  --enable-so(enable是这里对应于后来需要的关键文件mod_jk2.so)
Make;make install
cd ..

现在已经将Apache 2.2.3安装到/usr/local/httpd目录中,安装后的Apache支持可装载模块和标准的MPM prefork。如果安装过程中没有出现错误,便可以使用如下命令启动Apache服务:

/usr/local/httpd/bin/apachectl start

如果启动成功,将启动命令加入rc.local,使之在系统启动时自动运行:

echo "/usr/local/httpd/bin/apachectl start &" >>/etc/rc.d/rc.local

停止Apache服务,并继续安装PHP:

/usr/local/httpd/bin/apachectl stop

5.PHP和Apache安装后的基本配置

(1)Apache的配置:

vi cd /etc/httpd/conf.d/php.conf(加入两行)
LoadModule php4_module modules/libphp4.so
AddType application/x-httpd-php .php .php3

同时修改DirectoryIndex为:

DirectoryIndex index.html index.php index.php3 index.jsp

(2)PHP的配置。

PHP语言的配置文件是/usr/local/lib/php.ini,编辑php.ini文件来配置PHP的选项。特别注意的是,安装完成后register_globals变量默认设置为Off,需要将其改为On;否则会出现PHP读不到post的数据的现象。

register_globals=On

可以写一个简单的PHP文件来测试安装,文件包含如下行:

<? phpinfo();?>

将其保存为/usr/local/httpd/htdocs/info.php,启动Apache。然后在浏览器中浏览,如图4-15所示。

图4-15 PHP测试信息

图中显示的信息表示php配置成功。

4.7.3 在Apache上运行JSP

1.JSP简介

JSP(Java Server Page)是Sun公司推出的新一代网站开发语言,它可以在Serverlet和JavaBean的支持下完成功能强大的站点程序,三者都提供了在HTML代码中混合某种程序代码、由语言引擎解释执行程序代码的能力。但JSP代码被编译成Servlet并由Java虚拟机解释执行,这种编译操作仅在对JSP页面的第1次请求时发生。在ASP、PHP及JSP环境下,HTML代码主要负责描述信息的显示样式,而程序代码则用来描述处理逻辑。普通的HTML页面只依赖于Web服务器,而ASP、PHP和JSP页面需要附加的语言引擎分析和执行程序代码。程序代码的执行结果被重新嵌入到HTML代码中,然后一起发送给浏览器。ASP、PHP和JSP三者都是面向Web服务器的技术,客户端浏览器不需要任何附加的软件支持。

2.Tomcat简介

Tomcat是基于最初由Sun捐赠的源代码的开放源码项目,它是一个HTTP服务器,是Sun通过Java Community Process开发并用servlet和JavaServer Page(JSP)技术的正式参考实现。如果想要尝试自己运行Tomcat,那么需要在系统中安装Java开发工具箱(Java Development Kit,JDK),而不是安装更小的Java运行时环境(Java Runtime Environment,JRE)。servlet和JSP技术用于构造HTTP服务器应用程序。虽然servlet技术中添加了许多特性(包括访问安全性、会话管理和线程控制),但它本身只是粗略地等价于为快速直接的Java语言调用而定制的CGI接口。JSP技术提供了一种处理动态生成的HTML页面的简便方法,这些HTML页面被直接编译成servlet以用于快速运行时操作。在这两种技术之外,Tomcat还提供了其他许多特性。凭其本身的性能,它实际上是全功能Web服务器,但通常在Linux系统上与Apache Web服务器前端共同使用。Apache向Tomcat提供了许多高级性能以适合静态内容。对于静态内容所占比例比较高且使用率很高的Web应用程序。Apache前端非常有用,Tomcat的目录结构如表4-2所示。

表4-2 Tomcat的目录结构

3.安装JDK和Tomcat

(1)JDK和Tomcat下载网址:

http://java.sun.com/javase/downloads/index.jsp
http://tomcat.apache.org/

下载的软件包放在/usr/local/目录下。

(2)安装JDK:

chmod +x jdk-1_5_0_07-linux-i586.bin
 ./jdk-1_5_0_07-linux-i586.bin
……安装过程从略
mv jdk1.5.0_07/ /usr/local/java

(3)设置JDK环境变量:

vi /etc/profile

在文件尾部增加以下几句:

JAVA_HOME=/usr/local/java
JRE=$JAVA_HOME/jre
LC_ALL=zh_CN.GBK
PATH=$JAVA_HOME/bin:$JRE/bin:$PATH
CLASSPATH=.:$JAVA_HOME/bin/tools.jar:$JAVA_HOME/lib/dt.jar
export JAVA_HOME JRE LC_ALL CLASSPATH PATH

(4)查看Java环境变量:

java -version
java version "1.5.0_07"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_07-b05)
Java HotSpot(TM) Client VM (build 1.5.0_07-b05, mixed mode, sharing)

(5)安装Tomcat:

tar xvfz jakarta-tomcat-5.0.20.tar.gz
mv jakarta-tomcat-5.0.20 /usr/local/
ln -s /usr/local/jakarta-tomcat-5.0.20 /usr/local/tomcat
打开/usr/local/tomcat/bin/Catalina.sh在上面注解的下方加入
JAVA_HOME=/usr/local/java/CATALINA_HOME="/usr/local/tomcat/"

(6)启动Tomcat:

/usr/local/tomcat5/bin/startup.sh
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/local/java

(7)查看tomcat端口:

netstat -ntulp | grep java
tcp   0     0 ::ffff:127.0.0.1:8005      :::*      LISTEN     2669/java
tcp   0     0 :::8009              :::*           LISTEN     2669/java
tcp   0     0 :::8080          :::*               LISTEN     2669/java

(8)使用浏览器检查,结果如图4-16所示。

图4-16 检查结果

4.整合ApAche服务器和Tomcat服务器

虽然Tomcat也可以作为Web服务器,但其处理静态html的速度比不上apache,并且其作为Web服务器的功能远不如Apache。因此想把Apache和Tomcat集成起来,以下是详细步骤。

(1)下载jakarta-tomcat-connectors-jk2-src.tar.gz:

Wget http://archive.apache.org/dist/jakarta/tomcat-connectors/jk2/jakarta-tomcat-connectors-jk2-src-current.tar.gz

(2)安装jk2:

cd jakarta-tomcat-connectors-jk2/jk/native2
./buildconf.sh
./configure --with-apxs2=/etc/apache/bin/apxsmake
cp jk/build/jk2/apache2/mod_jk2.so /usr/local/apache/modules

(3)复制文件:

cp /jakarta-tomcat-connectors-jk2-2.0.2-src/jk/conf/ workers2.properties/apache/conf/

(4)修改配置文件workers2.properties:

vi /usr/local/apache/conf/workers2.properties

在最后加上指向tomcat/webapp/下的某个应用目录,例如:

[uri:/jsp-examples/*]
info=Map the whole webapp

(5)修改配置文件/usr/local/tomcat/conf/jk2.properties:

vi /usr/local/tomcat/conf/jk2.properties
# list of needed handlers.
handler.list=channelSocket,request
# Override the default port for the channelSocket
channelSocket.port=8009

(6)重新设置环境变量:

vi /etc/profile加入
export CATALINA_HOME=/usr/local/tomcat
export CATALINA_BASE=/usr/local/tomcat

5.启动、关闭并测试Apache和Tomcat

(1)启动Apache和Tomcat,命令如下:

/tomcat/bin/catalina.sh start
/apache/bin/apachectl start

(2)关闭Apache和Tomcat,命令如下:

/tomcat/bin/catalina.sh stop
/apache/bin/apachectl stop

(3)测试。

在浏览器中输入http://192.168.1.12/jsp-examples/,按回车键,结果页面如图4-17所示。

图4-17 结果页面

如果出现Tomcat的jsp-examples/页面,则整合完成。Tomcat作为一个Servlet(JSP也被编译为Servlet执行)容器,其应用前景是非常好的。如果与JBoss结合,则可以实现Sun的J2EE规范(用JBoss做EJB服务器)。

4.8 Apache服务器的进阶配置

4.8.1 Apache服务器的实时监控

1.查看Apache服务器配置信息

如果Apache添加了mod_info模块,就可以通过访问http://ip/server-info查看服务器信息。首先修改配置文件httpd.conf,删除下面配置行前的“#”:

<Location /server-info>
SetHandler server-info
Order deny,allow
Deny from all
Allow from 192.168.1.12
#拒绝所有的客户,只允许来自192.168.1.12的主机访问
</Location>

图4-18所示为Apache服务器配置信息页面。

图4-18 查看Apache服务器配置信息

通过Apache服务器配置信息页面可以了解服务器的4个配置信息,即配置文件内容、服务器设置、模块列表和激活的钩子函数。

2.查看服务器当前状态

如果Apache添加了mod_status模块,就可以通过访问http://ip/server-status查看服务器信息。首先修改配置文件httpd.conf,删除下面配置行前的“#”:

<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.1.12
#拒绝所有的客户,只允许来自192.168.1.12的主机访问
</Location>

图4-19所示为Apache服务器当前状态页面。

通过Apache当前状态信息页面。可以了解服务器的信息,包括服务器系统的当前时间、服务器最近一次重启时间、服务器启动后的运行时间、到目前为止服务的访问总数、到目前为止传输的字节总数、服务请求的子进程数、空闲子进程数、每个进程状态、子进程服务的请求数,以及该子进程传输的字节总数、每秒平均请求数、每秒传输的字节数、每次请求平均传输字节数、目前每个子进程CPU占用及Apache的总的CPU占用率,及当前主机处理的请求。

4.8.2 Apache服务器的日志分析

1.Apache服务器的Web日志

日志文件是Apache工作的记录,Apache包括mod_log_config模块,它用来记录日志。在默认情况下,使用通用日志格式CLF规范来写。在某种程度上讲,日志就是金钱。因为如果能够通过日志分析出一个网站具有高流量,则广告商就愿意为此支付费用。Apache的标准中规定了4类日志,即错误日志、访问日志、传输日志和Cookie日志。

其中传输日志和Cookie日志被Apache 2.x认为已经过时。

2.日志文件配置命令

Apache中有如下4条与日志相关的配置指令。

(1)ErrorLog。

格式:ErrorLog错误日志文件名。

作用:指定错误日志存放路径。

(2)LogLevel。

格式:LogLevel错误日志记录等级。

作用:指定错误日志的记录等级。

(3)LogFormat。

格式:LogFormat记录格式说明串格式昵称。

作用:为一个日志记录格式命名。

(4)CustomLog。

格式:CustomLog访问日志文件名格式昵称

作用:指定访问日志存放路径和记录格式、指定访问日志由指定的程序生成并指定日志记录格式(管道日志)。

前两条指令用于配置错误日志,后两条指令用于配置访问日志。

3.Web服务器日志轮循

Web服务器日志轮循比较好的方式有3种:一是利用Linux系统自身的日志文件轮循机制logrotate;二是利用Apache自带的日志轮循程序rotatelogs;三是使用在Apache的FAQ中发展已经比较成熟的日志轮循工具cronolog。对于大型的Web服务器来说,往往使用负载均衡技术提高Web站点的服务能力。这样后台有多台服务器提供Web服务,大大方便了服务的分布规划和扩展。如果有多台服务器,需要对日志进行合并,统一进行统计分析。因此为了保证统计的精确性,需要严格按照每天的时段来自动生成日志。

(1)用logrotate实现日志轮循。

logrotate是Linux系统自身带的一个日志轮循程序,是专门对各种系统日志(syslog、mail)进行轮循的程序。该程序由运行程序的服务crond每天凌晨4:02运行,在/etc/cron.daily目录下可以看到如下logrotate文件:

#!/bin/sh/
$ usr/sbin/logrotate /etc/logrotate.conf

每天凌晨crond都会启动/etc/cron.daily目录下的logrotate脚本来进行日志轮循,在/etc/logrorate. conf中可以看到如下内容:

# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
rotate 1
}
# system-specific logs may be also be configured here.

从logrotate的配置文件中可以看到,除了wtmp以外,需要滚动的日志配置都保存在/etc/logroate.d目录下。因此只需要在该目录下创建一个名为“apache”的配置文件来指示logrotate如何轮循Web服务器的日志文件即可,这种方法的优点是不需要其他第三方工具就可以实现日志轮循。但是对于重负载的服务器和使用负载均衡技术的Web服务器来说,这种方法不是很实用。因为它是对相应服务进程发出一个“-HUP”重启命令来实现日志的截断归档的,这样会影响服务的连续性。

(2)用rotatelogs实现日志轮循。

Apache提供了不把日志直接写入文件,而是通过管道发送给另外一个程序的功能,这样就大大加强了对日志进行处理的能力。这个通过管道得到的程序可以是任意程序,如日志分析和压缩日志等。要实现将日志写到管道的操作,只需要将配置中日志文件部分的内容替换为“|程序名”即可,例如,

# compressed logs
$ CustomLog "|/usr/bin/gzip -c >> /var/log/access_log.gz" common

这样就可以使用Apache自带的轮循工具rotatelogs来对日志文件进行轮循,rotatelogs基本是按时间或大小来控制日志的:

$ CustomLog "|/www/bin/rotatelogs /www/logs/secfocus/access_log 86400" common

上面内容表示,Apache访问日志被发送给程序rotatelogs;rotatelogs将日志写入/www/logs/secfocus/access_log,并每隔86400秒(1天)对日志进行一次轮循。轮循以后的文件名为/www/logs/secfocus/access_log.nnn,这里nnn是开始记录日志的时间。因此为了将日志按天对齐需要在凌晨00:00启动服务,使得每天轮循得到的日志刚好是完整一天的日志,以提供给访问统计分析程序处理。如果是00:00开始生成新的日志,那么轮循得到的日志就是access_log.0000。

(3)用cronolog实现日志轮循。

http://www.cronolog.org下载最新版本的cronolog,然后解压安装即可。默认情况下,cronolog安装在/usr/local/sbin下。修改Apache日志配置命令如下所示:

$ CustomLog "|/usr/local/sbin/cronolog /www/logs/secfocus/%w/access_log" combined

这里%w表示按照日期在不同的目录下保存日志,这种方式会保存一周的日志。为了进行日志分析,需要每天将该日志文件复制(或移动,如果不希望保存一周的日志)到一个固定的位置,以方便日志分析统计文件处理(使用crontab -e)。添加定时任务如下:

$ 5 0 * * * /bin/mv /www/logs/secfocus/'date -v-1d +\%w'/access_log
/www/logs/secfocus/access_log_yesterday

然后使用日志统计分析程序处理文件access_log_yesterday。对于这种情况,各个服务器定义或移动日志文件时不能使用access_log_yesterday,而应该带上服务器编号(例如服务器IP地址等信息)加以区分。然后在各服务器上运行网站镜像和备份服务rsyncd,并将每个服务器每天的安装配置文件通过rsyncd下载到专门访问统计分析的服务器上合并。合并多台服务器的日志文件(如log1、log2及log3)及并输出到log_all中的方法是:

$ sort -m -t " " -k 4-o log_all log1 log2 log3

-m表示使用merge优化算法,-k 4表示根据时间进行排序,-o表示将排序结果存放到指定的文件中。

4.使用phpMyVisites分析Apache日志

网站服务器日志记录了Web服务器接收处理请求及运行时的错误等各种原始信息,通过统计、分析和综合日志,就能有效地掌握服务器的运行状况、发现和排除错误,并且了解客户访问分布等,从而更好地加强系统的维护和管理。Web访问机制非常简单,如图4-20所示。

图4-20 Web访问机制

(1)客户端(浏览器)和Web服务器建立TCP连接,然后向Web服务器发出访问请求(如get)。根据HTTP协议,该请求中包含了客户端的IP地址、浏览器的类型及请求的URL等一系列信息。

(2)Web服务器收到请求后,将客户端要求的页面内容返回到客户端。如果出现错误,那么返回错误代码。

(3)服务器将访问信息和错误信息记录到日志文件中。

日志在实际的Web服务器中有更多的用途,比较典型的是网站的流量统计和安全分析。在Web日志中找出攻击Web服务器的蛛丝马迹并不是非常容易的一件事,因为日志中条目繁多。需要分析访问者的源IP地址和请求的页面,猜测访问者的企图是在进行站点镜像还是CGI漏洞扫描,进而做有针对性的查缺补漏。用户更关注的是Web服务器的性能,但对于商务网站来说,不能只在乎用户的要求,不能把精力全放在减少用户访问延迟和提高并发访问数目上,还要关注访问用户的地理分布、时间分布和某个页面的单击率。通过分析用户群及其访问行为,有助于对网站页面做出有针对性的改善,帮助商家提高网站质量,更好地为用户服务。日志可以帮助完成流量分析,给出上述关注内容的统计数字。直接读日志文件仅适用于查找某一特定内容的情况,更多时候,我们要借助专用的日志分析工具,比较著名的工具有AWStats、Webalizer和phpMyVisites等,它们都是开源软件,不仅可以进行简单的基于访问时间和IP地址来源的分析,还可以发现自己的网站与搜索引擎的关系。

phpMyVisites具有以下一些特性。

(1)是一个用PHP/MySQL技术开发,采用Gnu GPL.方式发布的关于网站访问量统计的开源软件,所以它具有很高的运行效率。在主频为800 MHz的机器上,每秒钟可以分析100000条记录,所以分析一个400 MB大小的日志文件只需要25秒。

(2)可以支持多种语言,也可以自己进行本地化工作。

(3)支持多种平台,比如UNIX、Linux、Windows和MacOS等。

相对于另外一个优秀的开放源代码的日志分析工具Webalizer,phpMyVisites的优势如下。

● 界面友好,可以根据浏览器直接调用相应的语言界面(有简体中文版)。

● 基于PHP,并且很好地解决了跨平台问题,系统本身可以运行在GNU/Linux上或Windows上(安装了PHP后);分析的日志直接支持Apache格式(combined)和IIS格式(需要修改)。Webalizer虽然也有Windows平台版,但目前已经缺乏维护。phpMyVisites可以完全实现用一套系统完成对自身站点不同Web服务器,如GNU/Linux/Apache和Windows/IIS服务器的统一统计。

● 效率比较高,phpMyVisites输出的统计项目比Webalizer丰富了很多,速度仍可以达到Webalizer的1/2左右。对于一个日访问量百万级的站点,这个速度是足够的。

● 配置/定制方便,系统提供了足够灵活、默认提供合理的配置规则,而且修改和扩展的插件也比较多。使用简单,不用再看复杂的Log日志。提供柱状图分析报表,形象生动。

● 提供强大的IP库支持,了解访问用户的地区。

phpMyVisites的官方网站是http://www.phpmyvisites.net/,最新版本为2.1。

(1)下载:

#cd var/www/html
wegt http://www.phpmyvisites.net/index.php?part=download&lg=en
#unzip  phpmyvisites_2_1.zip "建立一个目录"
#mv phpmyvisites_2 phpmy2

(2)为phpmy2建立数据库:

# mysql -u root -p
Enter password: xxxxxxxxx
Your Mysql connection id is 3 to server version: 4.11
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
Mysql> create database phpmy2 ;
Query OK, 1 row affected (0.01 sec)
Mysql>grant all privileges on phpmyv2.* to phpmy2@localhost identified by '76543981' ; "将建立的bblog权限给bblog账号,并且设定口令"
mysql>quit
Bye

"为phpbb2建立数据库"

(3)安装phpMyVisites。

安装前需要说明的是,MySQL服务器名称为“localhost”,它不是Linux的服务器名称。MySQL数据库名称为“phpmy2”,MySQL账号为“phpmy2”,且口令为上面的设定值。

#cd /var/www/html/phpmy2  “进入到Apache服务器的默认目录中”
#chmod 777  install   #赋予安装文件和目录的可以执行权限#

打开Linux的Firefox(火狐浏览器),在地址栏中输入“http://主机名/phpmy2/ install/install.php”。按回车键打开“Welcome!”页面,如图4-21所示。

图4-21 选择“Simplified Chinese”选项

● “System Requirements”页面:系统检测。

系统会自动检测MySQL、PHP及GD库是否设置完成,所有选项显示绿色表示通过。

● “Database Setup”页面:MySQL数据库设置。

该页面最为关键,如图4-22所示。

图4-22 MySQL数据库设置页面

● “Table Creation”选项:数据库表设置。

选择默认设置即可。

● “General Setup”选项:常规设置。

主要设置管理员登录口令和管理员电子邮件,如图4-23所示。

图4-23 常规设置页面

● “Create Config File”页面:生成配置文件。

选择默认设置即可。

● “Add First Website”页面:设置首页显示内容。

根据需要设置。

● “Display Javascript code”页面:javascript代码设定。

选择默认设置即可。

● “Finished!”页面:安装结束。

如果出现如图4-24所示的该页面,表示安装成功。

图4-24 安装成功页面

测试成功后系统提示出于安全考虑,删除安装文件(防止他人使用这些文件修改系统信息):

// rm -rf install ; // rm -rf install.Php

单击安装成功页面中的“Go to phpMyVisites”链接,然后使用管理员权限和口令登录首页即可。首页页面如图4-25所示。

图4-25 phpMyVisites的首页页面

图4-26所示为管理员控制面板。

图4-26 管理员控制面板

phpMyVisites可以分析下列信息。

● 访问情况统计。

● 时间段汇总。

● 图示统计汇总。

● 图示的某时间段内访问者的访问量。

● 图示的每小时服务器的访问量。

● 图示的每小时访问者的访问量。

● 访问频率。

● 统计。

● 新旧用户对比。

● 图形化显示对比新旧用户。

● 图形化显示用户访问比例。

● 浏览页。

● 页面浏览时间。

● 图示每页的访问量。

● 访问轨迹。

● 入口页。

● 退出页。

● 单一页面。

● 访问来源。

● 世界地图。

● 访问国家汇总。

● Internet服务提供商。

图4-27所示为phpMyVisites的工作页面。

图4-27 phpMyVisites的工作页面

4.9 Apache服务器的安全设置

4.9.1 使用SSL提高Apache服务器的安全性能

1.SSL加密流程

使用具有SSL功能的Web服务器可以提高网站的安全性能,SSL协议工作在Linux TCP/IP协议和HTTP协议之间,它使用加密方法来保护Web服务器和浏览器之间的信息流。SSL不仅用于加密在Internet上传递的数据流,而且还提供双方身份验证。这样就可以安全地在线购物,而不必担心他人窃取信用卡的信息。这种特性使得SSL适用于那些交换重要信息的地方,如电子商务和基于Web的邮件。

SSL使用公共密钥加密技术,服务器在连接结束时为客户端发送公用密钥用来加密信息,而加密的信息只有服务器用自己持有的专用密钥才能解开。客户端用公用密钥加密数据并且发送给服务器自己的密钥,以唯一确定自身,防止在系统两端之间有人冒充服务器或客户端进行欺骗。加密的HTTP连接用443端口号代替80端口号,以区别于普通的不加密的HTTP。客户端使用加密HTTP连接时会自动使用443端口而不是80端口,这使得服务器更容易做出相应的响应。SSL验证和加密的具体过程如下。

(1)用户使用浏览器,访问Web服务器站点,发出SSL握手信号。

(2)Web服务器发出回应,并出示服务器证书(公钥),显示系统Web服务器站点身份。

(3)浏览器验证服务器证书,并生成一个随机的会话密钥,密钥长度达到128位。

(4)浏览器用Web服务器的公钥加密该会话密钥。

(5)浏览器将会话密钥的加密结果发送Web服务器。

(6)Web服务器用自己的私钥解密得出真正的会话密钥。

(7)现在浏览器和Web服务器都拥有同样的会话密钥,双方可以放心使用这个会话密钥来加密通信内容。

(8)安全通信通道建立成功。

Apache服务器使用SSL时通常有两种选择,即主服务器或虚拟Web站点。

2.为Apache服务器配置SSL

如果使用的是RHEL 5,那么可以直接使用命令rpm -qa | grep mod_ssl检查。如果没有安装,可以以root的身份登录系统,输入命令system-config-packages。利用GUI套件管理工具的网页服务器,选择“详细信息”。然后选择“mod_ssl”复选框,提示放入适当的光盘即可完成安装工作。下面产生SSL凭证,使用以下命令可以产生.key和.csr文档:

# openssl genrsa -out server.key 1024
Generating RSA private key, 1024 bit long modulus
......++++++
........++++++
e is 65537 (0x10001)
# chmod 600 server.key
# openssl req -new -key server.key -out server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:China
Locality Name (eg, city) [Newbury]:beijing City
Organization Name (eg, company) [My Company Ltd]:x41
Organizational Unit Name (eg, section) []:x41
Common Name (eg, your name or your server's hostname) []:localhost
Email Address []:goodcjh@2911.net
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:goodcjh
An optional company name []:goodcjh

以下将示范如何自己签署金钥:

openssl x509-req -days 365-in server.csr -signkey www. server.key -out server.crt

完成之后,应该产生3个文件,即server.csr、server.key和server.crt。将其复制到ca存放的目录/etc/httpd/conf/ca,然后修改Apache配置文件httpd.conf,添加以下两行:

SSLCertificateFile /etc/httpd/conf/ca/server.crt
SSLCertificateKeyFile /etc/httpd/conf/ca/server.key

重新启动Apache:

apachectl stop
apachectl startssl

使用浏览器访问Apache服务器的首页,输入https://localhost。按回车键,显示提示信息,如图4-28所示。

图4-28 提示信息

单击“确定”按钮,即可进入加密显示的Apache首页。注意浏览器的位置栏和右下角的标志,如图4-29所示。

图4-29 加密显示的Apache首页

4.9.2 让Apache服务器在“监牢”中运行

所谓“监牢”是指通过chroot机制来更改某个软件运行时所能看到的根目录,即将某软件运行限制在指定目录中。保证该软件只能操作该目录及其子目录的文件,从而保证整个服务器的安全。这样即使被破坏或侵入,所受的损失也不大。将软件chroot化的一个问题是该软件运行时需要的所有程序、配置文件和库文件都必须事先安装到chroot目录中,通常称这个目录为“chroot jail”(chroot即“监牢”)。如果要在“监牢”中运行Apache,而事实上根本看不到文件系统中那个真正的目录,则需要事先创建目录并将httpd复制到其中。同时,httpd需要库文件,可以使用LDD(Library Dependency Display)命令查看,LDD的作用是显示一个可执行程序必须使用的共享库。这意味着还需要在“监牢”中创建lib目录,并将库文件复制到其中。手工完成这一工作是非常麻烦的,此时可以用jail软件包来帮助简化“监牢”的建立过程。jail官方网站是http://www.jmcresearch.com/,最新版本为1.9a。以前,UNIX/Linux上的daemon都是以root权限启动的。当时这似乎是理所当然的,因为像Apache这样的服务器软件需要绑定到“众所周知”的端口上(小于1024)来监听HTTP请求,而root是唯一有这种权限的用户。但是随着攻击者活动的日益频繁,尤其是缓冲区溢出漏洞数量的激增,使服务器安全受到了更大的威胁。一旦某个网络服务存在漏洞,攻击者就能够访问并控制整个系统。因此为了减小这种攻击所带来的负面影响,现在的服务器软件通常设计为以root权限启动。然后服务器进程自行放弃root权限,并以某个低权限的系统账号来运行进程。这种方式的好处在于一旦该服务被攻击者利用漏洞入侵,由于进程权限很低,攻击者得到的访问权限又是基于这个较低权限的,所以对系统造成的危害比以前减轻了许多。有些攻击者会试图找到系统其他的漏洞来提升权限,直至达到root权限。由于本地安全性远低于远程安全性,因此攻击者很有可能在系统中找到可以提升权限的内容。即使没有找到本地漏洞,攻击者也可能会制造其他损害,如删除文件及涂改主页等。为了进一步提高系统安全性,Linux内核引入了chroot机制。chroot是内核中的一个系统调用,软件可以通过调用库函数chroot来更改某个进程所能见到的根目录。比如,Apache软件安装在/usr/local/httpd/目录下,以root用户(或具有相同权限的其他账号)启动。这个root权限的父进程会派生数个以nobody权限运行的子进程,具体情况取决于个人设置。父进程监听来自80端口的TCP数据流,然后根据内部算法将这个请求分配给某个子进程来处理。这时Apache子进程所处的目录继承父进程,即/usr/local/httpd/。

一旦目录权限设定失误,被攻击的Apache子进程可以访问/usr/local、/usr、/tmp,甚至整个文件系统,因为Apache进程所处的根目录仍是整个文件系统的根。如果能够利用chroot将Apache限制在/usr/local/httpd/,那么Apache所能存取的文件都是/usr/local/httpd/下的文件或其子目录下的文件。创建chroot“监牢”的作用就是将进程权限限制在文件系统目录树中的某一子树中。

(1)编译和安装jail。

在网站http://www.jmcresearch.com/projects/jail/中可以下载到jail的最新版本,它是由jail chroot项目小组开发的。其中包含了帮助自动创建“监牢”的C程序、Perl程序和Bash脚本。首先将jail.tar.gz置于任意目录,然后执行命令:

#tar xzvf jail.tar.gz && cd jail/src

按照个人实际情况修改makefile文件,尤其是安装路径(默认是/usr/local)、体系结构(jail支持Linux、FreeBSD、IRIX和Solaris),以及编译选项等。最后执行命令:

#make && make install

(2)为jail创建“监牢”。

现在创建一个目录作为“监牢”,以/var/chroot/为例,执行下面的命令为“监牢”创建环境:

#/usr/local/bin/mkjailenv /var/chroot

jail软件包提供了多个Perl脚本作为其核心命令,包括mkjailenv、addjailuser和addjailsw,addjailsw会从真实文件系统中复制二进制可执行文件及其相关的其他文件(包括库文件、辅助性文件和设备文件)到该“监牢”中。

(3)为jail“监牢”增加软件。

为这个“监牢”增加一些软件,以使其运行。执行以下命令安装一些基本的软件,包括ls、cat和cp等程序和ld-linux.so.2等库文件。

#/usr/local/bin/addjailsw /var/chroot

事实上仅有这些基本软件是不够的,还需要添加有用的文件。以Apache服务器软件为例:

#addjailsw /var/chroot/ -P /usr/local/httpd/bin/httpd
addjailsw
A component of Jail (version 1.9 for linux)
http://www.jmcresearch.com/projects/jail/
Juan M. Casillas <juanm.casillas@jmcresearch.com>
Guessing /usr/local/httpd/bin/httpd args(0)
Warning: file /var/chroot//lib/libssl.so.4 exists. Overwritting it
Warning: file /var/chroot//lib/libcrypto.so.4 exists. Overwritting it
Warning: file /var/chroot//lib/libresolv.so.2 exists. Overwritting it
……
Done.

不用在意那些警告信息,因为jail会调用LDD检查httpd用到的库文件。而几乎所有基于共享库的二进制可执行文件都需要上述的几个库文件,然后将Apache的相关文件复制到“监牢”中:

#cp -a /usr/local/httpd/ /var/chroot/usr/local/

可根据个人情况依次将Apache需要的文件复制到“监牢”中。

(4)“监禁”用户。

有时需要为chroot“监牢”创建新的用户,比如Apache要求创建nobody用户作为子进程用户。鉴于可能有其他进程使用nobody,还可以使用另一用户,即httpd。首先需要在真实系统中创建该用户:

#useradd -d /var/chroot -s /usr/local/bin/jail httpd

然后执行以下命令在chroot“监牢”中创建httpd用户:

#/usr/local/bin/addjailuser /var/chroot /usr/local/httpd /usr/sbin/httpd httpd

接下来修改/var/chroot/usr/local/httpd/conf/httpd.conf,将User nobody替换为User httpd。由于chroot后Apache将以httpd身份启动进程,只有root有权将Apache绑定在低端口上(通常为80)。因此还需要修改端口值,该值必须大于1024(假设为8080)。这个修改要应用到Apache的所有配置文件中,包括虚拟主机的配置。Apache的其他设置与在真实文件系统中相同。

还需要复制一些其他文件,启动Apache的最常见方式就是调用apachectl。这是个Bash脚本,查看这个文件,会发现如下行:

HTTPD='/usr/local/httpd/bin/httpd'
LYNX="lynx -dump"
ULIMIT_MAX_FILES="ulimit -S -n 'ulimit -H -n'"
ARGV="-h"
$HTTPD -k $ARGV
$HTTPD -k start -DSSL
$HTTPD -t
$LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '

其中ulimit、lynx和awk是辅助性的程序。另外需要注意的是,程序使用不同的参数时可能会使用不同的库文件。因此为了让Apache完整运行,使用下面的命令来跟踪所有可能的文件:

#/usr/local/bin/addjailsw /var/chroot -P httpd "-k start -DSSL"

用上述的参数替换引号中的参数,完成全部工作。

最后运行Apache:

#su - httpd &

打开浏览器测试,访问Web服务器时记住加上8080端口号。

4.9.3 保持不断更新和升级

Apache服务器有一个很好的安全记录和一个高度关注安全问题的开发社团,但是仍然不能避免在发行版中存在或大或小的问题,所以知道这个软件的版本更新和升级补丁是至关重要的。如果直接从Apache组织得到Apache HTTP服务器,我们强烈建议订阅Apache HTTP服务器通告邮件列表以保证能够在第一时间得知软件的版本更新和升级补丁,许多第三方Apache软件发行版也有类似的服务。当然,Web服务器出现的问题在绝大多数时候不是由Apache源代码引起的,而是由附加的代码、CGI脚本及底层操作系统引起的,因此必须保持机器上所有软件的及时更新。

4.9.4 ServerRoot目录的权限

通常Apache由root用户启动,在提供服务时切换为由User指令所指定的用户。正如root所执行的任何命令那样,必须保证ServerRoot下的文件是受保护的,不允许非root用户修改。不仅文件本身,而且目录及其父目录都必须只能由root来改写。例如,如果将ServerRoot指定为/usr/local/apache,则推荐以root身份来建立此目录,如:

mkdir /usr/local/apache
cd /usr/local/apache
mkdir bin conf logs
chown 0 . bin conf logs
chgrp 0 . bin conf logs
chmod 755 . bin conf logs

这里已经假定“/”、“/usr”及“/usr/local”只能由root来改写,在安装httpd可执行文件时,应该确保其也受到了同样的保护:

cp httpd /usr/local/apache/bin
chown 0 /usr/local/apache/bin/httpd
chgrp 0 /usr/local/apache/bin/httpd
chmod 511 /usr/local/apache/bin/httpd

可以在其中建立htdocs子目录,该子目录可以允许其他用户改写。root不会执行其中任何文件,也不应该在其中建立文件。如果允许非root用户对由root执行或读写的文件有写权限,则会危及系统。比如,他人有可能会覆盖httpd可执行文件,那么下一次启动时就会执行恶意代码。如果日志目录(对非root用户)是可写的,他人就有可能用一个指向其他敏感文件的连接来覆盖日志目录,使其日志变为杂乱的数据;如果日志文件本身(对非root用户)是可写的,他人就可能伪造日志。

4.9.5 系统设置的保护

为了得到真正严密的保护,应该禁止用户使用可能导致安全特性被覆盖的.htaccess文件,方法是在服务器配置文件中设置:

<Directory />
AllowOverride None
</Directory>

使所有目录无法使用.htaccess文件,明确指定可以使用的目录除外。

4.9.6 默认配置下服务器文件的保护

默认访问是偶尔会被误解的Apache特性之一,即除非采取措施,否则如果服务器能够通过标准URL映射规则找到一个文件,那么就可能把它提供给客户端。如下例:

# cd /; ln -s / public_html
Accessing http://localhost/~root/

它会允许客户端遍历整个文件系统。其解决方法是在服务器配置中增加下列指令:

<Directory />
Order Deny,Allow
Deny from all
</Directory>

这样对文件系统的默认访问被禁止,而对需要访问的区域可以增加正确的Directory块,比如:

<Directory /usr/users/*/public_html>
Order Deny,Allow
Allow from all
</Directory>
<Directory /usr/local/httpd>
Order Deny,Allow
Allow from all
</Directory>

必须特别注意Location和Directory指令的相互作用,比如,即使<Directory />拒绝访问,<Location />指令仍然可能推翻其设置。

还必须留意UserDir指令,此设置如果类似“./”,则与上述例子有相同的风险。如果使用的是1.3或更高版本,我们强烈建议在服务器配置文件中包含以下指令:

UserDir disabled root

4.10 Apache服务器的优化

Apache是一种高度可配置的软件。它具有大量特性,但每一种都代价高昂。从某种程度上来说,优化Apache就是以恰当的方式分配资源,并涉及将配置简化为仅包含必要内容。

4.10.1 配置MPM

Apache是模块化的,在MPM(Multi-Processing Module,核心多处理模块)中提供了这种模块化功能性,如管理网络连接和调度请求。MPM使用户能够使用线程,甚至能够将Apache迁移到另外一个操作系统。每次只能有一个MPM是活动的,必须使用--with-mpm=(worker|prefork|event)静态编译。每个请求使用一个进程的传统模型称为“prefork”。较新的线程化模型称为“worker”,它使用多个进程。每个进程又有多个线程,这样就能以较低的开销获得更好的性能。最新的event MPM是一种实验性的模型,为不同的任务使用单独的线程池。要确定当前使用的是哪种MPM,可执行httpd -l,选择使用何种MPM取决于许多因素。在event MPM脱离实验状态之前,不应考虑这种模型,而是在使用线程和不使用线程之间做出选择。表面上看来,如果所有底层模块(包括PHP使用的所有库)都是线程安全的,线程要优于分叉(forking),而Prefork是较为安全的选择。如果选择了worker,则应该谨慎测试,性能收益还取决于发布版所附带的库及硬件。无论选择了哪种MPM,都必须恰当地配置它。一般而言,配置MPM包括告知Apache如何控制有多少worker正在运行,它们是线程还是进程。prefork MPM的重要配置选项如下:

StartServers      50
MinSpareServers   15
MaxSpareServers   30
MaxClients      225
MaxRequestsPerChild  4000

prefork模型会为每个请求创建一个新进程,多余的进程保持空闲,以处理传入的请求,这样缩短了启动延迟。只要Web服务器出现,预先完成的配置就会立即启动50个进程,并尽力保持10个~20个空闲服务器运行。进程数的硬性限制由MaxClients指定。尽管一个进程能够处理许多相继的请求,Apache还是会取消连接数超过4000以后的进程,从而降低了内存泄露的风险。配置线程化MPM与之类似,不同之处只是必须确定使用多少线程和进程。Apache文档解释了所有必要的参数和计算,要经过几次尝试和出错之后才能选好要使用的值。最重要的值是MaxClients,目标在于允许足够多的workder进程或线程运行,同时又不会导致服务器进行过度的交换。如果传入的请求超出处理能力,那么至少满足此值的那些请求会得到服务,其他请求被阻塞。如果MaxClients设置过高,那么所有客户机都将体验到糟糕的服务。因为Web服务器会试图换出一个进程,以使另一个进程能够运行;而设置过低意味着可能会不必要地拒绝服务。查看高负载下运行的进程数量和所有Apache进程所导致的内存占用情况对设置这个值很有帮助,如果MaxClients的值超过256,必须将ServerLimit也设为同样的数值。请仔细阅读MPM的文档,了解相关信息,根据服务器的角色优化要启动和保持空闲的服务器数量。如果服务器仅运行Apache,那么可以使用适中的值,因为这样就能充分利用资源;如果系统中还有其他数据库或服务器,那么就应该限制运行中的空闲服务器的数量。

4.10.2 有效地使用选项和重写

Apache处理的每个请求都要执行一套复杂的规则,这些规则指明了Web服务器必须遵循的约束或特殊指令。对文件夹的访问可能按IP地址约束为某个特定文件夹,也可配置用户名和密码,这些选项还包含处理特定文件。例如,如果提供了一个目录列表,如何处理的文件或输出结果是否应压缩。这些配置以httpd.conf中的容器形式出现,例如,<Directory>指定所用配置引用的是磁盘上的一个位置,<Location>表示引用的是URL中的路径。

1.为根目录应用一个Directory容器

<Directory />
    AllowOverride None
    Options FollowSymLinks
</Directory>

在上面的片断中,位于一对<Directory>和</Directory>标记之间的配置应用于给定目录和该目录下的一切内容。在本例中,这个给定目录是根目录。此处,AllowOverride标记指出用户不允许重写任何选项(稍后将进一步介绍)。FollowSymLinks选项被启用,它允许Apache查看之前的符号连接来为请求提供服务,即便文件位于包含Web文件的目录之外。这就意味着,如果Web目录中的一个文件是/etc/passwd的符号连接,Web服务器将在请求时顺利为该文件提供服务;如果使用了-FollowSymLinks,该特性就会被禁用,同样的请求将致使为客户机返回错误。最后这个场景正是导致两方面关注的原因所在,第1个方面与性能有关。如果禁用了FollowSymLinks,Apache就必须检查使用该文件名的所有组件(目录和文件本身),以确保它们不是符号连接,这会带来额外的开销(磁盘操作);另外一个称为“FollowSymLinksIfOwnerMatch”的选项会在文件所有者与连接所有者同时使用符号连接。

2.将FollowSymLinks约束为一个用户的目录

<Directory />
    Options FollowSymLinks
</Directory>
<Directory /home/*/public_html>
    Options -FollowSymLinks
</Directory>

在上面的例子中,一个用户的主目录中的任何public_html目录及其所有子目录都移除了FollowSymLinks选项。通过主服务器配置可为每个目录单独配置选项,用户可以自行重写这种服务器配置(如果管理员通过AllowOverrides语句允许这种操作),只需将一个.htaccess文件放入目录即可。该文件包含额外的服务器指令,每次请求包含.htaccess文件的目录时将加载并应用这些指令。尽管之前探讨过系统没有用户的问题,但许多LAMP应用程序都利用这种功能来控制访问并实现URL重写,因此有必要理解其工作原理。即便AllowOverrides语句能阻止用户去做不希望的事,Apache也必须检查.htaccess文件,查看是否有要完成的工作。父目录可以指定由来自子目录的请求处理的指令,即Apache必须搜索所请求文件的目录树的所有组件。可想而知,这会使每次请求都导致大量磁盘操作。最简单的解决方案是不允许重写,从而消除Apache检查.htaccess的需求,之后的任何特殊配置都将直接放在httpd.conf中。

3.将.htaccess配置移入httpd.conf

<Directory /home/user/public_html/project/>
  AuthUserFile /home/user/.htpasswd
  AuthName "uber secret project"
  AuthType basic
  Require valid-user
</Directory>

如果配置转移到httpd.conf中,并且AllowOverrides被禁用,磁盘的使用就能减少。一个用户的项目可能不会吸引许多人来点击,但设想一下,将这项技术应用于一个忙碌的站点时会有多么强大。

4.限定.htaccess检查的作用域

<Directory />
  AllowOverrides None
</Directory>
<Directory /home/*/public_html>
  AllowOverrides AuthConfig
</Directory>

有时不可能彻底消除.htaccess文件的使用。例如,在上面的例子中,一个选项被约束到文件系统的特定部分,重写也可以是有作用域的。Apache会在父目录中查找.htaccess文件,但会在public_html目录处停止,因为文件系统的其余部分禁用了此功能。例如,如果请求的是一个映射到/home/user/public_html/project/notes.html的文件,那么仅有public_html和project目录被搜索。关于每目录单独配置的最后一个提示就是要按顺序依次进行。任何介绍Apache优化的文章都会提示应通过HostnameLookups off指令禁用DNS查找,因为试图反向解析连接到服务器的所有IP地址无疑是浪费资源。然而基于主机名的任何约束都会迫使Web服务器对客户机的IP地址执行反向查找,对其结果进行正向查找,以验证该名称的真实性。因此避免使用基于客户主机名的访问控制,在必须使用时限定其作用域,这些都是明智的方法。

4.10.3 持久连接

一个客户机连接到Web服务器时,允许客户机通过同一个TCP连接发出多个请求,从而减少了与多个连接相关的延迟。在一个Web页面中引用了多幅图片时,这就很有用。客户机可以通过一个连接首先请求页面,然后请求所有图片;其缺点在于服务器上的worker进程必须等待客户机要关闭的会话,之后才能转到下一个请求。Apache能够配置如何处理持久连接(称为“keepalives”)。httpd.conf全局级的KeepAlive 5允许服务器在连接强制关闭之前处理一个连接上的5个请求,将此值设置为0将禁用持久连接。同样位于全局级上的KeepAliveTimeout确定在会话关闭之前,Apache将等待另外一个连接的时间。持久连接的处理并非“一刀切”式的配置,对于某些Web站点,禁用keepalives更合适(KeepAlive 0);而对于其他一些站点,启用它会带来巨大的收益。唯一的解决之道就是尝试使用这两种配置,然后观察哪种更合适。但若启用了keepalives,使用较小的超时时间较为明智。例如2,即KeepAliveTimeout 2,从而能确保希望发出另外一个请求的客户机有充足的时间,还能确保worker进程不会一直空闲,等待可能永远不会出现的下一个请求。

4.11 Apache服务器的故障排除

4.11.1 检查配置文件的错误

Apache服务器的配置文件是httpd.conf,其中99%的Apache服务器错误是配置文件有误。

(1)使用apachectl configtest命令。

如果配置文件有错误,可以使用apachectl configtest命令检查所有语法错误和逻辑错误。

下面是一个配置文件样例片断:

<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.149.
</Location>

如果黑体部分的错误写成了“<Location /server-status>”少写了一个“>”。apachectl configtest命令会检查到这个问题,输出如下:

apachectl configtest
Syntax error on line 918 of /etc/httpd/conf/httpd.conf:
<Location> directive missing closing '>'

(2)使用服务管理工具。

如果配置文件有错误,也可以使用GUI工具来查看,该工具检查一个实例错误结果如图4-30所示。

图4-30 检查错误的结果

4.11.2 使用错误日志

错误日志是最重要的日志文件,其文件名和位置取决于ErrorLog指令,Apache httpd在这个文件中存放诊断信息和处理请求中出现的错误。如果服务器启动或运行中有问题,首先就应该查看这个错误日志。如果网站空间提供者不允许访问错误日志,那么应该考虑更换提供者。学会阅读错误日志可以快速找出问题并快速解决。

(1)错误日志格式。

Apache默认的错误日志配置如下:

ErrorLog logs/error_log
LogLevel warn

配置错误日志相对简单,只要说明日志文件的存放路径和日志记录等级即可,格式为:

日期和时间错误等级错误消息

(2)日志记录等级。

日志记录包括如下8个级别。

1级emerg:出现紧急情况使得该系统不可用,如系统宕机等。

2级alert:需要立即引起注意的情况。

3级crit:危险情况的警告。

4级error:除了emerg、alert及crit的其他错误。

5级warn:警告信息。

6级notice:需要引起注意的情况,但不如error及warn重要。

7级info:值得报告的一般消息。

8级debug:由运行debug模式的程序所产生的消息。

(3)错误日志文件示例。

错误日志的格式相对灵活,并可以附加文字描述。某些信息会出现在绝大多数记录中,一个典型的例子是:

[Wed Oct 11 14:32:522007] [error] [client 127.0.0.1] client denied by server configuration:/export/home/live/ap/htdocs/test

其中,第1项是错误发生的日期和时间;第2项是错误的严重性,LogLevel指令使只有高于指定严重性级别的错误才会被记录;第3项是导致错误的IP地址,此后是信息本身。在此例中,服务器拒绝了这个客户的访问。服务器在记录被访问文件时用的是文件系统路径,而不是Web路径,错误日志中会包含类似上述例子的多种类型的信息。此外,CGI脚本中任何输出到stderr的信息会作为调试信息原封不动地记录到错误日志中,用户可以增加或删除错误日志的项。但是对某些特殊请求,在访问日志(access log)中也会有相应的记录。如上述例子在访问日志中也会有相应的记录,其状态码是403。因为访问日志也可以定制,所以可以从访问日志中得到错误事件的更多信息。

(4)了解错误代码和错误提示。

● 常用的错误响应代码如下。

301:告知用户请求的URL已经永久的移动到新的URL,用户可以记住新的URL,以便日后直接使用新的URL访问。

302:告知用户请求的URL临时的移动到新的URL,用户不必记住新的URL。如果省略错误响应代码,默认就是此值。

303:告知用户页面已经被替换,用户应该记住新的URL。

401:授权失败,即密码错误。

403:Access denied,存取错误,即不可读取该文件。

404:File not found,找不到文件。

410:告知用户请求的页面已经不再存在,使用此代码时不应该使用重定向的URL参数。

500:服务器内部错误,可能是Web服务器本身存在问题,也可能是编写的程序出错。

● 错误消息提示说明。

“Invalid argument: core_output_filter: writing data to the network”消息

Apache在可能的平台上使用系统调用sendfile来加速响应的发送。不幸的是,在某些系统中Apache会在编译时检测sendfile的存在,即使它不能正常工作。这经常发生在使用网络或其他非标准文件系统时,这个问题的表现症状包括上述信息出现在错误日志中及对于非零长度文件请求发送零长度的响应。一般这个问题只发生在静态文件上,因为动态文件通常用不到sendfile。要修正这个问题,可用EnableSendfile指令关闭服务器所有使用sendfile部分的即可。同时参看EnableMMAP指令,对相似的问题有帮助。

“Premature end of script headers”消息

大多数导致这个错误的CGI脚本问题将向浏览器发送一个"Internal Server Error"错误信息:

“Permission denied”消息

error_log中的“Permission denied”错误伴随一个发送到客户端的“Forbidden”信息通常表明违反了文件系统的权限,而不是Apache HTTP的配置文件出了错误。检查并确认用于运行子进程的User和Group有访问导致问题的文件的足够权限,同时检查导致问题的文件所在的目录及其所有父目录是否具有执行(搜索)权限(也就是chmod +x)。最近发行的Fedora Core和其他Linux发行版使用了SELinux进行额外的访问控制,违反这些限制也会导致该消息。

"POST Method Not Allowed"消息

说明Apache没有被正确配置以执行CGI程序,重新阅读配置Apache查看是否存在遗漏。

"Internal Server Error"消息

查阅Apache错误日志,可以找到CGI程序产生的出错消息“Premature end of script headers”。对此,需要检查下列各项,以找出不能产生正确HTTP头的原因。

(5)持续监视错误日志。

可以使用命令“tail -f error_log”持续监视任何问题。要了解服务器上发生了什么,就必须检查日志文件。虽然日志文件只是记录已经发生的事件,但是它会让用户知道服务器遭受的攻击,并帮助用户判断是否达到了必要的安全等级。

grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log
grep "client denied" error_log | tail -n 10

上例会列出试图使用Apache Tomcat Source.JSP Malformed Request Information Disclosure Vulnerability的攻击次数,下例会列出最后10个被拒绝的客户端:

[Thu Jul 11 17:18:392002] [error] [client foo.bar.com] client denied by server configuration:/usr/local/apache/htdocs/.htpasswd

可见,日志文件只是记录已经发生的事件,所以如果客户端可以访问.htpasswd文件,而且在访问日志中发现类似如下的记录:

foo.bar.com - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd HTTP/1.1"

则可能表示服务器配置文件中的下列指令已经被注释:

<Files ~ "^\.ht">
Order allow,deny
Deny from all
</Files>

4.11.3 检查Apache服务器模块问题

如果Apache服务器可以启动,但是某些功能无法实现。比如前面介绍的Webdav功能,通常是提供这个功能的模块没有加载。此时可以使用命令:“httpd -M”查看模块加载情况,它会输出一个已经启用的模块列表,包括静态编译在服务器中的模块和作为DSO动态加载的模块,也可以使用浏览器访问http://192.168.1.12/server-info/?list,如图4-31所示。

图4-31 模块加载情况

4.11.4 解决Apache服务器故障的步骤

解决Apache服务器故障的步骤如下。

(1)检查错误日志。

在许多情况下,Apache服务器会通过在错误日志中写入一条或多条消息来提供一些细节,有时足够让用户诊断和解决问题(比如文件权限或类似的问题)。错误日志的默认位置在/usr/local/apache2/logs/error_log,应查看配置文件中的ErrorLog指令以确认其确切位置。

(2)再次检查语法。

Apache配置文件是httpd.conf长度通常为80行~990行,几乎99%的Apache故障是语法错误引起的。可以手工检查/etc/httpd/conf/httpd.conf,也可以在浏览器输入中http://192.168.1.12/server-info?config获取当前配置文件,如图4-32所示。

图4-32 当前Apache服务器配置文件

说明:此时系统会自动添加行号。

(3)查看Apache的FAQ。

最新版本的Apache常见问题列表总是可以从Apache主站点http://httpd.apache.org/docs/2.2/faq/得到的。

(4)查看Apache bug数据库。

大多数报告给Apache项目组的问题都记录在bug数据库中,在添加一个新bug之前,应检查已有的报告(打开和关闭的)。如果发现问题已经报告,则不要添加一个“我也是”那样的报告;如果原始报告还没有关闭,建议经常周期性地查看它,也可以考虑与最初的提交者接触,因为有可能会在邮件交流中发现没有记录在数据库中的问题。

(5)在某个用户论坛中提问。

Apache拥有一个活跃且愿意共享知识的用户社区,参与这个社区通常是获得解答的最快最好的办法。

Apache用户邮件列表网址为http://httpd.apache.org/userslist.html

(6)提交问题报告到bug数据库。

如果仍然没有解决问题,则提交问题到http://httpd.apache.org/bug_report.html

(7)获取商业支持。

可以从下面的网址获取商业网站服务商的技术支持:

http://www.apache.org/info/support.cgi

4.12 Apache服务器的网络资源的相关文档

Apache服务器是使用最广泛的Web服务器,其版本很多。从以下的网络资源中可以获取大量有用的提示从而帮助快速解决故障和建立Web服务。

(1)通用Apache文档:http://httpd.apache.org/docs-2.0

(2)Apache FAQ:http://www.apache.org/foundation/faq.html

(3)1.3版本FAQ:http://httpd.apache.org/docs/misc/FAQ.html

(4)邮件列表:http://httpd.apache.org/userslist.html

(5)红帽企业版Linux 5部署指南:

http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/zh-CN/Deployment_Guide/index.html

4.13 本章小结

本章介绍了在Linux下建立Apache服务器的过程和故障排除方法。需要说明的是Apache遭到黑客的攻击是造成其服务器故障的一个主要原因,限于篇幅未能面面俱到。读者可以阅读笔者的《Linux服务器安全策略详解》一书,其中详细介绍了提高Apache服务器安全的方法。