根据著名的WWW服务器调查公司所作的调查,世界上百分之五十以上的WWW服务
器都在使用Apache,是世界排名第一的WEB服务器。Apache的诞生极富有戏剧性。
当NCSA WWW服务器项目停顿后,那些使用NCSA WWW服务器的人们开始交换他们
用于该服务器的补丁程序,他们也很快认识到成立管理这些补丁程序的论坛是
必要的。就这样,诞生了Apache Group,后来这个团体在NCSA的基础上创建了
Apache。
Apache的主要特征是:
. 可以运行上所有计算机平台;
. 支持最新的HTTP 1.1协议;
. 简单而强有力的基于文件的配置;
. 支持通用网关接口CGI;
. 支持虚拟主机;
. 支持HTTP认证;
. 集成Perl脚本编程语言;
. 集成的代理服务器;
. 具有可定制的服务器日志;
. 支持服务器端包含命令(SSI)
. 支持安全Socket层(SSL)
. 用户会话过程的跟踪能力;
. 支持FastCGI;
. 支持Java Servlets。
安装Apache
下面我们就开始漫漫征服Apache之旅,通过循序渐进的需求实例,一步步
地学习使用Apache,从入门到精通。
系统需求
运行Apache不需要太多的计算资源。它在有6-10MB硬盘空间和8MB RAM的
Linux系统上运行得很好。然而,只运行Apache可能不是你想做的事情。更可能
的是,你想运行Apache来提供WWW服务、启动CGI进程以及充分利用所有WWW能够
提供的令人惊奇的功能。在这种情况下,你需要提供反映负载要求的额外的磁
盘空间和内存空间。也就是说,如果仅仅是启动WWW服务并不需要太多的系统资
源,但是想要能为大量的客户提供服务就需要更多的系统资源。
安装软件
你可以通过以下三种方法安装Apache服务器。
1.如果你安装的Linux版本中带用Apache的话,就在选择所要安装的服务
器的时候,将httpd这个服务选上,Linux安装程序将自动完成Apache的安装工
作,并做好基本的配置。
2.使用可执行文件软件包,这比较适合那些对编译工作不是太熟悉的初级
用户,因为它相对比较简单。
下载软件包apache_1.2.4.e.tar.gz
tar xvzf apache_1.2.4.e.tar.gz
这就完成了安装工作,简单吧!
如果你使用的是RedHat Linux的话,你也可以下载apache_1.2.4.rpm软件
安装包,然后使用rpm -ivh apache_1.2.4.rpm命令安装。
3.如果你想把Apache服务器充分利用起来的话,就一定要自己编译
Apache定制其功能。
下载包含Apache源代码的软件包apache_1.2.4.tar.gz; 然后用tar命令将它解
开; 将当前目录改变为Apache源代码发行版的src目录; 将配置样本文件
(Configuration.tmpl)复制为Configuration文件;
编辑Configuration文件中的配置选项:
Makefile配置选项:一些编译选项:
. "CC="一行指定用什么编译软件编译,一般为"CC=gcc";
. 如果需要将额外的标志(参数)指定给C编译软件,可以使用:
EXTRA_CFLAGS=
EXTRA_LFLAGS=
. 如果系统需要特殊的库和包含文件,可以在这里指定它们:
EXTRA_LIBS=
EXTRA_INCLUDES=
. 如果你要改变代码优化设置的话,你须将下面一句去掉注释,然
后改成你所需要的值:
#OPTIM=-O2
Rule配置选项:用来决定需要什么功能,一般情况下无需改变。
模块配置:模块是Apache的组成部分,它为Apache内核增加新功能。通过使用
模块配置,可以自定义在Apache服务器中需要什么功能,这个部分也是Apache
灵活性的表现。模块配置行如下所示:
AddModule modules/standard/mod_env.o
如果你需要Apache服务器具备什么功能,就将那个模块用AddModule语句加到配
置文件Configuration中去。
下表列出了Apache的模块功能:
模块名 功能 缺省
mod_access 提供基于主机的访问控制命令 y
mod_actions 能够运行基于MIME类型的CGI脚本或HTTP请求方法 y
mod_alias 能执行URL重定向服务 y
mod_asis 使文档能在没有HTTP头标的情况下被发送到客户端 y
mod_auth 支持使用存储在文本文件中的用户名、口令实现认证 y
mod_auth_dbm 支持使用DBM文件存储基本HTTP认证 n
mod_auth_mysql 支持使用MySQL数据库实现基本HTTP认证 n
mod_auth_anon 允许以匿名方式访问需要认证的区域 y
mod_auth_external支持使用第三方认证 n
mod_autoindex 当缺少索引文件时,自动生成动态目录列表 y
mod_cern_meta 提供对元信息的支持 n
mod_cgi 支持CGI y
mod_dir 能够重定向任何对不包括尾部斜杠字符命令的请求 y
mod_env 使你能够将环境变量传递给CGI或SSI脚本 n
mod_expires 让你确定Apache在服务器响应请求时如何处理Expires y
mod_headers 能够操作HTTP应答头标 y
mod_imap 提供图形映射支持 n
mod_include 使支持SSI n
mod_info 对服务器配置提供了全面的描述 y
mod_log_agent 允许在单独的日志文件中存储用户代理的信息 n
mod_log_config 支持记录日志 y
mod_log_referer 提供了将请求中的Referer头标写入日志的功能 n
mod_mime 用来向客户端提供有关文档的元信息 y
mod_negotiation 提供了对内容协商的支持 y
mod_setenvif 使你能够创建定制环境变量 y
mod_speling 使你能够处理含有拼写错误或大小写错误的URL请求 n
mod_status 允许管理员通过WEB管理Apache y
mod_unique_id 为每个请求提供在非常特殊的条件下保证是唯一的标识 n
在src目录下执行:". /configure";
编译Apache:执行命令"make";
根据机器性能的不同,经历一段5-30分钟的编译,就大功告成了。
将编译好的可执行文件httpd复制到/etc/httpd/bin目录下;
将Apache发行版的配置文件:access.conf、httpd.conf、mime.types、
srm.conf文件复制到/etc/httpd/conf目录下。到此为止,安装完成。
一些说明
在Red Hat Linux 6.0中,Apache将自己的所有配置文件和日志文件放在了
"/etc/httpd"目录下,其中"/etc/httpd/conf"下为配置文
件,"/etc/httpd/log"下为日志文件。
同时,它将建立"/home/httpd"目录,并在其下建立三个子目录:"html/":在
这个目录下存放HTML(主页)文件;"cgi-bin/":在这个目录下可以存放一些
CGI程序;"icons/":在这个目录下是服务器自带的一些图标。
配置Apache基础篇,让WWW服务器跑起来
Apache 服务器软件的配置文件主要有:"access.conf":用于设置系统中的存
取方式和环境;"httpd.conf":用于设置服务器启动的基本环境;
"srm.conf":主要用于做文件资源上的设定;"mime.type":记录Apache服务器
所能识别的MIME格式。
在具体讲解之前,我们必须告诉大家,Apache已经在安装时就采用了一系列的
缺省值,已经让WWW服务器跑起来了。你只需要将装上Linux+Apache的主机联入
Internet,然后将主页存放到"/home/httpd"目录下即可。
下面介绍一些最主要的配置选项的含义,以便大家用最小的精力、最小的配置
准备好服务器。
httpd.conf
tpd.conf是主配置文件。它告诉服务器将如何运行。
一、最重要的配置选项ServerType standalone | inetd
这个配置选项指定如何运行WEB服务器。Apache可以使用两种方法来运行服
务器:standalone(独立的)和inetd(由inetd运行的)。standalone参数表示
WEB服务进程以一个单独的守候进程的方式在后台侦听是否有客户端的请求,如
果有就生成一个子进程来为其服务。 inetd参数表示WEB服务不是以一个单独的
守候进程的形式支持。而是由Inetd这个超级服务器守候进程进行代劳,当它收
到一个客户端的WEB服务请求的时候,再启动一个WEB服务进程为其服务。从功
能的角度看,这两种方法几乎是相同的。但它们之间实际有很大区别,区别在
于服务器的性能。一个由 inted运行的服务器进程在它结束对请求服务的同时
立刻退出。而在standalone模式下,子WWW服务器进程在退出之前要挂起一段时
间,这就给它们提供了机会,可以重新用来服务新的请求。
在standalone模式下,不存在对每个请求启动新进程的开销,所以它的效率更
高;而inetd模式被认为比standalone模式更具安全性。
standalone模式:
此种模式下,WWW服务器侦听特定端口的连接请求。当客户机发出到特定端口地
址的连接请求时,主服务器进程启动子WWW服务进程来服务该请求。另外还需要
告诉主服务器进程侦听的特定端口地址,使用命令:
Port [number] (缺省值为80)
inetd模式
inetd 是侦听有小于1024的端口连接请求的Internet守护进程(一个服务器进
程)。与前面的方法不同,当客户系统发出到WWW服务器的连接请求时, inetd
启动一个WWW服务器进程,由此进程服务此请求,完成服务后即退出。如果选择
通过inetd服务器来运行Apache,需要编辑 /etc/inetd.conf文件为Apache添加
一条新的记录:
httpd stream tcp nowait httpd /etc/httpd/bin/httpd -f
/etc/httpd/conf/httpd.conf
修改了/etc/inetd.conf文件后,就需要修改/etc/services中添加一行
httpd 80/tcp httpd
做完以上修改后,需要重新启动inetd进程。首先,使用以下命令取得inetd的
进程ID:
ps auxw |grep inetd
然后执行命令:kill -HUP
在RedHat Linux中,默认是采用inetd服务器来运行Apache,所以只要你在安装
时选择了httpd,以上工作在安装时就已经代你完成了。
二、其它配置选项
Server Admin命令,用来设置WEB管理员的E-Mail地址。这个地址会出现在
系统连接出错的时候,以便访问者能够将情况及时地告知WEB管理员。
命令格式: Server Admin [you E-Mail address]
例:Server Admin
ErrorLog命令,用来指定错误记录文件名称和路径。
命令格式: ErrorLog [log filename]
例:ErrorLog /var/httpd/error.log
Timeout命令,只要客户端超过这里设定的秒数还没有完成一个请求的话,服务
端将终止这次请求服务。如果网络速度较慢的话,建议在此设置较大的数值。
以给客户端更多机会。
命令格式: Timeout [second]
例:Timeout 120
ServerRoot命令,它指定在何处保存服务器的配置、错误及日志文件。
命令格式: ServerRoot [fully qualified path name]
例:ServerRoot /etc/httpd
ServerName命令,它配置服务器的Internet主机名
命令格式: ServerName [host name]
例:ServerName
srm.conf
srm.conf是资源配置文件,用它来告诉服务器你想在WWW站点上提供什么资源以
及在哪里和如何提供们。
DocumentRoot命令,用来指定主文档的地址。
命令格式: DocumentRoot [Path]
例:DocumentRoot /home/httpd/html
UserDir 命令,用来指定个人主页的位置。如果你有一个用户test,那么它主
目录是"/home/test",当客户端输入"http: //yourdomain/~test";;,系统就
会到对应的目录"/home/test/UserDir/"中去寻找。其中"UserDir"就是在
UserDir命令中设置的指定目录。
命令格式: UserDir [Path]
例: UserDir Public_html
DirectoryIndex 命令,用来声明首页文件名称。一般地,我们使用
"index.html"或"index.htm"作为首页的文件名。如果这样设置后,那么客户端
发出 WEB服务请求时,将首先调入的主页是在指定目录下文?quot;index.html"或
"index.htm"。
命令格式: DirecotryIndex [filename]
例:DirecotryIndex index.html index.htm
ScriptAlias命令,为脚本程序目录起个别名,具体可见4.7小节。
命令格式: ScriptAlias [/alias/] [fullly qualified path for script
directory]
例: ScriptAlias /cgi-bin/ /home/httpd/cgi-bin
access.conf的配置
access.conf文件用来设置WWW站点上诸如文件、目录和脚本项目的访问权限。
该文件的第一段非注释部分如下:
Option Indexes Includes ExecCGI FollowSymLink
AllowOverride None
Order allow , deny
allow from all
大家应该注意到,这一个部分是以开始,以
结束的。这表示在其中间的部分都是针对指定目录
"/home/httpd/html"而言的。
1.Option命令有很多的参数,各个参数的意义如下所示:
All 准许以下所有功能(MultiViews除外);
MultiViews 准许内容协商的Multiviews;
Indexes 若该目录下无index文件,则准许显示该目录下的文件以供选择;
IncludesNOEXEC 准许SSI(Server-side Includes),但不可使用#exec和
#include功能;
Includes 准许SSI;
FollowSymLinks 准许符号链接到其他目录;
ExecCGI 准许该目录下可以使用CGI。
2.而AllowOverride命令则是用来决定是否准许在"access.conf"文件中设定的
权限是否可以被在文件".htaccess"中设定的权限覆盖。它有两个参数:
All 准许覆盖;
None 不准许覆盖。
3.Order命令:用来设定谁能从这个服务器取得控制。它也有两个参数:
allow 可以取得控制;
deny 禁止取得控制。
现在我们一起来看看关于目录"/home/httpd/html"的设置的含义:它使得这个
目录,如果不存在index.htm文件时,列出目录信息以供选择,准许SSI,允许
执行CGI程序,开启了动态连接。它不允许再使用在文件".htaccess"中设定来
覆盖这里所设置的权限。使所有的人都可以取得控制。
该文件的第二段非注释部分如下:
Option ExecCGI
AllowOverride None
这个表示目录"/home/httpd/cgi"的设置为,当前目录下可以执行CGI程序。不
允许再使用在文件".htaccess"中设定来覆盖这里所设置的权限。
需要说明的是,不同的LINUX系统中,可以在这个文件中看到的信息不完全相
同,但是根据这里给出的信息,大家可以参照命令的解释自行理解文件中的设
置,以及根据自己的需要进行相应的修改。
4.4 使新的配置生效
在上面,我们可能已经根据新的需求更改了相应的配置选项,如果我们要使得
这个新的配置立即生效。我们就必须重新启动WEB服务进程。在LINUX中,我们
可以十分方便地使用命令行来使得WEB服务进程重启。
/etc/rc.d/init.d/httpd restart
五、为用户开辟个人主页空间
如果我们利用了LINUX系统架设了一台WEB服务器,我们不仅可以存放公司的主
页,而且还可以为公司的每一个员工提供一块个人主页的空间。
首先,为需要个人主页空间的员工在LINUX上开设一个帐号。这样,它就拥有了
一个用户主目录"/home/用户帐号名"。
addusr 用户帐号名
passwd 用户帐号名
在用户主目录下建立一个目录"public_html",然后为其设置相应的权限。
cd ~用户帐号名
mkdir public_html
chmod 755 public_html
确认在srm.conf文件中的UserDir命令设置的是public_html目录。让员工将自
己的个人主页上传到自己用户主目录下的public_html目录中。
现在就可以使用"~用户帐号名"来访问员工的个人主
页了。
用Apache实现虚拟主机服务
什么是虚拟主机服务
所谓的虚拟主机服务就是指将一台机器虚拟成多台WEB服务器。举个例子来
说,一家公司想从事提供主机代管服务,它为其它企业提供WEB服务。那么它肯
定不是为每一家企业都各准备一台物理上的服务器,而是用一台功能较强大的
大型服务器,然后用虚拟主机的形式,提供多个企业的WEB服务,虽然所有的
WEB服务就是这台服务器提供的,但是让访问者看起来却是在不同的服务器上获
得WEB服务一样。
具体地说,就是,我们可以利用虚拟主机服务将两个不同
的主页内容都存放在同一台主机上。而访
问者只需输入公司的域名就可以访问到它想得到的主页内容。 用Apache设置虚
拟主机服务通常可以采用两种方案:基于IP地址的虚拟主机和基于名字的虚拟
主机,下面我们分别介绍一下它们的实现方法。以便大家在具体的应用中能够
选择最合适的实现方法。
设置实现基于IP地址的虚拟主机服务实现前提
这种方式需要在机器上设置IP别名,也就是在一台机器的网卡上绑定多个
IP地址去为多个虚拟主机服务。而且要使用这项功能还要确定在你的LINUX内核
中必须支持IP别名的设置,否则你还必须重新编译内核。
下面举一个拥有两个虚拟主机的服务设置,以供参考。
2.配置步骤
假设,我们用来实现虚拟主机服务的机器,首先已经为自己提供了WEB服务,现
在将为新的一家提供虚拟主机服务。
规划IP地址:为虚拟主机申请新的IP地址。(假设本机IP地址为202.101.2.1)
202.101.2.2
2) 让ISP作好相应的域名解析工作。
3) 为网卡设置IP别名:
/sbin/ifconfig eth0:0 202.101.2.2 netmask 255.255.255.0
4) 重新设置"/etc/httpd/conf/httpd.conf",在文件中加入:
ServerAdmin
DocumentRoot /home/httpd/
ServerName
ErrorLog /var/log/httpd//error.log
5)建立相应的目录。
mkdir /home/httpd/
mkdir /var/log/httpd//error.log
6)将相应的主页内容存放在相应的目录中即可。
3.不利因素
这种虚拟主机的实现方法有一个严重的不足,那就是,每增加一个虚拟主机,
就必须增加一个IP地址。而由于IP地址空间已经十分紧张,所以通常情况下是
无法取得这么多的IP地址的。而且从某种意义上说,这也是一种IP地址浪费。
设置实现基于名字的虚拟主机服务而基于名字的虚拟主机服务,是比较适合使
用的一种方案。因为它不需要更多的IP地址,而且配置简单,无须什么特殊的
软硬件支持。现代的浏览器大都支持这种虚拟主机的实现方法。当然,这也就
是指一些早期的客户端浏览器也许不支持这种虚拟主机的实现方法。
正是以上原因,我们没有理由不使用基于名字的虚拟主机服务而使用基于
IP地址的虚拟主机服务。配置基于名字的虚拟主机服务需要修改配置文
件?quot;/etc/httpd/conf/httpd.conf",在这个配置文件中增加以下内容。
NameVirtualHost 202.101.2.1
ServerAdmin
DocumentRoot /home/httpd/
ServerName
ErrorLog /var/log/httpd//error.log
ServerAdmin
DocumentRoot /home/httpd/
ServerName
ErrorLog /var/log/httpd//error.log
也就是在基于IP地址的配置基础上增加一句:NameVirtualHost
202.101.2.1而已。在本例中,为了体现只需要增加一次,所以特别地设置了两
个虚拟主机服务。
最后也是建立相应的目录,将主页内容放到相应的目录中去就可以了。
配置CGI
1. 什么是CGI
CGI是独立于语言的网关接口规范,它实际上可以用任何广泛流行的应用程序开
发语言来实现,包括C、C++、Perl、Shell脚本甚至Java。
WEB服务器从客户端得到某个URL,它告诉WEB服务器,必须运行一个CGI外部应
用程序。那么WEB服务器启动这一应用程序,等待它完成并返回输出结果。最
后,它将此应用程序的输出结果传输给另一端的WEB客户。
2. 为CGI配置Apache
那么如何使Apache能处理CGI请求呢?我们必须通过相应的配置过程告知
Apache在哪里存储CGI程序,指明CGI程序的扩展等,以下我们逐一介绍一下设
置的内容与步骤。
创建存储CGI程序的目录
创建集中的CGI程序目录只是建立CGI环境的开始。如果要考虑提高安全
性的话,应将集中的CGI程序目录保存在DocumnetRoot目录外,使得访问者不能
直接访问CGI程序。 第一步:在DocumentRoot目录外创建一个目录,然后将所
有的CGI程序都集中存放在这个目录下。例如,你可创建一个
/home/httpd/public/apps的目录作为CGI程序的大本营。
第二步:为CGI程序目录创建别名,也就是编辑配置文件httpd.conf,加入:
ScriptAlias /cgi-bin/ /home/httpd/public/apps
这样做后,当客户时,WEB服务器就会自动执行
WEB服务器上的/home/httpd/public/apps/li.cgi文件。
第三步:为CGI目录设置合适的权限,一般是只允许Apache有读取和执行的权限
但没有写的权限。
允许用户访问cgi-bin
我们已经在4.5小节中介绍了如何给用户开辟个人主页空间,但如果你的
用户需要使他的主页更具有活力,往往会向你申请cgi-bin访问服务。下面我们
就介绍一个Apache服务器为用户提供的两种cgi-bin访问方法。
1)使用Directory或DirectoryMatch容器
当在配置文件srm.conf中用UserDir命令被赋值为目录名称时,Apache就
把它作为用户WWW站点的顶层目录。例如:
UserDir Public_html
当Apache~user的请求,就到/home/user/Public_html取出主页发
送给客户。
如果要为每个用户添加CGI支持就在Apache的配置文件access.conf中添加下列
配置:
Options ExecCGI
AddHandler cgi-script .cgi .pl
注:将DirectoryMatch换成Directory亦可
在这种方法中,Apache服务请求翻译成为了
/home/user/Public_html/cgi-bin/,并允许执行任何带有正确扩展名(.cgi
或.pl)的CGI程序。
使用ScriptAliasMatch命令
通过使用ScriptAliasMatch命令,也可以为每个用户添加CGI支持。例如:
ScriptAliasMatch ~([a-z]+)/cgi-bin/(.*)
/home/$1/public_html/cgi-bin/$2
这个命令将用户名与$1相匹配,其中$1与~([a-z]+)相等。将/cgi-bin/后面的
任何内容与$2相匹配,其中$2与(.*)相等。
这个设置也就实现请求解释为:
/home/user/Public_html/cgi-bin/xxx.cgi
那么大家想一想,如果你想将这个请求解释为:
/home/httpd/public/apps/xxx.cgi
该如何设置呢?对,应该是:
ScriptAliasMatch ~([a-z]+)/cgi-bin/(.*) /home/httpd/public /apps/$2
3. Apache为CGI提供的环境变量
Apache服务器提供了许多环境变量可以用于CGI程序的编写,了解它们也一定有
助于写出充分利用Apache的CGI程序,所以在此也对此作一简单介绍。
服务器变量
服务器变量由Apache设置用来通知CGI程序有关Apache的情况。通过使
用这些变量,CGI程序能确定有关服务器的不同信息:Apache的版本,管理员的
E-Mail地址等。
SERVER_SOFTWARE
这个变量是WWW服务器Apache的版本号,它的值形如:Apache/Version,如
Apache/1.3;
GATEWAY_INTERFACE
这个变量的值是当前CGI规范的版本号,其值形如:CGI/1.1;
SERVER_ADMIN
如果在httpd.conf文件中有设置站点管理员的e-mail地址的话,这个变量就会
存放着这个e-mail地址;
DOCUMENT_ROOT
这个变量存放在是被访问的WWW站点的DocumentRoot命令指定的值。
客户请求变量
Apache提供的有关客户请求方的环境变量有许多,以下只是有选择性地介绍一
些最常见的。
SERVER_NAME
此变量可以告诉CGI程序它访问的是哪一个主机。这个值可以是IP地址也可以是
完整的主机名;
HTTP_ACCEPT
此变量被赋值为客户所能接受的MIME类型的列表,如:HTTP_ACCEPT=image/gif;
HTTP_ACCEPT_CHARSET
此变量被赋值为客户所能接受的字符集,如:
HTTP_ACCEPT_CHARASET=iso-8859-1.,*,utf-8;
HTTP_ACCEPT_LANGUAGE
此变量被赋值为客户所能接受的语言,如:HTTP_ACCEPT_LANGUAGE=en;
HTTP_ACCEPT_AGENT
这个变量指定发出请求的系统正在运行的浏览器类型和操作系统;
HTTP_PORT:服务端口;
REMOTE_HOST:客户端的IP地址或IP名称信息;
REMOTE_PORT:客户端的端口号;
4. 一点提示
若干年来,通过网关接口(CGI)已成为服务器端应用程序开发的事实标准。但
随着时间的推移,发现在沉重的CGI负担下许多WWW服务器系统的表现不尽人意。
这是因为CGI规范存在瓶颈问题:每当客户系统请求CGI应用程序时,WWW服务器
就必须启动新的CGI进程,直到完成任务后结束进程。这在负载不高时,会工作
正常。但是,在高负载时,繁多的进程将成为性能的瓶颈问题。
所以现在开始出现新的标准来弥补这一不足,其中FastCGI是很有前途的一种新
的开放式标准。
你可以在Apache中通过添加mod_fastcgi.c模块来支持FastCGI。