`
holoblog
  • 浏览: 1228149 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18936
文章分类
社区版块
存档分类
最新评论

Web服务器配置和管理

 
阅读更多


第3 篇 网络服务管理篇
第16 章 Web 服务器配置和管理
Web 服务是目前Internet 上最常见的服务之一,要搭建一个Web 服务器,首先要选择
一套合适的Web 程序。在本章中将会以强大的Apache 为例,介绍相关的安装、配置、维
护和高级功能等方面的知识,演示如何在Linux 操作系统下构建基于Apache 的Web 服
务器。
16.1 Web 服务器简介
万维网又称为Web(World Wide Web,www),是在Internet 上以超文本为基础形成
的信息网。用户通过浏览器可以访问Web 服务器上的信息资源,目前在Linux 操作系统上
最常用的Web 服务器软件是Apache。本节将简单介绍Web 服务器的历史以及工作原理,
并介绍Apache 的特点以及它的功能模块。
16.1.1 Web 服务的历史和工作原理
Internet 上最热门的服务之一就是万维网,它是在因特网上以超文本为基础形成的信息
网。用户通过它可以查阅Internet 上的信息资源,例如,平时上网使用浏览器访问网站信
息就是最常见的应用。
Web 在1989 年起源于欧洲的一个国际核能研究院中,由于随着研究的深入和发展,
研究院里的文件数量越来越多,而且人员流动也很大,要找到相关的最新的资料非常困难。
于是一个科学家就提出了这样一个建议:在服务器上维护一个目录,目录的链接指向每个
人的文件;每个人维护自己的文件,保证别人访问的时候总是最新的文档,这个建议得到
采纳并被不断完善后,最终形成如今Internet 上最常见的WWW 服务。
Web 系统是客户/服务器模式(C/S)的,所以有服务器端和客户端程序两部分。常用
的服务器有Apache、IIS 等,常用的客户端浏览器有如IE、Netscape、Mozilla 等,用户在
浏览器的地址栏中输入统一资源定位地址(URL)来访问Web 页面。
Web 页面是以超文本标记语言(HTML)进行编写,它使得文本不再是传统的书页式
文本,而是可以在浏览过程中从一个页面位置跳转到另一个页面。使用HTML 语言编制的
Web 页面除文本信息外,还可以嵌入声音、图像、视频等多媒体信息。WWW 服务遵循
HTTP 协议,默认的端口为80,Web 客户端与Web 服务器的通信过程如图16.1 所示。
通信的过程分为以下3 步。
第16 章 Web 服务器配置和管理
(1)Web 客户端通过浏览器根据用户输入的URL 地址连接到相应的Web 服务器上。
(2)从Web 服务器上获得指定的Web 文档。

图16.1 Web 工作原理
(3)断开与远程的Web 服务器的连接。
用户每次浏览网站获取一个页面,都会重复上述的连接过程,周而复始。
16.1.2 Apache 简介
Apache 是一种开源的HTTP 服务器软件,可以在包括UNIX、Linux 以及Windows 在
内的大多数主流计算机操作系统中运行,由于其支持多平台和良好的安全性而被广泛使用。
Apache 由Illinois 大学Urbana-Champaign 的国家高级计算程序中心开发,它的名字取自
apatchy server 的读音,即充满补丁的服务器,可见在最初的时候该程序并不是非常完善。
但由于Apache 是开源软件,所以得到了开源社区的支持,不断开发出新的功能特性,
并修补了原来的缺陷。经过多年来不断的完善,如今的Apache 已是最流行的Web 服务器
端软件之一。Apache 拥有以下众多的特性,保证了它可以高效稳定地运行。
? 支持几乎所有的计算机平台。
? 简单有效的配置文件。
? 支持虚拟主机。
? 支持多种方式的HTTP 认证。
? 集成Perl 脚本语言。
? 集成代理服务器模块。
? 支持实时监视服务器状态和定制服务器日志。
? 支持服务器端包含指令(SSI)。
? 支持安全Socket 层(SSL)。
? 提供用户会话过程的跟踪。
? 支持PHP。
? 支持FastCGI。
? 支持Java Servlets。
? 支持通用网关接口。
? 支持第三方软件开发商提供的功能模块。
第3 篇 网络服务管理篇
·386·
16.1.3 Apache 的模块
Apache 采用模块化的设计,模块安装后就可以为Apache 内核增加相应的新功能。默
认情况下Apache 已经安装了部分的模块,用户也通过使用模块配置,自定义Apache 服务
器中需要安装哪些功能,这也是Apache 灵活性的表现。如表16.1 列出了Apache 全部的默
认模块和部分常用的非默认模块。
表16.1 Apache 模块列表
模 块 名 功 能 说 明 是否默认安装
mod_actions 运行基于MIME 类型的CGI 脚本 是
mod_alias 支持虚拟目录和页面重定向 是
mod_asis 发送包含自定义HTTP 头的文件 是
mod_auth_basic 基本验证 是
mod_auth_digest 使用MD5 加密算法的用户验证 否
mod_authn_alias 允许使用第三方验证 否
mod_authn_anon 允许匿名用户访问认证的区域 否
mod_authn_dbd 使用数据库保存用户验证信息 否
mod_authn_dbm 使用DBM 数据文件保存用户验证信息 否
mod_authn_default 处理用户验证失败 是
mod_authn_file 使用文本文件保存用户验证信息 是
mod_authnz_ldap 使用LDAP 目录进行用户验证 否
mod_authz_default 处理组验证失败 是
mod_authz_groupfile 使用plaintext 文件进行组验证 是
mod_authz_host 基于主机的组验证 是
mod_authz_user 用户验证模块 是
mod_autoindex 生成目录索引 是
mod_cache 通向URI 的内容Cache 否
mod_cgi 支持CGI 脚本 是
mod_cgid 使用外部CGI 进程运行CGI 脚本 是
mod_dir 提供用于trailing slash 的目录和索引文件 是
mod_env 调整传输给CGI 脚本和SSI 页面的环境变量 是
mod_example 解释Apache 模块的API 否
mod_filter 过滤信息 是
mod_imagemap imagemap 处理 是
mod_include 解析HTML 文件 是
mod_isapi ISAPI 扩展 是
mod_ldap 使用第三方LDAP 模块进行LDAP 连接和服务 否
mod_log_config 记录发给服务器的访问请求 是
mod_logio 记录每个请求输入、输出的字节数 否
mod_mime 联合被请求文件扩展名和文件行为的内容 是
mod_negotiation 提供内容协商 是
第16 章 Web 服务器配置和管理
·387·
mod_nw_ssl 为NetWare 打开SSL 加密 是
mod_proxy 支持HTTP1.1 协议的代理和网关服务器 否
mod_proxy_ajp mod_proxy 的AJP 支持模块 否
mod_proxy_balancer mod_proxy 的负载均衡模块 否
mod_proxy_ftp mod_proxy 的FTP 支持模块 否
mod_proxy_http mod_proxy 的HTTP 支持模块 否
mod_setenvif 允许设置基于请求的环境变量 是
mod_so 在启动或重启时提高可执行编码和模块的启动 否
续表
模 块 名 功 能 说 明 是否默认安装
mod_ssl 使用SSL 和TLS 的加密 否
mod_status 提供服务器性能运行信息 是
mod_userdir 设置每个用户的网站目录 是
mod_usertrack 记录用户在网站上的活动 否
mod_vhost_alias 提供大量虚拟主机的动态配置 否
关于Apache 模块的自定义安装和模块的使用将在后面的章节中陆续进行讲解。
16.2 Apache 服务器的安装
本节以 2.2.9 版本的 Apache 为例,介绍如何获得并通过源代码安装包在 Red Hat
Enterprise Linux 5.2 上安装Apache 服务器;如何启动关闭Apache 服务;如何检测Apache
服务的状态,以及配置Apache 服务的开机自动运行。
16.2.1 如何获取Apache 软件
Redhat Linux AS 5.2 自带了Apache,版本为2.2.3。用户只要在安装操作系统的时候把
http server 选项选中,Linux 安装程序将会自动完成Apache 的安装工作。如果在安装操作
系统时没有安装Apache,也可以通过安装光盘中的RPM 软件包进行安装,所需的RPM 软
件包如下所示。

httpd-2.2.3-11.el5_1.3.i386.rpm
httpd-manual-2.2.3-11.el5_1.3.i386.rpm 为了能获取最新版本的Apache,可以从Apache 官方网站
www.apache.org 下载该软件
的源代码安装包,包括gz 和bz2 两种压缩方式。截至本书定稿前,最新的Apache 版本为
2.2.9,下载页面如图16.2 所示。
第3 篇 网络服务管理篇

16.2 Apache 官方网站
下载后把httpd-2.2.9.tar.gz 文件保存到/tmp 目录下即可。
16.2.2 安装Apache 服务器
Apache 对系统的软件和硬件环境都有所要求,在安装前需要检查系统环境是否能满足
要求。检查完成后,先解压安装包文件,然后进行源代码的编译和安装。接下来将以Apache
2.2.9 的源代码安装包为例,详细介绍Apache 在Red Hat Enterprise Linux 5.2 上的完整安装
过程,如下所述。
(1)安装Apache 的硬件和软件配置要求。
? 确保磁盘至少有50MB 的空闲空间。
? 确保操作系统已经安装并正确配置了gcc。
(2)把httpd-2.2.9.tar.gz 文件解压,执行如下命令:

tar -xzvf httpd-2.2.9.tar.gz
文件将会被解压到httpd-2.2.9 目录下。
(3)进入httpd-2.2.9 目录,使用configure 命令配置安装参数,configure 命令的格式为:

configure [OPTION]... [VAR=VALUE]...
关于configure 命令的选项和参数说明可以通过下面命令获得。

./configure --help
这里只介绍几个常用的配置参数,如下所示。
? --prefix 参数:默认情况下Apache 会安装在/usr/local/apache2 目录下,该参数用于
自定义Apache 的安装目录。例如,要把Apache 安装到/usr/local/apache 目录下,
可以使用./configure –prefix=/usr/local/apache 配置命令。
第16 章 Web 服务器配置和管理
·389·
? --enable-modules 参数:用于指定除默认模块以外需要额外安装的Apache 模块,不
同的模块之间以空格分隔。关于Apache 常用模块的功能在16.1.3 节中已有详细说
明。例如,要安装 mod_proxy 和 mod_ssl 两个模块,可以使用./configure
--enable-modules="proxy ssl"配置命令。
? --enable-mods-shared 参数:与--enable-modules 参数一样,该参数同样用于指定需
要额外安装的 Apache 模块,参数格式也是一样。所不同的是,--enable-modules
参数指定安装的模块在Apache 运行的时候就会自动载入,而--enable-mods-shared
参数所指定的Apache 模块需要使用LoadModule 指令进行载入。
在这里只采用默认安装,所以直接运行./configure 即可,运行结果如图16.3 所示。
(4)编译并安装Apache,如下所示。

make
make install
运行结果分别如图16.4 和图16.5 所示。

图16.3 配置安装参数
第3 篇 网络服务管理篇

图16.4 编译Apache

图16.5 安装Apache
16.2.3 启动和关闭Apache
安装完成后就可以启动Apache 服务。Apache 的启动关闭都是通过<Apache 安装目录>
/bin 目录下的apachectl 命令进行管理的。启动Apache 服务,如下所示。

./apachectl start
关闭Apache 服务,如下所示。

./apachectl stop
重启Apache 服务,如下所示。

./apachectl restart
第16 章 Web 服务器配置和管理

安装Apache 后,在没有对httpd.conf 配置文件做任何修改之前启动Apache 服务会得
到一些警告信息,如图16.6 所示。
因为httpd.conf 配置文件中的ServerName 参数没有设置,但是这不会影响Apache 的
正常运行,关于httpd.conf 配置文件的修改会在16.3.2 和16.3.3 小节中进行讲解。
除此之外,在正常情况下启动Apache 服务是不会有任何警告或者错误信息输出的,
如果出现如图16.7 所示的错误信息,用户就应该检查一下是否有其他进程占用了80 端口。

图16.6 第一次启动的报警信息 图16.7 错误信息
16.2.4 检测Apache 服务
要检测Apache 服务是否正在运行,可以通过检查Apache 进程状态或者直接通过浏览
器访问Apache 发布的网站页面来确定。
1.检查Apache进程
可以通过以下命令检查Apache 进程的状态。

ps -ef | grep httpd 运行结果如图16.8 所示。Apache 运行后会在操作系统中创建多个httpd 进程,能在操
作系统中查找到httpd 进程,表示Apache 正在运行。
2.检查Apache页面
通过查看进程的方法只能确定Apache 是否正在运行,但要检查Apache 的运行是否正
常,最直接有效的方法就是通过浏览器查看Apache服务器发布的页面。默认安装后,Apache
网站的首页是一个测试页面,用户可以通过它来检查 Apache 是否运行正常,如图 16.9
所示。

第3 篇 网络服务管理篇
图16.8 查看Apache 进程

图16.9 Apache 测试页面
16.2.5 让Apache 自动运行
Red Hat Enterprise Linux 5.2 可以支持程序服务的开机自动运行,如果要配置Apache
服务在服务器启动的时候自动运行,可以编写启动和关闭Apache 服务的脚本,然后进行
相应的配置。具体步骤如下所述。
(1)编写启动和关闭Apache 服务的脚本,脚本文件名为httpd,并存放到/etc/rc.d/init.d
目录下。下面分几个部分对脚本的内容进行说明,用户只需要按顺序把这些代码添加到
httpd 文件中即可。设置Apache 服务与chikconfig 相关的选项,并执行初始化环境变量的
脚本,代码如下所示。

#!/bin/sh // 设置与chkconfig 相关的选项
#chkconfig :345 85 15 //设置启动级别以及启动顺序
#description:some words you like!! //描述信息
# Source function library.
. /etc/rc.d/init.d/functions //执行/etc/rc.d/init.d/functions 脚本
// 调用系统初始化脚本
# Source function library.
if [ -f /etc/init.d/functions ] ; then
. /etc/init.d/functions //执行. /etc/init.d/functions 脚本
elif [ -f /etc/rc.d/init.d/functions ] ; then
. /etc/rc.d/init.d/functions //执行. /etc/rc.d/init.d/functions 脚本
else
exit 0 //如果找不到上述脚本则结束本脚本的运行
fi
设置与启动关闭Apache 服务相关的选项,代码如下所示。
//获取命令输入的参数
ARGV="$@" //设置httpd 命令的路径
HTTPD='/usr/local/apache2/bin/httpd' //如果envvars 文件存在,则执行envvars 文件设置Apache 的环境变量
if test -f /usr/local/apache2/bin/envvars; then
. /usr/local/apache2/bin/envvars //执行/usr/local/apache2/bin/envvars
fi //设置命令行的HTML 格式
LYNX="links -dump" //设置mod_status 模块的状态页面的URL
第16 章 Web 服务器配置和管理
·393·
STATUSURL="
http://localhost:80/server-status" //解除子进程的文件描述器的限制
ULIMIT_MAX_FILES="ulimit -S -n 'ulimit -H -n'" //如果ULIMIT_MAX_FILES 参数不为空,则运行ULIMIT_MAX_FILES 参数中的指令,解除子进
程文件描述器的限制
if [ "x$ULIMIT_MAX_FILES" != "x" ] ; then
$ULIMIT_MAX_FILES fi
ERROR=0 //如果命令选项为空,则把命令选项设置为-h
if [ "x$ARGV" = "x" ] ; then
ARGV="-h" fi
编写代码,根据执行httpd 脚本时输入的参数,执行相应的程序逻辑,如下所示。

case $ARGV in //启动/关闭/重启Apache
start|stop|restart|graceful|graceful-stop)
$HTTPD -k $ARGV
ERROR=$?
;;
//不支持的命令参数
startssl|sslstart|start-SSL) echo The startssl option is no longer supported.
// 输出信息提示选项已经不再支持
echo Please edit httpd.conf to include the SSL configuration settings
echo and then use "apachectl start".
ERROR=2 ;; //检查httpconf 配置文件的格式是否正确
configtest)
$HTTPD -t
ERROR=$? ;; //检查Apache 服务的状态
status) $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } '
;; //输出完整的状态信息
fullstatus)
$LYNX $STATUSURL
;;
*)
$HTTPD $ARGV
ERROR=$?
esac
exit $ERROR
(2)打开【服务配置】对话框,选择【行动】|【添加服务】命令,在弹出的对话框中
输入httpd,如图16.10 所示。
(3)单击【确认】按钮后,服务列表中将添加一个httpd 服务,如图16.11 所示。
第3 篇 网络服务管理篇

图16.10 添加httpd 服务 图16.11 配置成功
%提示:配置完成后,用户可以直接通过服务配置中的【开始】和【停止】按钮来启动、
关闭Apache 服务,不需要再输入命令。
16.3 Apache 服务器的基本配置和维护
Apache 在安装时已经自动采用了一系列的默认设置,安装完成后Web 服务器已经可
以对外提供WWW 服务,但为了能够更好地运作,还需要对Apache 进行一些配置。Apache
的主要配置文件为httpd.conf,此外,Apache 还提供了相关的命令方便管理和配置。
16.3.1 查看Apache 的相关信息
apachectl 命令是Apache 管理中最常用的命令,它除了可以用于启动和关闭Apache 服
务外,还可以用来查看Apache 的一些相关信息,例如版本信息、已编译模块的信息等,
关于该命令的常见用法说明如下所示。
1.查看Apache软件的版本信息
进入/usr/local/apache/bin 目录,执行apachectl –V 命令,运行结果如图16.12 所示。由
输出信息可以看出,目前安装的Apache 版本为2.2.9,是32 位的。该命令除了输出Apache
的版本外,还包括了模块、编译等的相关信息。
2.查看已经被编译的模块
执行apachectl –l,运行结果如图16.13 所示。
第16 章 Web 服务器配置和管理
·395·

图16.12 查看Apache 版本

图16.13 查看已编译模块
通过该命令,可以获得Apache 已经编译的所有模块的清单。关于Apache 模块的说明,
请参看16.2.2 节的内容。
16.3.2 httpd.conf 配置文件介绍
httpd.conf 是Apache 的配置文件,Apache 中的常见配置主要都是通过修改该文件来实
现的,该文件更改后需要重启Apache 服务使更改的配置生效。下面是httpd.conf 文件在安
装后的默认设置,与Apache 网络和系统相关的选项如下所示。
#使用ServerRoot 参数设置Apache 安装目录
ServerRoot "/usr/local/apache2" #使用Listen 参数设置Apache 监听端口
第3 篇 网络服务管理篇
·396·
Listen 80
<IfModule !mpm_netware_module>
<IfModule !mpm_winnt_module> #使用User 参数设置Apache 进程的执行者
User daemon #使用Group 参数设置Apache 进程执行者所属的用户组
Group daemon
</IfModule>
</IfModule> #使用ServerAdmin 参数设置网站管理员的邮箱地址
ServerAdmin
you@example.com 与Apache 文件和目录权限相关的选项如下所示。
#使用DocumentRoot 参数设置网站根目录
DocumentRoot "/usr/local/apache2/htdocs" #使用Directory 段设置根目录权限
<Directory />
Options FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
</Directory> #使用Directory 段设置/usr/local/apache2/htdocs 目录权限
<Directory "/usr/local/apache2/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory> # 设置首页为index.html
<IfModule dir_module>
DirectoryIndex index.html
</IfModule>
# .ht 后缀文件的访问权限控制
<FilesMatch "^\.ht">
Order allow,deny
Deny from all
Satisfy All
</FilesMatch> 与Apache 日志相关的选项如下所示。
#使用ErrorLog 参数设置错误日志的位置
ErrorLog "logs/error_log" #使用LogLevel 参数设置错误日志的级别
LogLevel warn
<IfModule log_config_module> #使用LogFormat 参数设置访问日志的格式模板
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"
%I %O" combinedio
</IfModule> #使用CustomLog 参数设置访问日志的位置和格式
第16 章 Web 服务器配置和管理
·397·
CustomLog "logs/access_log" common
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "/usr/local/apache2/cgi-bin/"
</IfModule>
<IfModule cgid_module>
</IfModule> #使用Directory 段设置/usr/local/apache2/cgi-bin 目录权限
<Directory "/usr/local/apache2/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
DefaultType text/plain
# mime 模块的相关设置
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
# ssl 模块的相关设置
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
下面对httpd.conf 配置文件中,一些常用配置选项的用法进行解释。
1.ServerRoot参数
该参数用于指定 Apache 软件安装的根目录,如果安装时不指定其他目录的话,则
Apache 默认就是安装在/usr/local/apache2 目录下。参数格式如下所示。

ServerRoot [目录的绝对路径]
2.Listen参数
该参数用于指定Apache所监听的端口,默认情况下Apache的监听端口为80,即WWW
服务的默认端口。在服务器有多个IP 地址的情况下,Listen 参数还可以用于设置监听的IP
地址。参数格式如下所示。

Listen [端口/IP 地址:端口]

下面是一个示例。
#设置Apache 服务监听IP192.168.1.111 的80 端口
Listen 192.168.1.111:80 3.User和Group参数
User 和Group 参数用于指定Apache 进程的执行者和执行者所属的用户组,如果要用
第3 篇 网络服务管理篇
·398·
UID 或者GID,必须在ID 前加上#号。User 参数格式如下所示。

User [用户名/#UID]
Group 参数格式如下所示。

Group [用户组/#GID]
4.ServerAdmin参数
该参数用于指定Web 管理员的邮箱地址,这个地址会出现在系统连接出错的时候,以
便访问者能够及时通知Web 管理员。参数格式如下所示。

ServerAdmin [邮箱地址]
5.DocumentRoot参数
该参数用于指定Web 服务器上的文档存放的位置,在未配置任何虚拟主机或虚拟目录
的情况下,用户通过 http 访问 Web 服务器,所有的输出资料文件均存放在这里。
DocumentRoot 参数的格式如下所示。

DocumentRoot [目录的绝对路径]
6.ErrorLog参数
该参数用于指定记录Apache 运行过程中所产生的错误信息的日志文件位置,方便系
统管理员发现和解决故障。参数格式如下所示。

ErrorLog [文件的绝对或者相对路径]
7.LogLevel参数
该参数用于指定ErrorLog 文件中记录的错误信息的级别,设置不同的级别,输出日志
信息的详细程度也会有所变化,参数值设置越往右边,则错误的输出信息越简单,建议值
为warm。参数格式如下所示。

LogLevel [debug/info/notice/warm/error/crit/alert/emerg]
16.3.3 配置文件的修改
用户可以直接通过图形界面中文件编辑器或者在字符界面下通过VI 对配置文件进行
修改,修改完成后必须重启Apache 服务才能使更改生效。如果用户在配置文件中添加了
错误的参数或者设置了错误的参数值,那么Apache 将无法启动,这时候就需要用户在配
置文件中去查找错误的配置信息并进行更改。如果更改的参数很多,那么这个查错的过程
将会非常困难。为方便用户验证httpd.conf 配置文件中的参数是否配置正确,Apache 提供
了命令可以自动完成上述工作,具体命令如下所示。

apachectl –configtest
第16 章 Web 服务器配置和管理
·399·
如果httpd.conf 文件没有错误,则命令将返回正常,运行结果如图16.14 所示。可以看
到,命令返回结果“Syntax OK”,表示httpd.conf 中的参数配置没有问题。现在将配置文
件中的Listen 参数进行更改,将Listen 参数由原来的80 改为TestPort,模拟配置参数错误
的情况,如图16.15 所示。
重新对httpd.conf 配置文件进行验证,此时会验证失败。apachectl 命令还会告诉用户
错误参数所在行号,错误的具体内容,运行结果如图16.16 所示。

图16.14 httpd.conf 文件验证成功

图16.15 修改Listen 参数

图16.16 httpd.conf 文件验证失败
命令提示httpd.conf 配置文件第41 行存在错误:必须指定端口,而第41 行正是Listen
参数所在的行号。
16.3.4 符号链接和虚拟目录
在16.3.2 节关于httpd.conf 配置文件的介绍中提到了一个DocumentRoot 的参数,该参
数用于指定Web 服务器发布文档的主目录。在默认情况下,用户通过http 访问Web 服务
第3 篇 网络服务管理篇
·400·
器所浏览到的所有资料都是存放于该目录之下。该参数只能设置一个目录作为参数值,那
么是不是在Apache 中就只能有一个目录存放文档文件呢?如果文档根目录空间不足,要
把文件存放到其他的文件系统中去应该怎么办呢?对上述问题,Apache 提供了两种解决
方法。
1.符号链接
关于符号链接在“8.3.3 链接文件”一节中已有详细的介绍,它的原理和使用在这里
就不再过多叙述。下面演示一下它在 Apache 中的应用。假设现在的文档根目录为
/usr/local/apache2/htdoc/,希望把/usr/share/doc 目录映射成/doc/的访问路径。配置过程很简
单,使用ln -s 命令把/usr/share/doc 链接到/usr/local/apache2/htdoc/doc 下即可,运行结果如
图16.17 所示。建立符号链接后,直接使用浏览器访问
http://demoserver/doc/进行测试,如
图16.18 所示。

图16.17 创建符号链接

图16.18 测试链接效果
第16 章 Web 服务器配置和管理
·401·
虽然图16.18 中访问的是网站根路径下的doc 目录,但其实doc 目录只是一个符号链
接,它实际上是被链接到了/usr/share/doc 目录下,所以用户访问通过浏览器访问时看到的
都是/usr/share/doc 目录下的内容。
2.虚拟目录
使用虚拟目录是另一种将根目录以外的内容加入到站点中的办法。下面举一个简单的
使用虚拟目录的例子,把/var/log 目录映射成网站根目录的/log 下,具体过程如下所述。
(1)打开httpd.conf 配置文件,在配置文件中添加如下内容:
#使用Alias 参数设置虚拟目录和实际目录的对应关系
Alias /log "/var/log" #使用Directory 段设置/var/log 目录的访问属性
<Directory "/var/log"> Options Indexes MultiViews
AllowOverride None
order allow,deny
Allow from all
</Directory>
(2)重新启动Apache 服务。使用浏览器访问
http://demoserver/log 进行测试,如图16.19
所示。现在,用户输入
http://demoserver/log 的链接,就会访问到/var/log 目录下的内容。如
果在配置文件中写成Alias /ftp/ “/var/ftp/pub”格式(多加了/),则访问的时候必须把/加上,
否则不能访问,如图16.20 所示。

图16.19 测试虚拟目录效果
第3 篇 网络服务管理篇
·402·

图16.20 无法访问
16.3.5 页面重定向
如果用户经常访问某个网站的网页时,他很可能会把页面的 URL 添加到收藏夹中,
在每次访问网站的时候可以直接点击收藏夹中的记录访问。但是如果网站进行了目录结构
的更新后,用户再使用原来的URL 访问时就会出现“404 页面无法找到”的错误,为了方
便用户能够继续使用原来的URL 进行访问,这时就要使用页面重定向。
1.页面重定向命令说明
Apache 提供了Redirect 命令用于配置页面重定向,其命令格式为:

Redirect [HTTP 代码] 用户请求的URL [重定向后的URL]

其中常见的HTTP 代码以及说明如表16.2 所示。
表16.2 HT TP代码说明
HTTP 代码 说 明
200 访问成功
301
页面已移动,请求的数据具有新的位置且更改是永久的,用户可以记住新的URL,以便
日后直接使用新的URL 进行访问
302 页面已找到,但请求的数据临时具有不同的URL
303 页面已经被替换,用户应该记住新的URL
404 页面不存在,服务器找不到给定的资源
2.页面重定向配置
假设网站有一个/doc 目录,现在管理员要对网站的目录结构进行整理,并把/doc 目录
移动到/old-doc 目录下。如果用户还是用原来的URL 访问/doc,将会得到404 的错误,如
图16.21 所示。为解决这个问题,需要/doc 配置页面重定向,具体过程如下所述。
第16 章 Web 服务器配置和管理
·403·

图16.21 无法访问
(1)打开httpd.conf 配置文件。
(2)在配置文件中添加如下内容:
#指定当用户访问/doc 目录遇到303 错误时就自动重定向到
http://demoserver/old-doc/
Redirect 303 /doc
http://demoserver/old-doc/
(3)重新启动Apache 服务。
(4)使用浏览器进行测试,页面将自动重定向到/old-doc 目录,如图16.22 所示。

图16.22 页面重定向
16.3.6 Apache 日志文件
Apache 服务器运行后会生成两个日志文件,这两个文件是access_log(访问日志)和
error_log(错误日志),采取默认安装方式时,这些文件可以在/usr/local/apache2/log 目录
下找到。关于安装目录的设置,可参看16.2.2 节的内容。
1.访问日志文件
顾名思义,Apache 的访问日志就是记录Web 服务器的所有访问活动,如图16.23 是一
个访问日志的截取图。
第3 篇 网络服务管理篇
·404·

图16.23 访问日志示例
从文件内容可以看出,每一行记录了一次访问记录,由7 个部分组成,格式为:
客户端地址 访问者的标识 访问者的验证名字 请求的时间 请求类型 请求的HTTP 代码 发送给客
户端的字节数
? 客户端地址:表明访问网站的客户端IP 地址。
? 访问者的标识:该项一般为空白,用“-”替代。
? 访问者的验证名字:该项用于记录访问者进行身份验证时提供的名字,一般情况
下该项也为空白。
? 请求的时间:记录访问操作的发生时间。
? 请求类型:该项记录了服务器收到的是一个什么类型的请求,一般类型包括GET、
POST 或者HEAD。
? 请求的HTTP 代码:通过该项信息可以知道请求是否成功,或者遇到了什么样的
错误,正常情况下,该项值为200。
? 发送给客户端的字节数:表示发送给客户端的总的字节数,通过检查该数值是否
和文件大小相同,可以知道传输是否被中断。
2.错误日志
错误日志是Apache 提供的另外一种标准日志,该日志文件记录了Apache 服务运行过
程所发生的错误信息。httpd.conf 配置文件中提供了以下两个配置参数:

ErrorLog logs/error_log
LogLevel warn
它们分别用于配置错误日志的位置和日志的级别,日志级别的说明如表16.3 所示。
表16.3 日志级别说明
第16 章 Web 服务器配置和管理
·405·
严 重 程 度 等 级 说 明
1 em erg 系统不可用
2 alert 需要立即引起注意的情况
3 crit 危急情况
4 error 错误信息
5 warn 警告信息
6 notice 需要引起注意的情况
7 info 一般信息
8 debug 由运行于debug 模式的程序输出的信息
emerg 级别信息的严重程度最高,debug 级别最低。如果用户把错误日志设置成warn
级别,则严重程度由1~5 的所有错误信息都会被记录下来,如图16.24 是一个访问日志的
截取图。

图16.24 错误日志示例
从文件内容可以看出,每一行记录了一个错误,由3 个部分组成,格式如下所示。

时间 错误等级 错误信息

例如,下面的一条错误信息:

[Web JUL 30 23:03:16 2008] [error] [client 127.0.0.1] File does not exists:
/usr/local/apache2/tmp/usage ? 第1 个括号中的内容为错误发生时间:2008 年7 月30 日23 点03 分16 秒。
? 第2 个括号中的内容为错误的级别:error。
? 其他为错误的内容:客户端127.0.0.1 访问/usr/local/apache2/tmp/usage 目录,但目
录无法找到。
第3 篇 网络服务管理篇
·406·
16.4 日 志 分 析
在16.3 节中已经介绍了Apache 中的标准日志——访问日志和错误日志,虽然访问日
志中包含了大量的用户访问信息,但是这些信息对网站经营者和网站管理员管理、规划网
站却没有多少直接的帮助。作为一个网站的经营者,最希望知道的就是有多少人浏览了网
站,他们浏览了哪些网页,停留了多长时间等。其实这些信息就隐藏在访问日志文件中,
但是要把这些数据有效地展现出来,还需要利用一些工具,Webalizer 就是这类软件中的一
个佼佼者。
16.4.1 安装Webalizer 日志分析程序
Webalizer 是一个优秀的日志分析程序,Redhat Enterprise Linux 5.2 安装介质中提供了
Webalizer 的RPM 包,如果用户在安装操作系统的时候已经安装了Webalizer,则可以跳过。
需要安装的RPM 软件包如下所示。

Webalizer-2.01_10-30.1.i386.rpm
16.4.2 配置Webalizer
Webalizer 的配置主要通过修改Webalizer.conf 配置文件来实现。安装Webalizer 后,
该文件默认存放于/etc/目录下,下面是 Webalizer.conf 文件的默认配置及各配置选项的说
明,用户可以根据实际的需要进行更改。
#使用LogFile 参数设置访问日志的位置
LogFile /var/log/httpd/access_log #使用OutputDir 参数设置统计报表的输出位置
OutputDir /var/www/usage #使用HistoryName 参数设置Webalizer 生成的历史文件名
HistoryName /var/lib/Webalizer/Webalizer.hist #使用Incremental 参数设置是否增量
Incremental yes #使用IncrementalName 参数设置保存当前数据的文件名
IncrementalName /var/lib/Webalizer/Webalizer.current
#使用PageType 参数定义哪种类型的URL 属于页面访问
PageType htm*
PageType cgi
PageType php
PageType shtml #使用DNSCache 参数设置反向DNS 解析的缓存文件
DNSCache /var/lib/Webalizer/dns_cache.db #使用DNSChildren 参数设置用多少个子进程进行DNS 解析
DNSChildren 10
Quiet yes
FoldSeqErr yes
第16 章 Web 服务器配置和管理
·407·
#使用HideURL 参数设置需要隐藏的内容
HideURL *.gif
HideURL *.GIF
HideURL *.jpg
HideURL *.JPG
HideURL *.png
HideURL *.PNG
HideURL *.ra
#使用SearchEngine 参数设置搜索引擎和URL 中的查询格式
SearchEngine yahoo.com p= # 搜索引擎yahoo.com
SearchEngine altavista.com q=
SearchEngine google.com q= # 搜索引擎google.com
SearchEngine eureka.com q=
SearchEngine lycos.com query=
SearchEngine hotbot.com MT=
SearchEngine msn.com MT= # 搜索引擎msn.com
SearchEngine infoseek.com qt=
SearchEngine Webcrawler searchText=
SearchEngine excite search=
SearchEngine netscape.com search= # 搜索引擎netscape.com
SearchEngine mamma.com query=
SearchEngine alltheWeb.com query=
SearchEngine northernlight.com qr=
一般只需要配置LogFile 和OutputDir 参数,这两个参数分别用于指定Apache 访问日
志的位置和Webalizer 分析软件的报告输出目录,修改如下所示。

LogFile /usr/local/apache2/logs/access_log
OutputDir /usr/local/apache2/htdocs/loganalyze
其中,OutputDir 参数被设置为网站根目录下的/loganalyze 目录,为什么要这样设置,
在后面会有进一步的讲解。
16.4.3 使用Webalizer 分析日志
经过前面的配置 ,Webalizer 已经可以 使用,运 行 Webalizer 命令后 将会在
/usr/local/apache2/htdocs/loganalyze 目录下生成相应的报表。运行结果如图16.25 所示。

图16.25 生成报表
可以看到,Webalizer 在loganalyze 目录下生成了一系列的HTML 和PNG 图形文件,
第3 篇 网络服务管理篇
·408·
Apache 访问日志的统计信息就保存在这些文件中。Webalizer 命令还有很多其他的选项,
但是只要把Webalizer.conf 文件配置好了就基本不需要在命令中添加其他选项,Webalizer
命令的各种选项的用法可以通过执行Webalizer –h 命令来了解,如图16.26 所示。

图16.26 Webalizer 命令的用法
Webalizer 生成的报表是以HTML 格式保存的,可以通过Apache 来发布。在前面已经
通过配置OutputDir 参数把报表输出到了网站的/loganalyze 目录下,通过浏览器进行测试,
将可以看到一个图形化的统计报表,如图16.27 所示。

图16.27 查看统计报表
通过这些报表,网站的经营者可以非常直观地了解到访问其网站的各种统计信息,这
第16 章 Web 服务器配置和管理
·409·
将为管理、规划网站提供非常有效的数据支撑。
16.5 Apache 安全配置
Apache 提供了多种的安全控制手段,包括设置 Web 访问控制、用户登录密码认证
及.htaccess 文件等。通过这些技术手段,可以进一步提升Apache 服务器的安全级别,减少
服务器受攻击或数据被窃取的风险。
16.5.1 访问控制
设置访问控制是提高Apache 服务器安全级别最有效的手段之一,但在介绍Apache 的
访问控制指令前,先要介绍一下Diretory 段。Diretory 段用于设置与目录相关的参数和指
令,包括访问控制和认证,其格式如下所示。

<Diretory 目录的路径>
目录相关的配置参数和指令
</Diretory>
每个Diretory 段以<Diretory>开始,以</Diretory>结束,段作用于<Diretory>中指定的
目录及其里面的所有文件和子目录。在段中可以设置与目录相关的参数和指令,包括访问
控制和认证。Apache 中的访问控制指令有以下3 种。
1.Allow指令
Allow 指令用于设置哪些客户端可以访问Apache,命令格式如下所示。

Allow from [All/全域名/部分域名/IP 地址/网络地址/CIDR 地址]…
? All:表示所有客户端。
? 全域名:表示域名对应的客户端,如
www.domain.com
? 部分域名:表示域内的所有客户端,如domain.com。
? IP 地址:如172.20.17.1。
? 网络地址:如172.20.17.0/255.255.255.0。
? CIDR 地址:如172.20.17.0/24。
%注意:Allow 指令中可以指定多个地址,不同地址间通过空格进行分隔。
2.Deny指令
Deny 指令用于设置拒绝哪些客户端访问Apache,格式跟Allow 指令一样。
第3 篇 网络服务管理篇
·410·3.Order指令
Order 指令用于指定执行访问规则的先后顺序,有两种形式:
? Order Allow,Deny:先执行允许访问规则,再执行拒绝访问规则。
? Order Deny,Allow:先执行拒绝访问规则,再执行允许访问规则。
%注意:编写Order 指令时,Allow 和Deny 之间不能有空格存在。
现在,假设网站中有一个名为security_info 的目录,因为是一个保存有机密信息的目
录,所以网站管理员希望该目录只能由管理员自己的机器172.20.17.55 来查看,其他用户
都不能访问。可以通过以下步骤实现。
(1)打开httpd.conf 配置文件并添加以下内容:
#使用Diretory 段设置/usr/local/apache2/htdocs/secure_info 目录的属性
<Directory "/usr/local/apache2/htdocs/secure_info">
Options Indexes FollowSymLinks
AllowOverride None #使用Order 参数设置先执行拒绝规则,再执行允许规则
Order deny,allow #使用Deny 参数设置拒绝所有客户端访问
Deny from all #使用Allow 参数设置允许172.20.17.55 客户端访问
Allow from 172.20.17.55
</Directory>
(2)保存后重启Apache 服务。
在IP地址为172.20.17.55的机器上直接打开浏览器访问
http://demoserver/security_info/
进行测试,结果如图16.28 所示。在其他机器上访问的结果如图16.29 所示。

图16.28 172.20.17.55 客户端可以正常访问

第16 章 Web 服务器配置和管理
·411·
图16.29 其他客户端访问被拒绝
可以看出,访问控制的目的已经达到。
16.5.2 用户认证
Apache 的用户认证包括基本(Basic)认证和摘要(Digest)认证两种。摘要认证比基
本认证更加安全,但是并非所有的浏览器都支持摘要认证,所以本节只针对基本认证进行
介绍。基本认证方式其实相当简单,当Web 浏览器请求经此认证模式保护的URL 时,将
会出现一个对话框,要求用户输入用户名和口令。用户输入后,传给 Web 服务器,Web
服务器验证它的正确性。如果正确,则返回页面;否则将返回401 错误。
要使用用户认证,首先要创建保存用户名和口令的认证口令文件。在Apache 中提供
了htpasswd 命令用于创建和修改认证口令文件,该命令在<Apache 安装目录>/bin 目录下。
关于该命令完整的选项和参数说明可以通过直接运行htpasswd 获取。
要在/usr/local/apache2/conf 目录下创建一个名为users 的认证口令文件,并在口令文件
中添加一个名为sam 的用户,命令如下所示。

htpasswd -c /usr/local/apache2/conf/users sam
命令运行后会提示用户输入sam 用户的口令并再次确认,运行结果如图16.30 所示。

图16.30 创建密码文件和用户访问
认证口令文件创建后,如果还要再向文件里添加一个名为ken 的用户,可以执行如下
命令:

htpasswd /usr/local/apache2/conf/users ken 与/etc/shadow 文件类似,认证口令文件中的每一行为一个用户记录,每条记录包含用
户名和加密后的口令,如下所示。

用户名:加密后的口令
%注意:htpasswd 命令没有提供删除用户的选项,如果要删除用户,直接通过文本编辑器
打开认证口令文件把指定的用户删除即可。
创建完认证口令文件后,还要对配置文件进行修改,用户认证是在httpd.conf 配置文
件中的<Directory>段中进行设置,其主要配置参数如下:
第3 篇 网络服务管理篇
·412·1.AuthName参数
AuthName 参数用于设置受保护领域的名称,其参数格式如下所示。

AuthName 领域名称

领域名称没有特别限制,用户可以根据自己的喜欢进行设置。
2.AuthType参数
AuthType 参数用于设置认证的方式,其格式如下所示。

AuthType Basic/Digest
Basic 和Digest 分别代表基本认证和摘要认证。
3.AuthUserFile参数
AuthUserFile 参数用于设置认证口令文件的位置,其格式如下所示。

AuthUserFile 文件名
4.Require参数
Require 参数用于指定哪些用户可以对目录进行访问,其格式有下面两种。

Require user 用户名 [用户名] ...
Require valid-user ? 用户名:认证口令文件中的用户,可以指定一个或多个用户,设置后只有指定的
用户才能有权限进行访问。
? valid-user:授权给认证口令文件中的所有用户。
现在,假设网站管理员希望对security_info 目录做进一步的控制,配置该目录只有经
过验证的sam 用户能够访问,用户口令存放在users 口令认证文件中。要实现这样的效果,
需要把httpd.conf 配置文件中security_info 目录的配置信息替换为下面的内容:
#使用Diretory 段设置/usr/local/apache2/htdocs/secure_info 目录的属性
<Directory "/usr/local/apache2/htdocs/secure_info">
Options Indexes FollowSymLinks
AllowOverride None
#使用AuthType 参数设置认证类型
AuthType Basic
#使用AuthName 参数设置
AuthName "secure_info_auth"
#使用AuthUserFile 参数设置认证口令文件的位置
AuthUserFile /usr/local/apache2/conf/users
#使用require 参数设置sam 用户可以访问
require user sam
#使用Order 参数设置先执行拒绝规则,再执行允许规则
Order deny,allow
#使用Deny 参数设置拒绝所有客户端访问
第16 章 Web 服务器配置和管理
·413·
Deny from all
#使用Allow 参数设置允许172.20.17.55 客户端访问
Allow from 172.20.17.55
</Directory>
重启 Apache 服务后使用浏览器访问
http://demoserver/security_info 进行测试,如
图16.31 所示。输入用户和口令,单击【确认】按钮,验证成功后将进入如图16.29 所示
的页面;否则将会要求重新输入。如果单击【取消】按钮将会返回如图16.32 所示的错误
页面。

图16.31 弹出需要验证的窗口

图16.32 错误页面
16.5.3 分布式配置文件:.htaccess
.htaccess 文件又称为“分布式配置文件”,该文件可以覆盖httpd.conf 文件中的配置,
但是它只能设置对目录的访问控制和用户认证。.htaccess 文件可以有多个,每个.htaccess
文件的作用范围仅限于该文件所存放的目录以及该目录下的所有子目录。虽然.htaccess 能
实现的功能在<Directory>段中都能够实现,但是因为在.htaccess 修改配置后并不需要重启
Apache 服务就能生效,所以在一些对停机时间要求较高的系统中可以使用。
%注意:一般情况下,Apache 并不建议使用.htaccess 文件,因为使用.htaccess 文件会对服
务器性能造成影响。
下面还是以16.5.2 节中的例子为基础来演示在.htaccess 文件中配置访问控制和用户认
证的过程。
(1)打开httpd.conf 配置文件,将security_info 目录的配置信息替换为下面的内容。
第3 篇 网络服务管理篇
·414· #使用Diretory 段设置/usr/local/apache2/htdocs/secure_info 目录的属性
<Directory "/usr/local/apache2/htdocs/secure_info"> #允许.htaccess 文件覆盖httpd.conf 文件中的secure_info 目录配置
AllowOverride All
</Directory>
修改主要包括两个方面:
? 删除原有的关于访问控制和用户认证的参数和指令,因为这些指令将会被写
到.htaccess 文件中去。
? 添加了 AllowOverride Al l 参数,允许.htaccess 文件覆盖 httpd.conf 文件中关于
secure_info 目录的配置。如果不做这项设置,.htaccess 文件中的配置将不能生效。
(2)重启 Apache 服务,在/usr/local/apache2/htdocs/secure_info/目录下创建一个文
件.htaccess,写入以下内容:
#使用AuthType 参数设置认证类型
AuthType Basic
#使用AuthName 参数设置
AuthName "secure_info_auth"
#使用AuthUserFile 参数设置认证口令文件的位置
AuthUserFile /usr/local/apache2/conf/users
#使用require 参数设置sam 用户可以访问
require user sam
#使用Order 参数设置先执行拒绝规则,再执行允许规则
Order deny,allow
#使用Deny 参数设置拒绝所有客户端访问
Deny from all
#使用Allow 参数设置允许172.20.17.55 客户端访问
Allow from 172.20.17.55
使用浏览器访问
http://demoserver/security_info 进行测试,将会返回如图16.32 所示的
页面。现在对.htaccess 文件做任何的修改,都不需要重启Apache 服务,立刻就会生效。
16.6 虚 拟 主 机
虚拟主机服务就是指将一台物理服务器虚拟成多台的Web 服务器,可以有效节省硬件
资源并且方便管理。Apache 可支持基于IP 地址或主机名的虚拟主机服务,本节将分别介
绍这两种Apache 虚拟主机技术的实现。
16.6.1 虚拟主机服务简介
虚拟主机服务就是指将一台物理服务器虚拟成多台虚拟的Web 服务器。对于一些小规
模的网站,通过使用Web 虚拟主机技术,可以跟其他网站共享同一台物理机器,有效减少
系统的运行成本,并且可以减少管理的难度。另外对于个人用户,也可以使用这种虚拟主
机方式来建立有自己独立域名的Web 服务器。
第16 章 Web 服务器配置和管理
·415·
比方说,一家从事主机代管服务的公司,它为其他企业提供Web 服务,那么它肯定不
是为每一家企业都各自准备一台物理上的服务器,因为这不符合资源最大化利用的原则。
通常的做法是用一台功能较强大的大型服务器,然后用虚拟主机的形式为多个企业提供
Web 服务。虽然所有的Web 服务都是同一台物理服务器所提供的,但是在访问者看起来
却是在不同的服务器上访问一样。
Apache 提供了两种虚拟主机服务方案:基于IP 的虚拟主机服务和基于主机名的虚拟
主机服务。
16.6.2 基于IP 的虚拟主机服务
顾名思义,提供基于IP 的虚拟主机服务的服务器上必须同时设置有多个IP 地址,服
务器根据用户请求的目的IP 地址来判定用户请求的是哪个虚拟主机的服务,从而作进一步
的处理。
Apache 中是通过httpd.conf 配置文件中的<VirtualHost>段来配置虚拟主机服务的,其
参数格式如下所示。

<VirtualHost IP 地址/主机名[:端口] IP 地址/主机名[:端口] ...>
虚拟主机相关的配置参数和指令
<VirtualHost > 下面以一个实例来演示基于IP 的虚拟主机服务的配置过程。假设在一台服务器上有两
个IP 地址,分别为172.20.17.55 和172.20.17.56,对应的主机名分别为
www.server1.com
www.server2.com。现在,要在这台服务器上根据这两个IP 地址来实现虚拟主机服务,当
用户访问IP 地址172.20.17.55 时,返回/usr/local/apache2/htdoc/server1 目录下的内容;而访
问 172.20.17.56 时,则返回/usr/local/apache2/htdoc/server2 目录下的内容。实现过程如下
所述。
(1)在两张网卡上设置好相应的IP 地址,如果服务器只有一张网卡,可以通过在一张
网卡上绑定多个 IP 地址来模拟。关于一张网卡绑定多个 IP 地址的具体配置方法请参看
“11.6.1 在网卡上绑定多个IP 地址”一节的内容。
(2)在/usr/local/apache2/htdocs 目录下建立两个目录server1_ip 和server2_ip,并分别
在这两个目录下生成一个 index.html 文件,其内容如下所示。/usr/local/apache2/htdocs/
server1_ip/index.html 文件的内容如下:

<HTML>
<HEAD>
<TITLE>基于IP 的虚拟主机测试</TITLE> // 页面标题
</HEAD>
<BODY>
基于IP 的虚拟主机测试:<FONT SIZE=”6”>www.server1.com</FONT> //页面内容
</BODY>
</HTML>
/usr/local/apache2/htdocs/server2_ip/index.html 文件的内容如下所示。

<HTML>
第3 篇 网络服务管理篇
·416·
<HEAD>
<TITLE>基于IP 的虚拟主机测试</TITLE> // 页面标题
</HEAD>
<BODY>
基于IP 的虚拟主机测试:<FONT SIZE=”6”>www.server2.com</FONT> //页面内容
</BODY>
</HTML>
(3)打开httpd.conf 配置文件并添加如下内容:
#使用VirtualHost 段配置IP 172.20.17.55 的虚拟主机服务
<VirtualHost 172.20.17.55> #使用ServerAdmin 参数设置管理员邮箱
ServerAdmin
admin@company1.com #使用DocumentRoot 参数设置网站文档的根目录
DocumentRoot /usr/local/apache2/htdocs/server1_ip #使用ServerName 参数设置服务器名
ServerName
www.server1.com #使用ErrorLog 参数设置Apache 错误日志位置
ErrorLog /usr/local/apache2/logs/error_server1.log
</VirtualHost> #使用VirtualHost 段配置IP 172.20.17.56 的虚拟主机服务
<VirtualHost 172.20.17.56> #使用ServerAdmin 参数设置管理员邮箱
ServerAdmin
admin@company2.com #使用DocumentRoot 参数设置网站文档的根目录
DocumentRoot /usr/local/apache2/htdocs/server2_ip #使用ServerName 参数设置服务器名
ServerName
www.server2.com #使用ErrorLog 参数设置Apache 错误日志位置
ErrorLog /usr/local/apache2/logs/error_server2.log
</VirtualHost>
(4)重启Apache 服务使修改生效。现在,通过浏览器访问
http://172.20.17.55/将返回
如图16.33 所示的页面。如果访问
http://172.20.17.56/将返回如图16.34 所示的页面。

图16.33 172.20.17.55 的虚拟主机服务

第16 章 Web 服务器配置和管理
·417·
图16.34 172.20.17.56 的虚拟主机服务
通过这样的配置,可以减少硬件的资源,对用户也是透明的,在用户看来就像在访问
两台不同的物理服务器上的网站一样。但是基于IP 地址的虚拟主机方式也有它的缺点,就
是需要在提供虚拟主机服务的机器上设立多个IP 地址,既浪费了IP 地址,又限制了一台
机器所能容纳的虚拟主机数目。因此这种方式越来越少使用,更多的是使用基于主机名的
虚拟主机服务。
16.6.3 基于主机名的虚拟主机服务
由于基于IP 地址的虚拟主机服务有如上的缺点,HTTP 1.1 协议中增加了对基于主机
名的虚拟主机服务的支持。具体地说,当客户程序向Web 服务器发出请求时,客户想要访
问的主机名也通过请求头中的“Host:”语句传递给Web 服务器。Web 服务器程序接收到
这个请求后,可以通过检查“Host:”语句来判定客户程序请求是哪个虚拟主机的服务,然
后再做进一步的处理。通过这样的方式,提供虚拟主机服务的机器上只要设置一个IP 地址,
理论上就可以给无数多个虚拟域名提供服务。这样占用资源少,管理方便,所以目前基本
上都是使用这种方式来提供虚拟主机服务。
与基于IP 地址的虚拟主机服务的配置方法略有不同,用户必须在httpd.conf 配置文件
中使用NameVirtualHost 参数,其格式如下所示。

NameVirtualHost IP 地址/主机名[:端口]
该参数告诉Apache 服务器,这里配置的是一个基于主机名的虚拟主机,使用的IP 地
址为参数中所设置的IP 地址或主机名对应的IP 地址。下面还是以前面的例子基础来演示
基于主机名的虚拟主机的配置步骤。
(1)在/etc/hosts 中添加如下的内容:

172.20.17.55
www.server1.com
172.20.17.55
www.server2.com
(2)在/usr/local/apache2/htdocs 目录下建立两个目录server1_name 和server2_name,并
分别在这两个目录下生成一个index.html 文件,其内容如下所示。server1_name 目录下的
内容/usr/local/apache2/htdocs/server1_name/index.html 如下:

<HTML>
<HEAD>
<TITLE>基于主机名的虚拟主机测试</TITLE>
</HEAD>
<BODY>
基于主机名的虚拟主机测试:<FONT SIZE="6">www.server1.com</FONT>
</BODY>
</HTML>
server2_name 目录下的内容/usr/local/apache2/htdocs/server2_name/index.html 如下:

<HTML>
第3 篇 网络服务管理篇
·418·
<HEAD>
<TITLE>基于主机名的虚拟主机测试</TITLE>
</HEAD>
<BODY>
基于主机名的虚拟主机测试:<FONT SIZE="6">www.server2.com</FONT>
</BODY>
</HTML>
(3)打开httpd.conf 配置文件并添加如下内容:
#使用NameVirtualHost参数,设置基于主机名的虚拟主机服务使用的IP地址是172.20.17.55
NameVirtualHost 172.20.17.55 #使用VirtualHost 段配置主机名
www.server1.com 的虚拟主机服务
<VirtualHost 172.20.17.55> #使用ServerAdmin 参数设置管理员邮箱
ServerAdmin
admin@company1.com #使用DocumentRoot 参数设置网站文档的根目录
DocumentRoot /usr/local/apache2/htdocs/server1_name #使用ServerName 参数设置服务器名
ServerName
www.server1.com #使用ErrorLog 参数设置Apache 错误日志位置
ErrorLog /usr/local/apache2/logs/error_server1.log
</VirtualHost> #使用VirtualHost 段配置主机名
www.server2.com 的虚拟主机服务
<VirtualHost 172.20.17.55> #使用ServerAdmin 参数设置管理员邮箱
ServerAdmin
admin@company2.com #使用DocumentRoot 参数设置网站文档的根目录
DocumentRoot /usr/local/apache2/htdocs/server2_name #使用ServerName 参数设置服务器名
ServerName
www.server2.com #使用ErrorLog 参数设置Apache 错误日志位置
ErrorLog /usr/local/apache2/logs/error_server2.log
</VirtualHost>
(4)重启Apache 服务使更改生效。现在,通过浏览器访问
http://www.server1.com/
返回如图16.35 所示的页面,如访问
http://www.server2.com/则将返回如图16.36 所示的页
面。虽然返回的页面内容不同,但实际上它们都是在访问同一个Apache 服务器。

图16.35 www. server1.com 的虚拟主机服务
第16 章 Web 服务器配置和管理
·419·

图16.36 www. server2.com 的虚拟主机服务
16.7 Apache 服务器配置的常见问题
本节将介绍在Red Hat Enterprise Linux 5.2 上配置Apache 服务器过程中常见的一些问
题,包括如何防止其他网站非法链接网站的图片文件;在access_log 日志文件中忽略部分
访问日志的记录以及处理Apache 服务无法启动的故障等。
16.7.1 防止网站图片盗链
为了防止其他网站非法盗链本网站中的图片文件,可以在Apache 中进行一些配置,
以禁止图片被非法盗用。假设本网站的域名为
www.myWeb.com,用户可编辑 httpd.conf
文件,加入如下的配置内容。

SetEnvIfNoCase Referer "^http://www.myWeb.com/" local_ref=1 //指定本Apache 服务器的URL
<FilesMatch ".(gif|jpg|bmp)">
Order Allow,Deny
Allow from env=local_ref //只允许
http://www.myWeb.com 链接图片文件
</FilesMatch>
最后重启Apache 服务,命令如下所示。

service httpd restart
完成后,如果其他非法主机试图链接图片时,图片将无法显示。
16.7.2 忽略某些访问日志的记录
默认情况下,Apache 的access_log 日志文件会记录所有的用户访问记录(用户访问的
每一个文件),这会产生大量的日志信息。用户可以更改Apache 的配置,忽略某些访问
日志的记录。例如,要在access_log 日志文件中忽略图片文件的访问记录,可打开httpd.conf
配置文件,加入如下的内容。

<FilesMatch "\.(bmp|gif|jpg|swf)">
SetEnv IMAG 1
第3 篇 网络服务管理篇
·420·
</FilesMatch>
CustomLog logs/access_log combined env=!IMAG
最后重启Apache 服务使配置生效,完成后Apache 将不再记录bmp、gif、jpeg 及swf
后缀的文件的访问日志。
16.7.3 Apache 无法启动
Apache 无法正常启动,主要是由以下两种情况导致。第一种是httpd.conf 文件配置错
误。对于这种情况Apache 启动时会给出相关提示信息,如下所示。

# ./apachectl start
Syntax error on line 42 of /usr/local/apache/conf/httpd.conf:
Port must be specified 用户可根据提示信息更改httpd.conf 中的配置以修复错误。第二种是Apache 的监听端
口被占用。Apache 的默认监听端口为80,如果其他进程已经占用该端口,Apache 启动时
将会出现错误,如下所示。

(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down Unable to open logs

用户可通过netstat -an 命令获取系统当前的端口使用情况,关闭占用端口的进程。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics