python 模拟鼠标点击:Apache 服务器探秘
来源:百度文库 编辑:中财网 时间:2024/05/06 02:47:57
Apache 服务器探秘1
1.1 Apache服务器2
1.1.1 简介2
1.1.2 Apache服务器安装(linux/unix)2
1.2 Apache服务器的配置4
1.2.1. httpd.conf5
1.2.2. access.conf7
1.2.3. srm.conf7
1.3 Apache服务器功能介绍9
1.3.1 服务器控制9
1.启动服务器10
2.停止服务器10
3.重启动服务器10
4.获得服务器的状态10
5.查看服务器配置文件11
6.测试Apache Server11
1.3.2访问控制11
1.Options11
2.AllowOverride12
3.;13
1.3.3 根据客户主机名或IP地址限制访问13
1.Allow13
2.Deny14
3.Order14
1.3.4 使用用户认证来限制某些文档的访问14
1.3.5 用户web目录16
1.3.6 虚拟主机17
1.4 Apache服务器的其他服务20
1.4.1 CGI 脚本(php、perl)20
1.CGI配置20
2.CGI程序的调试21
1.4.2 Apache的proxy服务21
代理模块的编译21
代理模块的指令集22
代理服务器的配置24
1.5 Apache常见故障排除25
Apache 服务器探秘
杜广达
内容提要
本文介绍了Linux的Web服务器——Apache服务器。在互联网飞速发展的今天,Web功能的使用与开发已经成为操作系统不可缺少的配套部分。Apache是常见的支持HTTP协议的Web服务器之一,也是使用最广泛的Web服务器。本文将帮助你在自己的Linux系统中配置自己Web服务器。
本文主要介绍了以下内容:
lApache服务器安装
lApache服务器配置文件
lApache服务器功能介绍
lApache服务器的CGI和proxy服务
lApache服务器的常见故障排除
关键字:
Apache,Web 服务器,Linux
1.1 Apache服务器
1.1.1 简介
Apache是常见的支持HTTP协议的Web服务器之一,也是使用最广泛的Web服务器。截止到1999年1月,世界上大约有超过300万台Internet服务器使用的是Apache Server。
Apache Server的主要特点是稳定性高、速度快、功能多。通过第三方的评测,Apache Server比大多数的Web服务器都快。
Apache 服务器既是一种软件,又是一个工程。它是由千千万万的服务器代码和文档开发者共同努力的结果。在1995年4月,公开发行了第一套Apache Server,版本号是0.6.2。Apache Server的名字来源于“A PatCHy Server”。现在最新的版本是1.3.12。
前不久,我国将Linux操作系统正式确定为重点发展方向。Apache Server以其对UNIX和Linux的最好支持,使它必定成为我国今后Web服务器的主流。
1.1.2 Apache服务器安装(linux/unix)
通常来说,大家在安装linux时可以选择安装WEB SERVER ,并在INTERNET SERVICES中开启httpd这一项服务,这样系统就会自动的安装好apache,并且在系统第一次启动时启动httpd进程。在作好一些相应的配置后,在你的Xwindows环境下打开NETSCAPE或IE,并在URL中填入localhost 或本机的IP地址,就会访问到apache的默认的页面。
如果说你没有安装WEB SERVER ,你可以重新安装Linux并选择UPDATE,挑选apache的软件包安装到本机。当然,如果你想要安装最新的版本,可以到http://www.apache.org/ 网站上去下载最新的版本。我们假设你已经将源代码拷贝到一个目录下。这时可以人工配置或使用APACI的自动配置界面。这里我们详细介绍后者。
在源代码的根目录 中,你会找到一个叫做configure的脚本,该脚本是使用APACI配置Apache所必须的。你可以通过在该脚本后加“--help”来取得帮助:
./configure --help
在配置时所做的第一步是决定其安装位置。Apache默认的安装路径是/usrlocal/apache。但你也可以自行指定安装位置。例如,你可以运行下面的命令来将Apache安装在一个叫做 /usr/apache的目录下:
./configure --prefix=/usr/apache
该脚本会将所有的Apache文件安装在指定的目录下。你也可以使用 --prefix 选项将指定类型的文件定位到其他目录。具体prefix选项请参看表1-1:
选项名功 能
Binddir=DIR把可执行文件安装在指定DIR目录下
Compat按照Apache1.2安装路径安装
Datadir=DIR把只读数据文件安装在指定DIR目录下
Exec-prefix=DIR把依赖于结构的文件安装在指定DIR目录下
Includedir=DIR把包含文件安装在指定DIR目录下
Libexecdir=DIR把可执行程序安装在指定DIR目录下
Layout列出详细的安装路径的目录结构
Localstatedir=DIR把可修改数据文件安装在指定DIR目录下
Logfiledir=DIR把日志文件安装在指定DIR目录下
Mandir=DIR把人工页面安装在指定DIR目录下
Proxycachedir=DIR把代理缓存数据安装在指定DIR目录下
Runtimedir=DIR把运行时数据文件安装在指定DIR目录下
Sbindir=DIR把系统管理员可执行文件安装在指定DIR目录下
Sysconfdir=DIR把配置文件安装在指定DIR目录下
表1-1 configure脚本prefix选项列表
接下来是决定是否使用Apache开发人员提供的标准模板配置。如果你第一次编译Apache,那么推荐使用标准配置来熟悉整个过程。基于APACI配置的标准(或缺省)的配置文件是存储在src子目录下的Configuration.apaci。该文件中,有5种行类型:
注释行:
以“#”符号作为起始字符的行,用于描述信息和屏蔽那些不希望设置的选项。例如:
#Rule SHARED_CORE=default
Makefile选项行:
指类似于“CC=gcc”的行。用于指定生成的Makefile文件中的选项。例如:
EXTRA_CFLAGS=’$(SRCDIR)/apaci’
规则行:
以“Rule”开头的行。用于控制Configure怎样创建Makefile文件。例如:
Rule SOCKS4=no
模块选择行:
以“AddModule”开头的行。用于增加模块。例如:
AddModule modules /standard/mod_cgi.o
可选模块选择行:
以“%Module”开头的行。把某些模块编译到Apache里但不激活。
如果你需要修改Configuration.apaci文件的内容,你不必要直接修改该文件。本文建议通过使用配置脚本来完成。例如,通过以下脚本来使能、使非规则:
./configure --prefix=/usr/apache --enable-rule=SOCKS4
./configure --prefix=/usr/apache --disable-rule=SOCKS4
同理可以使用, -enable-module ,-disable-module来使能、使非模块:
./configure --prefix=/usr/apache --enable-module=cgi
./configure --prefix=/usr/apache --disable-module=cgi
在成功的运行上面介绍的脚本后,你已经可以编译并安装Apache了。从Apache源代码目录的根目录下执行make命令来编译Apache源程序。如果成功将产生WWW服务器的可执行二进制文件httpd。在没有任何错误信息的情况下,你可以运行make install命令来安装Apache。否则,请查看错误信息并重新按配置步骤运行一遍。
只要你已经编译并安装了Apache,你就可以运行make clean来删除任何在编译时创建的对象文件。
1.2 Apache服务器的配置
每个Apache发布的源代码中都包括下面的缺省配置文件:
laccess.conf
lhttpd.conf
lsrm.conf
lmagic
lmime.types
后两个文件在大多数情况下应给予保留。magic文件是用在一个叫做mod_mime_magic的特定模块中的,mime.types文件是控制对于一个给定的文件扩展名来说将何种类型的MIME发送给用户。
我们需要定制的文件是httpd.conf、access.conf、srm.conf。它们有相同的结构,你可以将所有的指令放在httpd.conf文件里而将另外两个文件置空。在最新版本中,仅保留了httpd.conf文件。不论是只需要修改一个配置文件还是三个配置文件都要修改,其具体步骤内容都是完全一致的。本文仍介绍具有三个配置文件的Apache版本。
在正式开始之前,我们先来介绍以下Apache配置文件的格式。这些配置文件有两种类型的信息:可选注释和服务器指令。第一个字符为“#”符号的是注释行,它们对服务器软件不起作用,服务器在对这些文件进行语法分析时会忽略掉所有的注释行;除了注释和空行外,服务器把其他的行认为是完整的或部分的指令。指令又分成与shell命令类似的命令和伪HTML标记。例如:
Directive argument argument#与shell命令类似的命令
;#伪HTML标记
Port 80#与shell命令类似的命令
;#伪HTML标记
与HTML不同,伪HTML标记必须各占一行。我们可以把命令组成一组放在某个伪HTML标记中,象上面那样。
下面针对每个配置文件介绍各指令的含义。
1.2.1. httpd.conf
清单1-1给出了本节要介绍的命令在httpd.conf文件中的缺省用法。
清单1-1 httpd.conf命令举例
ServerTypestandalone
Port80
Usernobody
Group nobody
ServerName 202.204.3.16
ServerAdmin cuckoodoo@venus.bupt.edu.cn
ServerRoot "/www"
ErrorLog /www/logs/error_log
Timeout 300
PidFile /www/logs/httpd.pid
KeepAlive On
KeepAliveTimeout 15
MaxClients 150
MaxKeepAliveRequests 100
MinSpareServers 5
StartServers 5
ServerType
此指令指定Web服务器以何种方式工作。有两个值可供选择standalone 和inetd 。Standalone表示你的httpd进程是以一个单独的守护进程(daemon)的方式在后台侦听是否有客户端的请求,启动httpd的命令将加进系统启动脚本文件/etc/rc.d/rcX.d中;Inetd表示你的httpd进程不是以守护进程(daemon)的方式运行,而是由Inetd 这个 internet services的进程侦听,一旦有客户的请求,它会自动的启动httpd这个进程来提供相应的服务。对这种方式,启动httpd的命令将加进/etc/inetd.conf文件中。
因为在standalone方式下,为每个请求装载一个新进程的负载几乎不存在,所以此种方式更高效。因此,此指令默认的是Standalone方式,对于一个比较繁忙的网站,本文建议您选择Standalone方式启动httpd。
Port
你分配给你的WEB SERVER 的端口号。此指令仅对Standalone方式启动的服务器有意义。
Httpd 的默认端口是80,也可以分配给自己的WEB SERVER 一个大于1024 的端口号。如果你这样做,你必须在你的URL后面跟上你的端口号才能访问到你的页面。比如你分配给你的服务的端口号是8888,那么你访问时需要输入
http://domainname:8888
User和Group
象Port指令一样,这两条指令仅对standalone服务器有意义。
这两条指令分别指定httpd提供服务的子进程的用户标识(UID)和组标识(GID)。当主Web服务器进程调用一个子服务器来完成一个请求时,主Web服务器进程根据这些指令的设置的值修改子进程的UID和GID。
为了安全原因,本文推荐你以属于一个具有非常低权限的组的、具有非常低权限的用户方式运行子服务器进程。在大多数UNIX系统中,用户名nobody以及nogroup组具有最低权限。
ServerName
你机子的名称,如果你有域名,填入你本机的域名。如果没有,就填入你的主机名或IP地址。
ServerAdmin
服务管理员的email 地址,默认的是本机的root用户,所以是root@localhost。当服务器产生一个错误时,该email地址会显示出来。
ServerRoot
用来存放服务的配置、出错和记录文件的最底层的目录。如果你使用APACI接口编译和安装Apache,那么缺省ServerRoot为你在配置脚本中提供的prefix值;否则,你需要修改缺省值为一个合适的目录。
ErrorLog
用来存放你WEB SERVER的出错信息的文件。如果你将该指令设置为一个相对路径(即路径不是以“/”开头),那么这个路径就被认为是相对于ServerRoot目录的。
不管你将日志放在什么地方,你应该确信只有主服务器进程对该目录有写的权限。允许其他用户对该日志目录有写的权限意味着某些人会未经许可就获得了你的主Web服务器进程的UID,一般这个UID就是root帐户。
Timeout
设置服务器等待的最大时间值,服务器等待下列事件:接受GET请求;接收TCP/IP包文确认;接收POST或PUT请求。
注意:下面介绍的指令仅用于standalone服务器。
PidFile
该指令指定的文件存放了httpd进程的进程号。
KeepAlive
有两个可选值:on 或off。该指令指定是否支持永久性连接。使用永久性连接允许多个请求在同一个TCP连接上发送,在某些情况下,如果一个HTML文档有大量的图象,则可以降低大约50%的通信延迟。
KeepAliveTimeout
规定了服务器在断开与客户机的连接之前等待下一个请求的最大时间。
默认值是15秒。
MaxClients
本指令指定允许的最大客户个数。默认值是150个。最大的可能值是256个。如果你想处理多于256个同时连接,则需要修改src/include/httpd.h的标题头文件并将HARD_SERVER_LIMIT常量设置为你所希望的限制值。在对新服务器重新编译之后,你就可以将此指令设置为所期望的限制值。
MaxKeepAliveRequests
规定了每个KeepAlive连接所服务的最大请求数。
StartServers
设置了Apache在一开始所启动的子服务器进程的初始数目。
通常上面的参数的默认值是不用改的,但是如果你同时在一台机子上开几个WEB SERVER 时要注意:第一,你要给每一个WEB SERVER 分配不同的port 号;第二,要分别指定他们的errorlog文件和pidfile文件;第三,不懂的参数不要随意改动,即使改动也要一次改一个,并留有记录以便恢复。
1.2.2. access.conf
清单1-2给出了本节要介绍的命令在access.conf文件中的缺省用法。
清单1-2 access.conf命令举例
;
Options Indexes IncludesNOEXEC
AllowOverride None
;
;
AllowOverride None
Options ExecCGI
;
本节介绍的命令主要是用于对目录的功能和访问的控制的设定。下面我针对默认的页面的配置文件进行说明。
该清单由两个; ;对组成。;和 ;是用来将一组指令包含在一起。所包含的指令的范围在所指定的目录路径(及子目录)中有效。第一部分是以;开头,以 ;结束的。其中开头的部分Directory /home表示下面的设定是针对 /home 目录的。而指令Options和AllowOverride请参看本文后面的部分(1.3.2根据主机名或IP地址访问)。
第二部分表示对目录/home/httpd/cgi-bin 不进行访问控制,允许执行CGI程序。这就表明这是一个用来存放CGI程序的目录。
1.2.3. srm.conf
清单1-3给出了本节要介绍的命令在srm文件中的缺省用法。
清单1-3 srm.conf命令举例
DocumentRoot /www/docs/
UserDirPublic_html
DirectoryIndex index.htm index.html index.php index.php3
AccessFileName .htaccess
Alias /rfc/ "/home/share/RFC_2000.3.17/"
ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"
AddHandler cgi-script .cgi
该此文件告诉服务器你想从你的Web服务器提供何种资源,以及从哪里、如何提供这些资源。下面介绍此文件中经常涉及的指令:
DocumentRoot
用来指定主文档的地址。缺省值通常设置为Apache自己的htdocs目录。建议如本例一样将此命令指向你的文件系统的一个指定的子目录。在本例中,对应于文件http://202.204.3.16/index.html的请求,将对应到文件/www/docs/index.html。
UserDir
用来指定个人主页的位置。如果你有一个用户的home目录为 /home/cuckoodoo当在URL中输入 http://yourdomain/~cuckoodoo 系统就会到 /home/cuckoodoo/XXX/中去取这个用户的个人主页。其中“XXX”为UserDir 所指定的目录。
此命令仅用于在系统中你有多个用户,并且你希望每个用户都有他(她)自己的Web目录。缺省值是public_html。
DirectoryIndex
用来声明查找的索引文件的名称。本例告诉Web服务器应该查找列表中的四个文件,如果发现其中之一存在,便将其返回给请求方Web客户机。注意:在索引列表中列举大量的文件会造成两个问题。一个是,服务器不得不为每个目录请求查找是否存在众多的文件,这会降低服务器的速度;另一方面,从管理者的角度看,将多文件作为索引不便于对站点的管理。
AccessFileName
指定存取控制文件名,如果某个目录下存在该文件,那么这个文件规定了该目录的存取控制信息。当服务器给用户返回文档之前,它依照该文档路径读取第一个被激活的存取控制文件,根据其中的指令对文档进行存取控制。
默认值是.htacess文件。如果你要改变这个名字,建议你的新文件名以“.”开始,这样的文件名不会在目录清单中被列出来。
注意:缺省access.conf文件禁止Apache搜寻任何目录级访问控制文件。如果你要使用该文件,那么必须对access.conf文件进行修改。例如,缺省access.conf文件有下面的配置段:
;
Options FollowSymLinks
AllowOverrideNone
;
这个配置使用AllowOverride 指令来禁止Apache搜索AccessFileName所指定的文件。如果你希望允许Apache搜索一个在你的站点的某个子目录中的访问控制文件,可以使用如下配置:
;
Options FollowSymLinks
AllowOverrideAll
;
这个配置允许你拥有在/path/to/your/dir目录中或任何该目录的子目录中的.htacess访问控制文件。它允许你覆盖所有允许的指令。
Alias
建立真实目录的别名,使文件可以存放到DocumentRoot指令指定目录以外的其他目录中。如:
Alias /images /ftp/pub/image
则对于http://myserver/images/txd.gif文件的存取将向用户返回/ftp/pub/image/txd.gif文件。
ScriptAlias
指定服务器使用的CGI脚本所在的目录。像Alias一样,它给真实目录取别名。因为CGI脚本是用来执行的,所以包含CGI脚本的目录不应放在文档根目录下。这样做的目的是处于安全的考虑的。将这些脚本放在一个大家都可以访问到的目录下,会使任何人都可以不经允许查看你的脚本,并找到脚本中的致命弱点。而使用本命令,使服务器对ScriptAlias 指定的目录的请求并不是以发送所请求的文件的内容来服务的。被请求的文件是作为一个脚本来执行,将该脚本的执行结果返回给客户机。
语法:ScriptAlias 虚拟目录 真实目录
AddHandler
指定具有哪些扩展名的文件是某类处理程序。
语法:AddHandler 处理程序名 扩展名1…扩展名n
1.3 Apache服务器功能介绍
1.3.1 服务器控制
在发布的Apache 1.3.x产品中包含有一个叫做apachectl的shell脚本,用来在很多方面控制服务器。在此详细介绍此脚本的使用。在使用此脚本前,你必须已经是你的系统的超级用户,除非你已经配置你的Apache运行在高于1023端口上工作。
注意,如果你已经正确的为httpd 安装了inetd配置,那么你就不必做任何事情来启动和停止Apache服务器,因为当服务器接到HTTP端口请求时,inetd会自动运行Apache服务器。
1.启动服务器
运行下面的脚本启动服务器:
/你安装的Apache的bin目录/apachectl start
你如果不使用完全路径(以/开头的路径),则必须先到你安装的Apache的bin目录下,然后以该目录为当前目录,使用如下指令:
./apachectl start
如果你希望在系统重新启动后Apache服务器会自动启动,需要将上面的命令添加到/etc/rc.local或者在你的rc.d目录的类似文件中。
你也可以使用带 -f选项的httpd命令,并在后面跟上httpd.conf文件,来启动Apache服务器,例如:
httpd –f /你安装Apache的目录/conf/httpd.conf
2.停止服务器
运行下面的脚本停止服务器:
/你安装的Apache的bin目录/apachectl stop
3.重启动服务器
运行下面的脚本来重启动服务器:
/你安装的Apache的bin目录/apachectl restart
如果想执行一个更好的重启动,可以运行下面的脚本
/你安装的Apache的bin目录/apachectl graceful
此脚本运行时,首先restart 命令向Apache 发送一个SIGHUP信号,而后 graceful命令向Apache 发送一个SIGUSR1信号。因为后者是用户定义的(即由Apache开发者定义的),所以graceful命令更适合用来运行服务器。
4.获得服务器的状态
在你可以得到服务器的完整状态之前,你需要确信你已经将Lynx基于文本的Web浏览器安装在你的系统上。如果已安装了Lynx,你就可以通过运行下面的apachectl脚本来获得所运行的服务器的完整状态:
/你安装的Apache的bin目录/apachectl fullstatus
这样你就会得到一个充满了各种服务器状态数据的信息页。最好是将这个状态信息重定向到一个文件中,因为文件可以将数据完好的保存下来。你可以通过下面的指令将数据重定向到一个叫做/tmp/status的文件中:
/你安装的Apache的bin目录/apachectl fullstatus >; /tmp/status
5.查看服务器配置文件
要想检查服务器配置文件有没有语法错误,你可以运行下面的apachectl脚本:
/你安装的Apache的bin目录/apachectl configtest
6.测试Apache Server
开启Web浏览器,并将其指向正运行着你新配置好的Apache服务器的Web站点。如果你所运行的Web浏览器和Apache运行在同一个系统上,那么可以使用下面的URL:
http://localhost/
但是,对于其他情况,你需要指定完整的主机名。
最后,你需要检查一下日志文件是否被正确的更新。要想查看日志文件,可以进入日志文件目录并运行下面的UNIX命令:
tail –f [/path /to /access_log]
命令中的 tail是一个UNIX工具,它使你可以查看一个不断增长的文件(当使用了-f选项时)。现在,用Web浏览器来访问该站点。如果你已经进入了该站点,那么只需刷新一下浏览器。你会看到一个输入被添加到屏幕上的清单里。多次点击刷新按钮,看看访问文件是否被正确更新。如果更新正确,表示访问日志文件工作正常。按Ctrl+C退出tail命令。如果没有在日志文件中看到新记录,你应该检查一下日志文件和其所保存在的目录的许可权设置。
同理,需要检查错误日志:
tail –f [/path /to /error_log]
如果所有的这些测试都成功了,那么就说明你已经成功的配置了你的Apache系统。
1.3.2访问控制
1.Options
语法:Options [+│-]option[+│-]option…
Options 指令控制在某一目录下可以具有哪些服务器特性。此命令设为None时,在它的使用环境里没有附加特性。可以设置的特性见表1-2。
属 性用 途
None不激活任何选项
All激活除MultiViews外的所有选项
ExecCGI允许执行CGI脚本
FollowSymLinks服务器在某目录下跟踪象征性连接
IncludesServer Side Include(SSI)命令允许标志
IncludesNOEXEC一系列受限制的SSI命令可以被嵌入SSI页里,但不能出现#exec和#include命令
Indexes如果被请求的对象是映射到某一目录的URL,并且在此目录下没有DirectoryIndex,那么服务器将返回目录的格式化列表
SymLinkIfOwnerMatch服务器只跟踪象征性连接,这些连接与目标文件或目录属于同一个用户
Multiviews根据文件的语言进行内容协商
表1-1 Options指令属性表
可以使用“+”和“-”号在Options指令里打开或取消某选项。如果不使用这两个符号,那么在容器中的Options值将完全覆盖以前的Options指令里的值。例如,要允许一个目录(例如:/www/cuckoodoo)执行CGI和SSI,则要在配置文件中加入下面指令:
;
Options +ExecCGI +Includes
;
当你使用多个Options命令时,应注意小环境里使用的Options比较大环境里使用的Options具有优先权。
2.AllowOverride
语法:AllowOverride override override
缺省值:AllowOverride all
此指令告诉服务器哪些在.htaccess文件(由AccessFileName指定)里声明的指令可以覆盖配置文件中在它们之前出现的指令。
如果Override设置为NONE,服务器将不去读AccessFileName指定的文件。这样可以加快服务器的响应时间,因为服务器不必对每一个请求去找AccessFileName指定的文件。表1-3列出了可以设置的选项。
表1-3 AllowOverride 指令选项表
属 性用 途
AuthConfig允许使用鉴权指令(如AuthName、require、AuthDBMGroupFile、AuthDBMUserFile、AuthGroupFile、AuthType、AuthUserFile)
FileInfo允许使用控制文件类型的指令(如AddEncoding、AddLanguage、DefaultType、LanguagePriority、AddType、ErrorDocument)
Indexes允许使用控制目录检索的指令(如AddIcon、AddDescription、AddIconByType、AddIconByEncoding、DefaultIcon、DirectoryIndex、FancyIndexing、HeaderName、IndexIgnore、IndexOptions、ReadmeName)
Limit允许使用控制主机访问的命令(如Allow、Deny、Order)
Options允许使用控制特定文件类型的指令(如Options、XbitHack)
3.;
语法:;… ;
这一容器包含了一组访问控制指令,这些指令只针对于所指定的HTTP方式。方式的名称列表可以时下面的一个或多个:GET、POST、PUT、DELETE、CONNECT、OPTIONS。如果使用GET,它还会影响到HEAD请求。如你想限制所有的方式,就不要在;指令里包含任何的方式名称。
这个容器不能被嵌套,;容器也不能在它内部出现。另外,方式名称不区分大小写。
1.3.3 根据客户主机名或IP地址限制访问
下面三条指令用于Apache的mod_access模块。使用它们能实现基于Web客户Internet主机名的访问控制。这里的主机名可以是一个完整的域名,也可以是一个IP地址。
1.Allow
语法:Allow from host1 host2 host3
用户可以通过该指令指定一个关于主机的列表,列表中可包含一个或多个主机名或IP地址,列表中的主机被允许可访问某一个特定的目录。当指定了多个主机名或IP地址时,它们中必须以空格符来分隔。表1-4列出了该指令的参数。在描述一栏针对Allow指令进行了解释。
参 数示 例描 述
ALLAllow from all允许所有主机访问站点
某主机的完全资格的域名Allow from www.cuckoo.comDeny from www.cuckoo.com仅由FQDN所指定的主机才被允许访问。
某主机的部分域名Allow from cuckoo.bupt.comDeny from cuckoo.bupt.com仅有那些符合部分域名的主机被允许访问。示例中,在.cuckoo.bupt.com网络中的所有主机都可以访问此站点。
某主机的完全IP地址Allow from 202.204.3.16Deny from 202.204.3.16仅有指定IP地址的主机才被允许访问站点。
部分IP地址Allow from 202.204.3Deny from 202.204.3当在Allow指令中IP地址的全部四个字节没有完全给出,则该部分IP地址根据从左到右的匹配原则,所有匹配该IP格式的主机被允许访问。本例中,所有在202.204.3.1到202.204.3.255的主机都可以访问。
网络/掩码Allow from202.204.3.0/255.255.255.192Deny from202.204.3.0/255.255.255.192用户通过该参数对,有指定IP地址的范围。本例中仅有IP地址在202.204.3.1到202.204.3.255范围中的主机被授权访问。本参数在Apache 1.3或以上的版本中有效。
表1-4 Allow、 Deny 指令参数表
2.Deny
语法:Deny from host1 host2 host3
该指令的功能与Allow指令相反。用户通过它来指定一个关于主机的列表,列表中的主机被拒绝访问某一特定目录。同样,Deny指令也能接受表1-3中的所有参数。
3.Order
语法:Order deny,allow│allow,deny│mutual-failure
该指令控制Apache确定Allow和Deny指令的共同作用范围。例如:
;
Order deny,allow
Deny from myboss.bupt.com 202.204.3.16
Allow from all
;
上例中拒绝主机myboss.bupt.com和202.204.3.16访问该目录,并且允许所有其他主机访问。Order指令的参数是以逗号分隔的列表,列表中指定了哪一条指令先执行。特别要注意的是,影响所有主机的命令被授予最低的优先级。上例中,由于Allow指令影响所有主机,它被授予较低的优先级。参数mutual-failure表示仅有那些出现在Allow指令列表中,且没有在Deny指令列表中出现的主机被授权访问。
1.3.4 使用用户认证来限制某些文档的访问
当我们将资源放在用户认证下面时,就可以通过要求用户输入名字和口令来获得对资源的访问。这个名字和口令被保存在服务器的数据库文件中。这个数据库可以采用多种形式。Apache中有如下数据库模块,如:普通文件数据库、数据库管理(DBM)文件数据库、MSQL数据库、Oracle和Sybase数据库等。
默认情况下,可以在某个目录下放一个文件.htaccess,首先介绍一下该文件中的一些基本的配置命令。
AuthName
此指令为口令保护的页面设置认证区域。区域是在提示要求认证时呈现给用户的内容,如:“Please Enter Your Name and Password for this Realm”。
AuthType
此指令为这个领域设置认证类型,在HTTP1.0 中只有一个认证类型——Basic(基本类型)。在 HTTP1.1中有数种,如 MD5。
AuthUserFile
此命令指定一个含有名字和口令列表的文件,每行一对。
AuthGroupFile
此命令指定包含用户组清单和这些组的成员的清单文件,组成员之间用空格分开。例如:
Managers:joe mark
Production: mark shelley paul
require
require命令指定需要什么条件才能被授权访问。它可以只列出可能连接的指定用户、指定可能连接的用户的一个组或多个组的清单,或指出数据库中的任何有效用户都被自动的授权访问。例如:
require user mark paul(只有mark和paul可以访问)
require group managers(只有managers组可以访问)
require valid-user(在数据库AuthUserFile中任何用户都可以访问)
配置文件以下面的方式结束:
;
AuthName Protected
AuthType basic
AuthUserFile /usr/local/apache/conf/users
;
require valid-user
;
;
如果require指令出现在;块内,它将限制访问使用的方式,否则将不允许任何方式的访问操作。在上例中,可以以HTTP GET 或POST的方式访问。为保证其正常运行,require指令必须与AuthName和AuthType之类的指令配合使用。
Satisfy
语法:Satisfy ‘any’│’all’
缺省值:Satisfy all
如果你既使用了Allow指令又使用了require,你可以用这条指令告诉Apache服务器哪些东西满足鉴权要求。Satisfy的值可以是all或any。使用all ,则只有在Allow指令和require 指令都满足的情况下才鉴权成功;如果使用any,Allow指令和require 指令中任何一条指令满足都可以使鉴权操作成功。
为了给用户user1进入访问,用命令:
#htpasswd –c /usr/local/apache/conf/users user1
为user1分配密码。如果想对一个特殊组保护一个目录,那么配置文件看上去就象下面这样:
;
AuthName Protected
AuthType basic
AuthUserFile /usr/local/apache/conf/users
AuthGroupFile /usr/local/apache/conf/group
;
require group managers
;
;
1.3.5 用户web目录
具有许多用户的网站有时允许用户管理Web树中他们自己的部分,用户管理的部分在他们自己的目录中。为此,需要使用如下的URL:
http://www.mydomain.com/~user
其中的“~user”实际上是用户目录中的一个目录别名。Alias命令和它不同,它只能吧一个特殊的伪目录映射到一个实际的目录中。本例是要把~user映射到/home/user/public_html之类的文件中。因为“用户”的数量可以是很多的,所以在这里某种宏是很有用的。这个宏是UserDir命令,前面已经介绍过。
UserDir命令用来指定用户home目录中的一个子目录,在这个子目录中,用户可以放置被映射到~user URL的内容。换句话说,Apache默认的:
UserDir public_html
将对下面的请求
http://www.mydomain.com/~paul/index.html
引起对下面的Linux文件的查找
/home/paul/public_html/index.html
所以在默认设置情况下,用户需要在自己的home目录中创建public_html,然后把他所有的网页文件放在该目录下即可,输入http://www.mydomain.com/~user即可进行访问。但是在具体实施时,请注意以下几点:
1.以root登录,以如下指令修改用户主目录权限:
#chmod 705 /home/username
让其他人有权进入该目录浏览。
2.由用户在自己的home目录中创建public_html目录,保证该目录也有正确的权限让其他人进入。
3.Apache默认的目录文件是index.html,不是index.htm,所以可以改变文件中的一行像下面这样:
text/html html htm
这样Apache就会读取用户的index.htm文件
4.用户自己在目录下创建的目录最好把权限设为0700,确保其他人不能进入访问。
1.3.6 虚拟主机
虚拟主机是一种在一台服务器上提供多台主机服务的机制。Apache实现了处理虚拟主机的非常简明的方法。Apache支持两种类型的虚拟主机,基于IP的虚拟主机及基于名称的虚拟主机。基于IP的虚拟主机对所有无论新旧的浏览器提供支持,而基于名称的虚拟主机因为需要最新的HTTP/1.1协议的支持,不能支持所有的浏览器。
本文推荐使用基于名称的虚拟主机,因为它允许用户创建无限多个主机。而对于基于IP的虚拟主机来说,由于用户网络IP的级别,限制了基于IP的虚拟主机的个数。例如,如果用户的IP 网络级别是C级,则共有256个IP地址,而且不是所有的IP地址都可以用于虚拟主机。
基于IP 的虚拟主机的配置
提供多台主机服务是通过对一台机器分配多个IP地址来实现的,然后将Apache捆绑到不同的IP地址上。对每一台虚拟主机提供唯一的IP地址。例如,一台Linux机器可能会有如下指向他的IP地址:202.112.10.2、202.112.10.3,我们可以将www1.host.com捆绑到第一个IP地址上,将www2.host.com捆绑到第二个IP地址上。下面介绍设置虚拟主机的具体做法。
我们通过httpd.conf来设置虚拟主机。假设服务器IP为202.112.10.1,要虚拟另一台IP地址为202.112.10.2,则加下面个行到/etc/rc.d/rc.local:
/sbin/ifconfig/ eth0:0 202.112.10.2
/sbin/route add –host 202.112.10.2 eth0:0
加下面各行到httpd.conf文件中:
;
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www1.host.com
ErrorLog /var/log/httpd/foldername/error.log
TransferLog /var/log/httpd/foldername/access_log
;
要虚拟多个基于IP的主机时,需要像上面那样为每个IP地址创建一个VirtualHost容器。例如:要添加www2.host.com的虚拟主机,则在httpd.conf文件中加下面各行。
;
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www2.host.com
ErrorLog /var/log/httpd/foldername/error.log
TransferLog /var/log/httpd/foldername/access_log
;
任何放置在VirtualHost之间的命令只属于对该虚拟主机的请求。在VirtualHost 容器之外的任何命令构成了对主服务器的配置。除非出现冲突,每一个虚拟主机都继承了主服务器的配置。如果在主服务器配置和虚拟主机的配置中都使用了同一个指令,在虚拟主机中的配置将覆盖主服务器的配置,但这仅仅对该虚拟主机有效。DocumentRoot指向一个目录,这个目录可能包含专用于虚拟主机的内容。
每一台虚拟主机都可以有它自己的访问记录、错误记录以及它自己的Redirect 和Alias 命令和自己的ServerName、ServerAdmin命令等。如下命令是Apache虚拟主机所不能支持的(即不能在;容器中使用的):
ServerType MaxRequestsPerChild UserId
BindAddress GroupId Pidfile
StartServersTypeConfig MaxSpareServers
ServerRoot MinSpareServers
基于名称的虚拟主机的配置
配置基于名称的虚拟主机,先要在httpd.conf文件中使用NameVirtualHost指令设置基于名称的虚拟主机的IP地址。例如,用户想在Apache服务器中配置名称为www.host1.com和www.host2.com两个虚拟主机,对应IP地址202.112.10.2。以下是配置实例:
NameVirtualHost 202.112.10.2
;
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www.host1.com
;
;
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www.host2.com
;
在设置好httpd.conf文件之后,还应该在DNS服务器中加入相应的虚拟主机的记录项。
基于IP 的虚拟主机的DNS配置
对于上面设置基于IP虚拟主机的例子,在DNS配置文件中添加如下记录:
www1.host.comINA202.112.10.2
www2.host.com IN A 202.112.10.3
;PTR Records
202.112.102.2INPTRwww1.host.com
202.112.102.3INPTRwww2.host.com
在DNS配置文件中创建了A(地址)PTR记录之后,需要重新启动DNS服务器来测试新建的配置。使用如下指令测试以上配置:
nslookup –query=a www.host.com
nslookup –query=ptr www.host.com
这两个虚拟主机的域名为host.com。第一个nslookup指令用于查找www.host.com的一个A记录;第二个nslookup指令用于在同一个主机中查找一个PTR记录。如果没有找到响应的信息,nslookup就重新访问DNS配置并检查语法错误。
基于名称的虚拟主机的DNS配置
基于名称的虚拟主机不需要唯一的IP地址。但需要为每一台虚拟主机创建一个CNAME(规范名称)。假设已经有了名为www.host.com的主机,并已经进行了合适的DNS配置。则对于上面的创建基于名称虚拟主机的例子,配置DNS如下:
www.host1.comINCNAMEwww.host.com
www.host2.comINCNAMEwww.host.com
同样可以用nslookup指令对刚添加的CNAME记录进行测试。对以上记录测试如下:
nslookup –query=cname www.host1.com
nslookup –query=cname www.host2.com
在DNS配置好之后,要使虚拟主机的配置生效,必须启动(或重启动)Apache服务器。而且,在此之前,不要忘记创建在虚拟主机配置中可能用到的目录。
虚拟主机配置的调试
使用Apache 1.3.x,用户可以看到Apache使用如下的指令对虚拟主机的配置进行分析:
./httpd-S
该指令的输出将显示Apache服务器中当前虚拟主机的配置。在运行上面的指令时,不需要关闭正在运行的Apache服务器。
1.4 Apache服务器的其他服务
1.4.1 CGI 脚本(php 、perl)
1.CGI配置
配置Apache来处理CGI请求,包括告诉Apache将CGI程序放在什么地方、为特定的文件扩展名设定CGI句柄、以及说明将哪些文件扩展名视为CGI程序。建议将CGI程序存储于一个目录下,以便对其进行更好的控制。最好将CGI程序目录放在你的DocumentRoot目录外面。这样就不可能对CGI程序直接访问,也就保证了你的站点具有更好的安全性。
一般情况下,CGI脚本文件都放入/home/httpd/cgi-bin目录中,需要使用CGI程序的html文档通过“/cgi-bin”来指定要调用的CGI程序。但如果要使脚本文件与相关的html文档在一起,则可以用ScriptAlias指令来指定新的脚本目录。
例如,html文件在目录/myhome/httpd/html中,CGI脚本在 /myhome/httpd/cgi-bin 中,使用命令:
ScriptAlias /mycgi/ /myhome/httd/cgi-bin
可以在任何html文件中,当需要使用/myhome/httpd/cgi-bin中的程序时,如abc.pl,就可以使用“/mycgi/abc.pl”来调用。
在由ScriptAlias 指定的目录中,Apache认为所有的文件都是用于执行,而不做一般文件处理。在这样的目录中,文件的名字不必具有如“.php”、“.pl”等可执行文件的后缀。但如果想要在ScriptAlias指定的目录之外执行这些程序,必须在Apache的配置文件中对执行程序的文件名后缀使用AddHandler进行说明,例如:
AddHandler cgi-script .php .pl
这样,Apache将把以“.php”、“.pl”为后缀的文件当作CGI脚本来运行。
为了使某个目录中以“.cgi”为后缀的文件能够执行,在Apache的配置文件中的相应目录下(由; ;定义)的Options 中要包含ExecCGI选项。
有些时候,不希望目录中的所有“.cgi”文件都能被执行。例如,只让abc.cgi能执行,则可以使用模块mod_rewrite提供的功能,即在包含该文件的目录中,如htdocs/mydir加入“.htaccess”文件,文件内容如下:
RewriteEngine on
RewriteBase /mydir
RewriteRule ^abc.cgi\.cgi$-[T=application/x-httpd-cgi]
即把abc.cgi文件重写成具有CGI MIME类型的文件,从而能被服务器执行。
注意要在Apache的配置文件中将该目录的AllowOverride包含FileInfo,以便使在“.htaccess”文件中mod_rewrite模块的指令能够有效。
2.CGI程序的调试
为了帮助CGI开发者,Apache对CGI的输出进行记录。使用如下指令可以记录CGI的输出,这些指令在mod_cgi模块中。
ScriptLog
语法:ScriptLog filename
该指令设置记录CGI程序错误的日志文件名称。如果日志文件名是相对文件名(即,不是以/开头),则认为该日志文件位于相对由ServerRoot指令指定的服务器根目录中。
在使用该指令时,要保证用户使用UserDir指令指定的日志目录是可写的。最好在需要时才使用该指令并在调试结束后将其设置为OFF。
ScriptLogLength
语法:ScriptLogLength size
该指令限制由ScriptLog指令指定的日志文件的大小。脚本日志文件可以记录每个CGI错误的许多信息,因此,其大小也增长的很快。使用该指令,可以限制日志文件的大小,这样一旦日志文件达到最大长度,将不会对随后的信息进行记录。
ScriptLogBuffer
语法:ScriptLogBuffer size
该指令限制记录的POST或PUT数据的大小。
1.4.2 Apache的proxy服务
代理模块的编译
Apache里的proxy支持程序来自于mod_proxy模块,在缺省条件下,它不能被编译生成。如果你使用APACI接口安装Apache,那么添加代理模块需要在在你的Apache源代码目录下执行下面操作:
如果你是第一次运行配置脚本,输入下面命令
./configure –prefix=/你想要安装到的目录\ Apache –enable-module=proxy
如果你在编译Apache之前已经运行过配置脚本的话,执行下一条命令:
./config.status --enable-module=proxy
这样,前面的配置选项将被用到创建新的配置文件上来。
下一步是运行make命令。如果上一步没有出错,在安装选项里执行make命令,并在合适的目录下安装新编译Apache可执行文件,这样就添加了代理模块。
如果你不是使用APACI接口安装Apache,则必须要编辑src/Configuration文件以保证AddModule modules /proxy/libproxy.a这一行不被注释掉。修改完后再运行src/Configure脚本来建立新的Makefile。等到src/Configure执行完,再运行make命令。如果make命令成功运行,再回到Apache的根目录下,再次从安装选项里运行make命令,把这个新的Apache可执行文件安装到合适的目录上。
你可以在服务器的可执行目录中运行下面的命令来确认mod_proxy是否在输出中显示:
./httpd -l
代理模块的指令集
Apache的代理模块有以下指令。
ProxyBlock
语法:ProxyBlock;…
缺省值:None
这一命令可以终止对某一指定主机或域的访问控制,例如:
ProxyBlock cuckoo
这一命令终止了所有名称里有“cuckoo”的主机的访问。这样访问www.cuckoo.com.cn或cuckoo.game.com就无法实现。你也可以通过如下命令关闭对所有主机的访问:
ProxyBlock *
ProxyDomain
语法:ProxyDomain;
缺省值:None
此这里为代理服务器指定缺省域名。当此域名设为intranet上的一个本地域时,任何不包括域名的请求都将以此域名作为缺省域名,例如:
ProxyDomain .bupt.com
当一个bupt.com的用户发出一个请求如http://cuckoo/us.html时,该请求将会被改变以指向下面的URL:
http://cuckoo.bupt.com/us.html
注意,你所指定的缺省域名前必须加一个句点。
ProxyPass
语法:ProxyPass; ;
缺省值:None
此指令可以帮助你将一个Web服务器里的文件树型结构映射到你的代理服务器的文件系统里。例如,把以下语句加入到名为cuckoo.proxy.com的代理服务器的HTTP.CONF文件里:
ProxyPass /www/turbolinux http://www.turbolinux.com.cn
现在,你可以使用如下的URL来访问Turbolinux的站点:
http://cuckoo.proxy.com/www/turbolinuxt
其作用相当于为Turbolinux的站点建立了一个本地镜象。任何使用; 的请求都将在内部被转换为一条对;的代理请求。
ProxyRemote
语法:ProxyRemote; ;
缺省值:None
你可以使用这条命令实现两台代理服务器之间的接口操作。
;可以取值为:一个远程服务器要使用的URL的名称;一个远程服务器支持URL方案的名称;表示所有的请求都应通过某服务器。
;可以是http://remote-proxy-hostname:port。要注意,系统当前只支持HTTP协议,所以你只能指定一个处理HTTP协议的代理服务器。
如果你要把某一Web站点的所有代理请求都直接发往它的代理服务器上,可以用下面的命令实现:
ProxyRemote http://www.cuckoo.com/ http://cuckoo.proxy.com
这条命令把所有与http://www.cuckoo.com/匹配的请求都送往http://cuckoo.proxy.com。
NoProxy
语法:NoProxy;
缺省值:None
此命令用来在intranet 环境里对ProxyRemote命令的使用进行控制。你可以用它来指定一个域名、子网、IP地址或主机名,使在ProxyRemote命令指明的代理服务器不承担对它们的服务,例如:
ProxyRemote * http://cuckoo.proxy.com
NoProxy .proxy.com
第一句表示所有请求都发给http://cuckoo.proxy.com处理。而第二句则设置为所有对proxy.com的请求由局域代理服务器处理,而其它请求仍送往http://cuckoo.proxy.com处理。
ProxyPassReverse
语法:ProxyPassReverse; ;
缺省值:None
用于建立逆向代理服务器。在逆向代理服务器的建立过程中,该命令根据Web服务器的实际返回值确定位置标志头。
ProxyRequests
语法:ProxyRequests off/on
缺省值:ProxyRequests off
你可以用这条命令来打开或关闭对代理访问的缓存服务。它不影响ProxyPass指令的作用。
ProxyReceiveBufferSize
语法:ProxyReceiveBufferSize;
缺省值:None
此命令为从代理服务器送出的请求设置网络缓冲区的大小。字节数必须要大于512。但如果你使用系统的缺省缓冲区,则应用这条命令把它设为0。
CacheDefaultExpire
语法:CacheDefaultExpire;
缺省值:CacheDefaultExpire 1
此命令提供一个缺省时间来销毁缓存的文件,这些文件的最后修改时间不详。
CacheDirLength
语法:CacheDirLength;
缺省值:CacheDirLength 1
当磁盘处于开状态时,限制在CacheRoot指令规定的目录下建立的子目录名称的长度。
CacheDirLevels
语法:CacheDirLevels;
缺省值:CacheDirLevels 3
设定了Apache用于建立和存储数据文件的子目录数。
CacheForceCompletion
语法:CacheForceCompletion;
缺省值:CacheForceCompletion 90
CacheSize
语法:CacheSize;
缺省值:CacheSize 5
此命令给出用于存储文件的磁盘空间,这些文件将存到CacheRoot指令规定的目录下。缺省设置不符合实际情况,本文推荐用户根据自己的负载设这为10MB 或1GB。
CacheGcInterval
语法:CacheGcInterval;
缺省值:None
设定Apache经过多少时间(小时)检查文件缓存目录并删除过时的文件。同时它也是Apache强制执行CacheSize指令的时间。
CacheRoot
语法:CacheRoot;
缺省值:None
用来进行磁盘缓存。你可以指定一个目录使代理服务器可以把写在缓存里的文件存储到磁盘上。对此目录必须具有写权限。
代理服务器的配置
要打开代理服务器,你必须把ProxyRequests设定为开(On)状态。在这之后,就可以根据你希望代理服务器实现的功能来增加配置。任何代理服务器配置语句都应放在;容器之间。
下面举例说明,如何配置代理服务器。
如果你有一套使用专有非路由IP地址的计算机网络,又想为这套系统提供诸如HTTP/FTP服务的国际互联网连接,那么你只需要一台有合法IP地址的计算机,并且它可以在代理模块里运行Apache。同时,这一台计算机必须在ProxyRequest设定为ON状态下运行Apache代理服务器,此外无须其它配置。所有的HTTP/FTP请求都可以由此代理服务器处理。
在这种配置情况下,代理服务器必须设为属于多个网络的,即它既可以访问非路由的个人网络、也可以访问可路由IP 网络。从一定程度上讲,这一台代理服务器可以作为这个个人网络的网络防火墙。
又如:因为大多数Internet和Intranet Web站点的内容都比较固定,因此把它们存储到局域代理服务器的高速缓存里将节省珍贵的网络带宽。一个开启缓冲区的代理服务器只有在缓冲区内包含过期文件或请求的文件不在缓冲区时才寻找并装入所请求的文件。你可以使用以下命令把你的代理服务器设置为这种工作状态:
;
CacheRoot /www/cache
CacheSize 1024
CacheMaxExpire 24
;
以上配置定义了一个有缓存功能的代理服务器,它把缓存的文件写入 /www/cache目录下。它允许写入1024K的数据(1MB),并且存储内容的生存时间为一天(24小时)。
1.5 Apache常见故障排除
由于Apache在/var/log/httpd目录下提供了访问记录文件access_log 以及出错文件error_log,所以当出现故障时,可以首先检查这些记录文件,一般故障都会在文件中指出。常出现的错误如文档路径错误、CGI脚本程序没有执行权限、CGI脚本程序本身有错误等。
如果故障属于服务器本身故障,可以使用下面的目录检查配置文件的设置:
检查配置文件句法 /usr/sbin/httpd –t
检查虚拟主机的配置/usr/sbin/httpd -S
小结
Apache服务器以功能强大、配置简单、使用代价小而博得了大量用户的青睐,很快成为使用最广泛的Web服务器。本文系统而全面的介绍了Apache服务器及其相关知识。
你可以在安装linux时选择安装Web Server,这样Apache服务器将自动安装;否则,可以使用configure脚本来安装。
每个希望能对Apache服务器进行熟练配置的技术人员都必须深入了解下面三个配置文件:access.conf、httpd.conf、srm.conf。你可以通过在配置文件中加入命令行来实现各种奇妙的功能,例如:设置服务器本身的信息、设定某个目录的功能和访问的控制信息、告诉服务器你想从你的Web服务器提供何种资源,以及从哪里、如何提供这些资源。
Apache服务器提供了很好的访问安全机制。对访问安全控制的讨论是本文的重点。你可以通过使用Allow、Deny、Option这三条指令将你的站点设置为需要根据客户主机名或IP地址限制访问。用户认证可以用来限制某些文档的访问权限,当我们将资源放在用户认证下面时,就可以要求用户输入名字和口令来获得对资源的访问。Apache服务器提供两种类型的虚拟主机:基于IP的虚拟主机和基于名称的虚拟主机。如同其他的Web服务器,Apache也提供了CGI、proxy服务。
1.1 Apache服务器2
1.1.1 简介2
1.1.2 Apache服务器安装(linux/unix)2
1.2 Apache服务器的配置4
1.2.1. httpd.conf5
1.2.2. access.conf7
1.2.3. srm.conf7
1.3 Apache服务器功能介绍9
1.3.1 服务器控制9
1.启动服务器10
2.停止服务器10
3.重启动服务器10
4.获得服务器的状态10
5.查看服务器配置文件11
6.测试Apache Server11
1.3.2访问控制11
1.Options11
2.AllowOverride12
3.
1.3.3 根据客户主机名或IP地址限制访问13
1.Allow13
2.Deny14
3.Order14
1.3.4 使用用户认证来限制某些文档的访问14
1.3.5 用户web目录16
1.3.6 虚拟主机17
1.4 Apache服务器的其他服务20
1.4.1 CGI 脚本(php、perl)20
1.CGI配置20
2.CGI程序的调试21
1.4.2 Apache的proxy服务21
代理模块的编译21
代理模块的指令集22
代理服务器的配置24
1.5 Apache常见故障排除25
Apache 服务器探秘
杜广达
内容提要
本文介绍了Linux的Web服务器——Apache服务器。在互联网飞速发展的今天,Web功能的使用与开发已经成为操作系统不可缺少的配套部分。Apache是常见的支持HTTP协议的Web服务器之一,也是使用最广泛的Web服务器。本文将帮助你在自己的Linux系统中配置自己Web服务器。
本文主要介绍了以下内容:
lApache服务器安装
lApache服务器配置文件
lApache服务器功能介绍
lApache服务器的CGI和proxy服务
lApache服务器的常见故障排除
关键字:
Apache,Web 服务器,Linux
1.1 Apache服务器
1.1.1 简介
Apache是常见的支持HTTP协议的Web服务器之一,也是使用最广泛的Web服务器。截止到1999年1月,世界上大约有超过300万台Internet服务器使用的是Apache Server。
Apache Server的主要特点是稳定性高、速度快、功能多。通过第三方的评测,Apache Server比大多数的Web服务器都快。
Apache 服务器既是一种软件,又是一个工程。它是由千千万万的服务器代码和文档开发者共同努力的结果。在1995年4月,公开发行了第一套Apache Server,版本号是0.6.2。Apache Server的名字来源于“A PatCHy Server”。现在最新的版本是1.3.12。
前不久,我国将Linux操作系统正式确定为重点发展方向。Apache Server以其对UNIX和Linux的最好支持,使它必定成为我国今后Web服务器的主流。
1.1.2 Apache服务器安装(linux/unix)
通常来说,大家在安装linux时可以选择安装WEB SERVER ,并在INTERNET SERVICES中开启httpd这一项服务,这样系统就会自动的安装好apache,并且在系统第一次启动时启动httpd进程。在作好一些相应的配置后,在你的Xwindows环境下打开NETSCAPE或IE,并在URL中填入localhost 或本机的IP地址,就会访问到apache的默认的页面。
如果说你没有安装WEB SERVER ,你可以重新安装Linux并选择UPDATE,挑选apache的软件包安装到本机。当然,如果你想要安装最新的版本,可以到http://www.apache.org/ 网站上去下载最新的版本。我们假设你已经将源代码拷贝到一个目录下。这时可以人工配置或使用APACI的自动配置界面。这里我们详细介绍后者。
在源代码的根目录 中,你会找到一个叫做configure的脚本,该脚本是使用APACI配置Apache所必须的。你可以通过在该脚本后加“--help”来取得帮助:
./configure --help
在配置时所做的第一步是决定其安装位置。Apache默认的安装路径是/usrlocal/apache。但你也可以自行指定安装位置。例如,你可以运行下面的命令来将Apache安装在一个叫做 /usr/apache的目录下:
./configure --prefix=/usr/apache
该脚本会将所有的Apache文件安装在指定的目录下。你也可以使用 --prefix 选项将指定类型的文件定位到其他目录。具体prefix选项请参看表1-1:
选项名功 能
Binddir=DIR把可执行文件安装在指定DIR目录下
Compat按照Apache1.2安装路径安装
Datadir=DIR把只读数据文件安装在指定DIR目录下
Exec-prefix=DIR把依赖于结构的文件安装在指定DIR目录下
Includedir=DIR把包含文件安装在指定DIR目录下
Libexecdir=DIR把可执行程序安装在指定DIR目录下
Layout列出详细的安装路径的目录结构
Localstatedir=DIR把可修改数据文件安装在指定DIR目录下
Logfiledir=DIR把日志文件安装在指定DIR目录下
Mandir=DIR把人工页面安装在指定DIR目录下
Proxycachedir=DIR把代理缓存数据安装在指定DIR目录下
Runtimedir=DIR把运行时数据文件安装在指定DIR目录下
Sbindir=DIR把系统管理员可执行文件安装在指定DIR目录下
Sysconfdir=DIR把配置文件安装在指定DIR目录下
表1-1 configure脚本prefix选项列表
接下来是决定是否使用Apache开发人员提供的标准模板配置。如果你第一次编译Apache,那么推荐使用标准配置来熟悉整个过程。基于APACI配置的标准(或缺省)的配置文件是存储在src子目录下的Configuration.apaci。该文件中,有5种行类型:
注释行:
以“#”符号作为起始字符的行,用于描述信息和屏蔽那些不希望设置的选项。例如:
#Rule SHARED_CORE=default
Makefile选项行:
指类似于“CC=gcc”的行。用于指定生成的Makefile文件中的选项。例如:
EXTRA_CFLAGS=’$(SRCDIR)/apaci’
规则行:
以“Rule”开头的行。用于控制Configure怎样创建Makefile文件。例如:
Rule SOCKS4=no
模块选择行:
以“AddModule”开头的行。用于增加模块。例如:
AddModule modules /standard/mod_cgi.o
可选模块选择行:
以“%Module”开头的行。把某些模块编译到Apache里但不激活。
如果你需要修改Configuration.apaci文件的内容,你不必要直接修改该文件。本文建议通过使用配置脚本来完成。例如,通过以下脚本来使能、使非规则:
./configure --prefix=/usr/apache --enable-rule=SOCKS4
./configure --prefix=/usr/apache --disable-rule=SOCKS4
同理可以使用, -enable-module ,-disable-module来使能、使非模块:
./configure --prefix=/usr/apache --enable-module=cgi
./configure --prefix=/usr/apache --disable-module=cgi
在成功的运行上面介绍的脚本后,你已经可以编译并安装Apache了。从Apache源代码目录的根目录下执行make命令来编译Apache源程序。如果成功将产生WWW服务器的可执行二进制文件httpd。在没有任何错误信息的情况下,你可以运行make install命令来安装Apache。否则,请查看错误信息并重新按配置步骤运行一遍。
只要你已经编译并安装了Apache,你就可以运行make clean来删除任何在编译时创建的对象文件。
1.2 Apache服务器的配置
每个Apache发布的源代码中都包括下面的缺省配置文件:
laccess.conf
lhttpd.conf
lsrm.conf
lmagic
lmime.types
后两个文件在大多数情况下应给予保留。magic文件是用在一个叫做mod_mime_magic的特定模块中的,mime.types文件是控制对于一个给定的文件扩展名来说将何种类型的MIME发送给用户。
我们需要定制的文件是httpd.conf、access.conf、srm.conf。它们有相同的结构,你可以将所有的指令放在httpd.conf文件里而将另外两个文件置空。在最新版本中,仅保留了httpd.conf文件。不论是只需要修改一个配置文件还是三个配置文件都要修改,其具体步骤内容都是完全一致的。本文仍介绍具有三个配置文件的Apache版本。
在正式开始之前,我们先来介绍以下Apache配置文件的格式。这些配置文件有两种类型的信息:可选注释和服务器指令。第一个字符为“#”符号的是注释行,它们对服务器软件不起作用,服务器在对这些文件进行语法分析时会忽略掉所有的注释行;除了注释和空行外,服务器把其他的行认为是完整的或部分的指令。指令又分成与shell命令类似的命令和伪HTML标记。例如:
Directive argument argument#与shell命令类似的命令
Port 80#与shell命令类似的命令
与HTML不同,伪HTML标记必须各占一行。我们可以把命令组成一组放在某个伪HTML标记中,象上面那样。
下面针对每个配置文件介绍各指令的含义。
1.2.1. httpd.conf
清单1-1给出了本节要介绍的命令在httpd.conf文件中的缺省用法。
清单1-1 httpd.conf命令举例
ServerTypestandalone
Port80
Usernobody
Group nobody
ServerName 202.204.3.16
ServerAdmin cuckoodoo@venus.bupt.edu.cn
ServerRoot "/www"
ErrorLog /www/logs/error_log
Timeout 300
PidFile /www/logs/httpd.pid
KeepAlive On
KeepAliveTimeout 15
MaxClients 150
MaxKeepAliveRequests 100
MinSpareServers 5
StartServers 5
ServerType
此指令指定Web服务器以何种方式工作。有两个值可供选择standalone 和inetd 。Standalone表示你的httpd进程是以一个单独的守护进程(daemon)的方式在后台侦听是否有客户端的请求,启动httpd的命令将加进系统启动脚本文件/etc/rc.d/rcX.d中;Inetd表示你的httpd进程不是以守护进程(daemon)的方式运行,而是由Inetd 这个 internet services的进程侦听,一旦有客户的请求,它会自动的启动httpd这个进程来提供相应的服务。对这种方式,启动httpd的命令将加进/etc/inetd.conf文件中。
因为在standalone方式下,为每个请求装载一个新进程的负载几乎不存在,所以此种方式更高效。因此,此指令默认的是Standalone方式,对于一个比较繁忙的网站,本文建议您选择Standalone方式启动httpd。
Port
你分配给你的WEB SERVER 的端口号。此指令仅对Standalone方式启动的服务器有意义。
Httpd 的默认端口是80,也可以分配给自己的WEB SERVER 一个大于1024 的端口号。如果你这样做,你必须在你的URL后面跟上你的端口号才能访问到你的页面。比如你分配给你的服务的端口号是8888,那么你访问时需要输入
http://domainname:8888
User和Group
象Port指令一样,这两条指令仅对standalone服务器有意义。
这两条指令分别指定httpd提供服务的子进程的用户标识(UID)和组标识(GID)。当主Web服务器进程调用一个子服务器来完成一个请求时,主Web服务器进程根据这些指令的设置的值修改子进程的UID和GID。
为了安全原因,本文推荐你以属于一个具有非常低权限的组的、具有非常低权限的用户方式运行子服务器进程。在大多数UNIX系统中,用户名nobody以及nogroup组具有最低权限。
ServerName
你机子的名称,如果你有域名,填入你本机的域名。如果没有,就填入你的主机名或IP地址。
ServerAdmin
服务管理员的email 地址,默认的是本机的root用户,所以是root@localhost。当服务器产生一个错误时,该email地址会显示出来。
ServerRoot
用来存放服务的配置、出错和记录文件的最底层的目录。如果你使用APACI接口编译和安装Apache,那么缺省ServerRoot为你在配置脚本中提供的prefix值;否则,你需要修改缺省值为一个合适的目录。
ErrorLog
用来存放你WEB SERVER的出错信息的文件。如果你将该指令设置为一个相对路径(即路径不是以“/”开头),那么这个路径就被认为是相对于ServerRoot目录的。
不管你将日志放在什么地方,你应该确信只有主服务器进程对该目录有写的权限。允许其他用户对该日志目录有写的权限意味着某些人会未经许可就获得了你的主Web服务器进程的UID,一般这个UID就是root帐户。
Timeout
设置服务器等待的最大时间值,服务器等待下列事件:接受GET请求;接收TCP/IP包文确认;接收POST或PUT请求。
注意:下面介绍的指令仅用于standalone服务器。
PidFile
该指令指定的文件存放了httpd进程的进程号。
KeepAlive
有两个可选值:on 或off。该指令指定是否支持永久性连接。使用永久性连接允许多个请求在同一个TCP连接上发送,在某些情况下,如果一个HTML文档有大量的图象,则可以降低大约50%的通信延迟。
KeepAliveTimeout
规定了服务器在断开与客户机的连接之前等待下一个请求的最大时间。
默认值是15秒。
MaxClients
本指令指定允许的最大客户个数。默认值是150个。最大的可能值是256个。如果你想处理多于256个同时连接,则需要修改src/include/httpd.h的标题头文件并将HARD_SERVER_LIMIT常量设置为你所希望的限制值。在对新服务器重新编译之后,你就可以将此指令设置为所期望的限制值。
MaxKeepAliveRequests
规定了每个KeepAlive连接所服务的最大请求数。
StartServers
设置了Apache在一开始所启动的子服务器进程的初始数目。
通常上面的参数的默认值是不用改的,但是如果你同时在一台机子上开几个WEB SERVER 时要注意:第一,你要给每一个WEB SERVER 分配不同的port 号;第二,要分别指定他们的errorlog文件和pidfile文件;第三,不懂的参数不要随意改动,即使改动也要一次改一个,并留有记录以便恢复。
1.2.2. access.conf
清单1-2给出了本节要介绍的命令在access.conf文件中的缺省用法。
清单1-2 access.conf命令举例
Options Indexes IncludesNOEXEC
AllowOverride None
AllowOverride None
Options ExecCGI
本节介绍的命令主要是用于对目录的功能和访问的控制的设定。下面我针对默认的页面的配置文件进行说明。
该清单由两个
第二部分表示对目录/home/httpd/cgi-bin 不进行访问控制,允许执行CGI程序。这就表明这是一个用来存放CGI程序的目录。
1.2.3. srm.conf
清单1-3给出了本节要介绍的命令在srm文件中的缺省用法。
清单1-3 srm.conf命令举例
DocumentRoot /www/docs/
UserDirPublic_html
DirectoryIndex index.htm index.html index.php index.php3
AccessFileName .htaccess
Alias /rfc/ "/home/share/RFC_2000.3.17/"
ScriptAlias /cgi-bin/ "/home/httpd/cgi-bin/"
AddHandler cgi-script .cgi
该此文件告诉服务器你想从你的Web服务器提供何种资源,以及从哪里、如何提供这些资源。下面介绍此文件中经常涉及的指令:
DocumentRoot
用来指定主文档的地址。缺省值通常设置为Apache自己的htdocs目录。建议如本例一样将此命令指向你的文件系统的一个指定的子目录。在本例中,对应于文件http://202.204.3.16/index.html的请求,将对应到文件/www/docs/index.html。
UserDir
用来指定个人主页的位置。如果你有一个用户的home目录为 /home/cuckoodoo当在URL中输入 http://yourdomain/~cuckoodoo 系统就会到 /home/cuckoodoo/XXX/中去取这个用户的个人主页。其中“XXX”为UserDir 所指定的目录。
此命令仅用于在系统中你有多个用户,并且你希望每个用户都有他(她)自己的Web目录。缺省值是public_html。
DirectoryIndex
用来声明查找的索引文件的名称。本例告诉Web服务器应该查找列表中的四个文件,如果发现其中之一存在,便将其返回给请求方Web客户机。注意:在索引列表中列举大量的文件会造成两个问题。一个是,服务器不得不为每个目录请求查找是否存在众多的文件,这会降低服务器的速度;另一方面,从管理者的角度看,将多文件作为索引不便于对站点的管理。
AccessFileName
指定存取控制文件名,如果某个目录下存在该文件,那么这个文件规定了该目录的存取控制信息。当服务器给用户返回文档之前,它依照该文档路径读取第一个被激活的存取控制文件,根据其中的指令对文档进行存取控制。
默认值是.htacess文件。如果你要改变这个名字,建议你的新文件名以“.”开始,这样的文件名不会在目录清单中被列出来。
注意:缺省access.conf文件禁止Apache搜寻任何目录级访问控制文件。如果你要使用该文件,那么必须对access.conf文件进行修改。例如,缺省access.conf文件有下面的配置段:
Options FollowSymLinks
AllowOverrideNone
;
这个配置使用AllowOverride 指令来禁止Apache搜索AccessFileName所指定的文件。如果你希望允许Apache搜索一个在你的站点的某个子目录中的访问控制文件,可以使用如下配置:
Options FollowSymLinks
AllowOverrideAll
这个配置允许你拥有在/path/to/your/dir目录中或任何该目录的子目录中的.htacess访问控制文件。它允许你覆盖所有允许的指令。
Alias
建立真实目录的别名,使文件可以存放到DocumentRoot指令指定目录以外的其他目录中。如:
Alias /images /ftp/pub/image
则对于http://myserver/images/txd.gif文件的存取将向用户返回/ftp/pub/image/txd.gif文件。
ScriptAlias
指定服务器使用的CGI脚本所在的目录。像Alias一样,它给真实目录取别名。因为CGI脚本是用来执行的,所以包含CGI脚本的目录不应放在文档根目录下。这样做的目的是处于安全的考虑的。将这些脚本放在一个大家都可以访问到的目录下,会使任何人都可以不经允许查看你的脚本,并找到脚本中的致命弱点。而使用本命令,使服务器对ScriptAlias 指定的目录的请求并不是以发送所请求的文件的内容来服务的。被请求的文件是作为一个脚本来执行,将该脚本的执行结果返回给客户机。
语法:ScriptAlias 虚拟目录 真实目录
AddHandler
指定具有哪些扩展名的文件是某类处理程序。
语法:AddHandler 处理程序名 扩展名1…扩展名n
1.3 Apache服务器功能介绍
1.3.1 服务器控制
在发布的Apache 1.3.x产品中包含有一个叫做apachectl的shell脚本,用来在很多方面控制服务器。在此详细介绍此脚本的使用。在使用此脚本前,你必须已经是你的系统的超级用户,除非你已经配置你的Apache运行在高于1023端口上工作。
注意,如果你已经正确的为httpd 安装了inetd配置,那么你就不必做任何事情来启动和停止Apache服务器,因为当服务器接到HTTP端口请求时,inetd会自动运行Apache服务器。
1.启动服务器
运行下面的脚本启动服务器:
/你安装的Apache的bin目录/apachectl start
你如果不使用完全路径(以/开头的路径),则必须先到你安装的Apache的bin目录下,然后以该目录为当前目录,使用如下指令:
./apachectl start
如果你希望在系统重新启动后Apache服务器会自动启动,需要将上面的命令添加到/etc/rc.local或者在你的rc.d目录的类似文件中。
你也可以使用带 -f选项的httpd命令,并在后面跟上httpd.conf文件,来启动Apache服务器,例如:
httpd –f /你安装Apache的目录/conf/httpd.conf
2.停止服务器
运行下面的脚本停止服务器:
/你安装的Apache的bin目录/apachectl stop
3.重启动服务器
运行下面的脚本来重启动服务器:
/你安装的Apache的bin目录/apachectl restart
如果想执行一个更好的重启动,可以运行下面的脚本
/你安装的Apache的bin目录/apachectl graceful
此脚本运行时,首先restart 命令向Apache 发送一个SIGHUP信号,而后 graceful命令向Apache 发送一个SIGUSR1信号。因为后者是用户定义的(即由Apache开发者定义的),所以graceful命令更适合用来运行服务器。
4.获得服务器的状态
在你可以得到服务器的完整状态之前,你需要确信你已经将Lynx基于文本的Web浏览器安装在你的系统上。如果已安装了Lynx,你就可以通过运行下面的apachectl脚本来获得所运行的服务器的完整状态:
/你安装的Apache的bin目录/apachectl fullstatus
这样你就会得到一个充满了各种服务器状态数据的信息页。最好是将这个状态信息重定向到一个文件中,因为文件可以将数据完好的保存下来。你可以通过下面的指令将数据重定向到一个叫做/tmp/status的文件中:
/你安装的Apache的bin目录/apachectl fullstatus >; /tmp/status
5.查看服务器配置文件
要想检查服务器配置文件有没有语法错误,你可以运行下面的apachectl脚本:
/你安装的Apache的bin目录/apachectl configtest
6.测试Apache Server
开启Web浏览器,并将其指向正运行着你新配置好的Apache服务器的Web站点。如果你所运行的Web浏览器和Apache运行在同一个系统上,那么可以使用下面的URL:
http://localhost/
但是,对于其他情况,你需要指定完整的主机名。
最后,你需要检查一下日志文件是否被正确的更新。要想查看日志文件,可以进入日志文件目录并运行下面的UNIX命令:
tail –f [/path /to /access_log]
命令中的 tail是一个UNIX工具,它使你可以查看一个不断增长的文件(当使用了-f选项时)。现在,用Web浏览器来访问该站点。如果你已经进入了该站点,那么只需刷新一下浏览器。你会看到一个输入被添加到屏幕上的清单里。多次点击刷新按钮,看看访问文件是否被正确更新。如果更新正确,表示访问日志文件工作正常。按Ctrl+C退出tail命令。如果没有在日志文件中看到新记录,你应该检查一下日志文件和其所保存在的目录的许可权设置。
同理,需要检查错误日志:
tail –f [/path /to /error_log]
如果所有的这些测试都成功了,那么就说明你已经成功的配置了你的Apache系统。
1.3.2访问控制
1.Options
语法:Options [+│-]option[+│-]option…
Options 指令控制在某一目录下可以具有哪些服务器特性。此命令设为None时,在它的使用环境里没有附加特性。可以设置的特性见表1-2。
属 性用 途
None不激活任何选项
All激活除MultiViews外的所有选项
ExecCGI允许执行CGI脚本
FollowSymLinks服务器在某目录下跟踪象征性连接
IncludesServer Side Include(SSI)命令允许标志
IncludesNOEXEC一系列受限制的SSI命令可以被嵌入SSI页里,但不能出现#exec和#include命令
Indexes如果被请求的对象是映射到某一目录的URL,并且在此目录下没有DirectoryIndex,那么服务器将返回目录的格式化列表
SymLinkIfOwnerMatch服务器只跟踪象征性连接,这些连接与目标文件或目录属于同一个用户
Multiviews根据文件的语言进行内容协商
表1-1 Options指令属性表
可以使用“+”和“-”号在Options指令里打开或取消某选项。如果不使用这两个符号,那么在容器中的Options值将完全覆盖以前的Options指令里的值。例如,要允许一个目录(例如:/www/cuckoodoo)执行CGI和SSI,则要在配置文件中加入下面指令:
Options +ExecCGI +Includes
当你使用多个Options命令时,应注意小环境里使用的Options比较大环境里使用的Options具有优先权。
2.AllowOverride
语法:AllowOverride override override
缺省值:AllowOverride all
此指令告诉服务器哪些在.htaccess文件(由AccessFileName指定)里声明的指令可以覆盖配置文件中在它们之前出现的指令。
如果Override设置为NONE,服务器将不去读AccessFileName指定的文件。这样可以加快服务器的响应时间,因为服务器不必对每一个请求去找AccessFileName指定的文件。表1-3列出了可以设置的选项。
表1-3 AllowOverride 指令选项表
属 性用 途
AuthConfig允许使用鉴权指令(如AuthName、require、AuthDBMGroupFile、AuthDBMUserFile、AuthGroupFile、AuthType、AuthUserFile)
FileInfo允许使用控制文件类型的指令(如AddEncoding、AddLanguage、DefaultType、LanguagePriority、AddType、ErrorDocument)
Indexes允许使用控制目录检索的指令(如AddIcon、AddDescription、AddIconByType、AddIconByEncoding、DefaultIcon、DirectoryIndex、FancyIndexing、HeaderName、IndexIgnore、IndexOptions、ReadmeName)
Limit允许使用控制主机访问的命令(如Allow、Deny、Order)
Options允许使用控制特定文件类型的指令(如Options、XbitHack)
3.
语法:
这一容器包含了一组访问控制指令,这些指令只针对于所指定的HTTP方式。方式的名称列表可以时下面的一个或多个:GET、POST、PUT、DELETE、CONNECT、OPTIONS。如果使用GET,它还会影响到HEAD请求。如你想限制所有的方式,就不要在
这个容器不能被嵌套,
1.3.3 根据客户主机名或IP地址限制访问
下面三条指令用于Apache的mod_access模块。使用它们能实现基于Web客户Internet主机名的访问控制。这里的主机名可以是一个完整的域名,也可以是一个IP地址。
1.Allow
语法:Allow from host1 host2 host3
用户可以通过该指令指定一个关于主机的列表,列表中可包含一个或多个主机名或IP地址,列表中的主机被允许可访问某一个特定的目录。当指定了多个主机名或IP地址时,它们中必须以空格符来分隔。表1-4列出了该指令的参数。在描述一栏针对Allow指令进行了解释。
参 数示 例描 述
ALLAllow from all允许所有主机访问站点
某主机的完全资格的域名Allow from www.cuckoo.comDeny from www.cuckoo.com仅由FQDN所指定的主机才被允许访问。
某主机的部分域名Allow from cuckoo.bupt.comDeny from cuckoo.bupt.com仅有那些符合部分域名的主机被允许访问。示例中,在.cuckoo.bupt.com网络中的所有主机都可以访问此站点。
某主机的完全IP地址Allow from 202.204.3.16Deny from 202.204.3.16仅有指定IP地址的主机才被允许访问站点。
部分IP地址Allow from 202.204.3Deny from 202.204.3当在Allow指令中IP地址的全部四个字节没有完全给出,则该部分IP地址根据从左到右的匹配原则,所有匹配该IP格式的主机被允许访问。本例中,所有在202.204.3.1到202.204.3.255的主机都可以访问。
网络/掩码Allow from202.204.3.0/255.255.255.192Deny from202.204.3.0/255.255.255.192用户通过该参数对,有指定IP地址的范围。本例中仅有IP地址在202.204.3.1到202.204.3.255范围中的主机被授权访问。本参数在Apache 1.3或以上的版本中有效。
表1-4 Allow、 Deny 指令参数表
2.Deny
语法:Deny from host1 host2 host3
该指令的功能与Allow指令相反。用户通过它来指定一个关于主机的列表,列表中的主机被拒绝访问某一特定目录。同样,Deny指令也能接受表1-3中的所有参数。
3.Order
语法:Order deny,allow│allow,deny│mutual-failure
该指令控制Apache确定Allow和Deny指令的共同作用范围。例如:
Order deny,allow
Deny from myboss.bupt.com 202.204.3.16
Allow from all
上例中拒绝主机myboss.bupt.com和202.204.3.16访问该目录,并且允许所有其他主机访问。Order指令的参数是以逗号分隔的列表,列表中指定了哪一条指令先执行。特别要注意的是,影响所有主机的命令被授予最低的优先级。上例中,由于Allow指令影响所有主机,它被授予较低的优先级。参数mutual-failure表示仅有那些出现在Allow指令列表中,且没有在Deny指令列表中出现的主机被授权访问。
1.3.4 使用用户认证来限制某些文档的访问
当我们将资源放在用户认证下面时,就可以通过要求用户输入名字和口令来获得对资源的访问。这个名字和口令被保存在服务器的数据库文件中。这个数据库可以采用多种形式。Apache中有如下数据库模块,如:普通文件数据库、数据库管理(DBM)文件数据库、MSQL数据库、Oracle和Sybase数据库等。
默认情况下,可以在某个目录下放一个文件.htaccess,首先介绍一下该文件中的一些基本的配置命令。
AuthName
此指令为口令保护的页面设置认证区域。区域是在提示要求认证时呈现给用户的内容,如:“Please Enter Your Name and Password for this Realm”。
AuthType
此指令为这个领域设置认证类型,在HTTP1.0 中只有一个认证类型——Basic(基本类型)。在 HTTP1.1中有数种,如 MD5。
AuthUserFile
此命令指定一个含有名字和口令列表的文件,每行一对。
AuthGroupFile
此命令指定包含用户组清单和这些组的成员的清单文件,组成员之间用空格分开。例如:
Managers:joe mark
Production: mark shelley paul
require
require命令指定需要什么条件才能被授权访问。它可以只列出可能连接的指定用户、指定可能连接的用户的一个组或多个组的清单,或指出数据库中的任何有效用户都被自动的授权访问。例如:
require user mark paul(只有mark和paul可以访问)
require group managers(只有managers组可以访问)
require valid-user(在数据库AuthUserFile中任何用户都可以访问)
配置文件以下面的方式结束:
AuthName Protected
AuthType basic
AuthUserFile /usr/local/apache/conf/users
require valid-user
如果require指令出现在
Satisfy
语法:Satisfy ‘any’│’all’
缺省值:Satisfy all
如果你既使用了Allow指令又使用了require,你可以用这条指令告诉Apache服务器哪些东西满足鉴权要求。Satisfy的值可以是all或any。使用all ,则只有在Allow指令和require 指令都满足的情况下才鉴权成功;如果使用any,Allow指令和require 指令中任何一条指令满足都可以使鉴权操作成功。
为了给用户user1进入访问,用命令:
#htpasswd –c /usr/local/apache/conf/users user1
为user1分配密码。如果想对一个特殊组保护一个目录,那么配置文件看上去就象下面这样:
AuthName Protected
AuthType basic
AuthUserFile /usr/local/apache/conf/users
AuthGroupFile /usr/local/apache/conf/group
require group managers
;
1.3.5 用户web目录
具有许多用户的网站有时允许用户管理Web树中他们自己的部分,用户管理的部分在他们自己的目录中。为此,需要使用如下的URL:
http://www.mydomain.com/~user
其中的“~user”实际上是用户目录中的一个目录别名。Alias命令和它不同,它只能吧一个特殊的伪目录映射到一个实际的目录中。本例是要把~user映射到/home/user/public_html之类的文件中。因为“用户”的数量可以是很多的,所以在这里某种宏是很有用的。这个宏是UserDir命令,前面已经介绍过。
UserDir命令用来指定用户home目录中的一个子目录,在这个子目录中,用户可以放置被映射到~user URL的内容。换句话说,Apache默认的:
UserDir public_html
将对下面的请求
http://www.mydomain.com/~paul/index.html
引起对下面的Linux文件的查找
/home/paul/public_html/index.html
所以在默认设置情况下,用户需要在自己的home目录中创建public_html,然后把他所有的网页文件放在该目录下即可,输入http://www.mydomain.com/~user即可进行访问。但是在具体实施时,请注意以下几点:
1.以root登录,以如下指令修改用户主目录权限:
#chmod 705 /home/username
让其他人有权进入该目录浏览。
2.由用户在自己的home目录中创建public_html目录,保证该目录也有正确的权限让其他人进入。
3.Apache默认的目录文件是index.html,不是index.htm,所以可以改变文件中的一行像下面这样:
text/html html htm
这样Apache就会读取用户的index.htm文件
4.用户自己在目录下创建的目录最好把权限设为0700,确保其他人不能进入访问。
1.3.6 虚拟主机
虚拟主机是一种在一台服务器上提供多台主机服务的机制。Apache实现了处理虚拟主机的非常简明的方法。Apache支持两种类型的虚拟主机,基于IP的虚拟主机及基于名称的虚拟主机。基于IP的虚拟主机对所有无论新旧的浏览器提供支持,而基于名称的虚拟主机因为需要最新的HTTP/1.1协议的支持,不能支持所有的浏览器。
本文推荐使用基于名称的虚拟主机,因为它允许用户创建无限多个主机。而对于基于IP的虚拟主机来说,由于用户网络IP的级别,限制了基于IP的虚拟主机的个数。例如,如果用户的IP 网络级别是C级,则共有256个IP地址,而且不是所有的IP地址都可以用于虚拟主机。
基于IP 的虚拟主机的配置
提供多台主机服务是通过对一台机器分配多个IP地址来实现的,然后将Apache捆绑到不同的IP地址上。对每一台虚拟主机提供唯一的IP地址。例如,一台Linux机器可能会有如下指向他的IP地址:202.112.10.2、202.112.10.3,我们可以将www1.host.com捆绑到第一个IP地址上,将www2.host.com捆绑到第二个IP地址上。下面介绍设置虚拟主机的具体做法。
我们通过httpd.conf来设置虚拟主机。假设服务器IP为202.112.10.1,要虚拟另一台IP地址为202.112.10.2,则加下面个行到/etc/rc.d/rc.local:
/sbin/ifconfig/ eth0:0 202.112.10.2
/sbin/route add –host 202.112.10.2 eth0:0
加下面各行到httpd.conf文件中:
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www1.host.com
ErrorLog /var/log/httpd/foldername/error.log
TransferLog /var/log/httpd/foldername/access_log
要虚拟多个基于IP的主机时,需要像上面那样为每个IP地址创建一个VirtualHost容器。例如:要添加www2.host.com的虚拟主机,则在httpd.conf文件中加下面各行。
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www2.host.com
ErrorLog /var/log/httpd/foldername/error.log
TransferLog /var/log/httpd/foldername/access_log
任何放置在VirtualHost之间的命令只属于对该虚拟主机的请求。在VirtualHost 容器之外的任何命令构成了对主服务器的配置。除非出现冲突,每一个虚拟主机都继承了主服务器的配置。如果在主服务器配置和虚拟主机的配置中都使用了同一个指令,在虚拟主机中的配置将覆盖主服务器的配置,但这仅仅对该虚拟主机有效。DocumentRoot指向一个目录,这个目录可能包含专用于虚拟主机的内容。
每一台虚拟主机都可以有它自己的访问记录、错误记录以及它自己的Redirect 和Alias 命令和自己的ServerName、ServerAdmin命令等。如下命令是Apache虚拟主机所不能支持的(即不能在
ServerType MaxRequestsPerChild UserId
BindAddress GroupId Pidfile
StartServersTypeConfig MaxSpareServers
ServerRoot MinSpareServers
基于名称的虚拟主机的配置
配置基于名称的虚拟主机,先要在httpd.conf文件中使用NameVirtualHost指令设置基于名称的虚拟主机的IP地址。例如,用户想在Apache服务器中配置名称为www.host1.com和www.host2.com两个虚拟主机,对应IP地址202.112.10.2。以下是配置实例:
NameVirtualHost 202.112.10.2
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www.host1.com
ServerAdmin your_email_address
DocumentRoot /usr/local/apache/foldername
ServerName www.host2.com
在设置好httpd.conf文件之后,还应该在DNS服务器中加入相应的虚拟主机的记录项。
基于IP 的虚拟主机的DNS配置
对于上面设置基于IP虚拟主机的例子,在DNS配置文件中添加如下记录:
www1.host.comINA202.112.10.2
www2.host.com IN A 202.112.10.3
;PTR Records
202.112.102.2INPTRwww1.host.com
202.112.102.3INPTRwww2.host.com
在DNS配置文件中创建了A(地址)PTR记录之后,需要重新启动DNS服务器来测试新建的配置。使用如下指令测试以上配置:
nslookup –query=a www.host.com
nslookup –query=ptr www.host.com
这两个虚拟主机的域名为host.com。第一个nslookup指令用于查找www.host.com的一个A记录;第二个nslookup指令用于在同一个主机中查找一个PTR记录。如果没有找到响应的信息,nslookup就重新访问DNS配置并检查语法错误。
基于名称的虚拟主机的DNS配置
基于名称的虚拟主机不需要唯一的IP地址。但需要为每一台虚拟主机创建一个CNAME(规范名称)。假设已经有了名为www.host.com的主机,并已经进行了合适的DNS配置。则对于上面的创建基于名称虚拟主机的例子,配置DNS如下:
www.host1.comINCNAMEwww.host.com
www.host2.comINCNAMEwww.host.com
同样可以用nslookup指令对刚添加的CNAME记录进行测试。对以上记录测试如下:
nslookup –query=cname www.host1.com
nslookup –query=cname www.host2.com
在DNS配置好之后,要使虚拟主机的配置生效,必须启动(或重启动)Apache服务器。而且,在此之前,不要忘记创建在虚拟主机配置中可能用到的目录。
虚拟主机配置的调试
使用Apache 1.3.x,用户可以看到Apache使用如下的指令对虚拟主机的配置进行分析:
./httpd-S
该指令的输出将显示Apache服务器中当前虚拟主机的配置。在运行上面的指令时,不需要关闭正在运行的Apache服务器。
1.4 Apache服务器的其他服务
1.4.1 CGI 脚本(php 、perl)
1.CGI配置
配置Apache来处理CGI请求,包括告诉Apache将CGI程序放在什么地方、为特定的文件扩展名设定CGI句柄、以及说明将哪些文件扩展名视为CGI程序。建议将CGI程序存储于一个目录下,以便对其进行更好的控制。最好将CGI程序目录放在你的DocumentRoot目录外面。这样就不可能对CGI程序直接访问,也就保证了你的站点具有更好的安全性。
一般情况下,CGI脚本文件都放入/home/httpd/cgi-bin目录中,需要使用CGI程序的html文档通过“/cgi-bin”来指定要调用的CGI程序。但如果要使脚本文件与相关的html文档在一起,则可以用ScriptAlias指令来指定新的脚本目录。
例如,html文件在目录/myhome/httpd/html中,CGI脚本在 /myhome/httpd/cgi-bin 中,使用命令:
ScriptAlias /mycgi/ /myhome/httd/cgi-bin
可以在任何html文件中,当需要使用/myhome/httpd/cgi-bin中的程序时,如abc.pl,就可以使用“/mycgi/abc.pl”来调用。
在由ScriptAlias 指定的目录中,Apache认为所有的文件都是用于执行,而不做一般文件处理。在这样的目录中,文件的名字不必具有如“.php”、“.pl”等可执行文件的后缀。但如果想要在ScriptAlias指定的目录之外执行这些程序,必须在Apache的配置文件中对执行程序的文件名后缀使用AddHandler进行说明,例如:
AddHandler cgi-script .php .pl
这样,Apache将把以“.php”、“.pl”为后缀的文件当作CGI脚本来运行。
为了使某个目录中以“.cgi”为后缀的文件能够执行,在Apache的配置文件中的相应目录下(由
有些时候,不希望目录中的所有“.cgi”文件都能被执行。例如,只让abc.cgi能执行,则可以使用模块mod_rewrite提供的功能,即在包含该文件的目录中,如htdocs/mydir加入“.htaccess”文件,文件内容如下:
RewriteEngine on
RewriteBase /mydir
RewriteRule ^abc.cgi\.cgi$-[T=application/x-httpd-cgi]
即把abc.cgi文件重写成具有CGI MIME类型的文件,从而能被服务器执行。
注意要在Apache的配置文件中将该目录的AllowOverride包含FileInfo,以便使在“.htaccess”文件中mod_rewrite模块的指令能够有效。
2.CGI程序的调试
为了帮助CGI开发者,Apache对CGI的输出进行记录。使用如下指令可以记录CGI的输出,这些指令在mod_cgi模块中。
ScriptLog
语法:ScriptLog filename
该指令设置记录CGI程序错误的日志文件名称。如果日志文件名是相对文件名(即,不是以/开头),则认为该日志文件位于相对由ServerRoot指令指定的服务器根目录中。
在使用该指令时,要保证用户使用UserDir指令指定的日志目录是可写的。最好在需要时才使用该指令并在调试结束后将其设置为OFF。
ScriptLogLength
语法:ScriptLogLength size
该指令限制由ScriptLog指令指定的日志文件的大小。脚本日志文件可以记录每个CGI错误的许多信息,因此,其大小也增长的很快。使用该指令,可以限制日志文件的大小,这样一旦日志文件达到最大长度,将不会对随后的信息进行记录。
ScriptLogBuffer
语法:ScriptLogBuffer size
该指令限制记录的POST或PUT数据的大小。
1.4.2 Apache的proxy服务
代理模块的编译
Apache里的proxy支持程序来自于mod_proxy模块,在缺省条件下,它不能被编译生成。如果你使用APACI接口安装Apache,那么添加代理模块需要在在你的Apache源代码目录下执行下面操作:
如果你是第一次运行配置脚本,输入下面命令
./configure –prefix=/你想要安装到的目录\ Apache –enable-module=proxy
如果你在编译Apache之前已经运行过配置脚本的话,执行下一条命令:
./config.status --enable-module=proxy
这样,前面的配置选项将被用到创建新的配置文件上来。
下一步是运行make命令。如果上一步没有出错,在安装选项里执行make命令,并在合适的目录下安装新编译Apache可执行文件,这样就添加了代理模块。
如果你不是使用APACI接口安装Apache,则必须要编辑src/Configuration文件以保证AddModule modules /proxy/libproxy.a这一行不被注释掉。修改完后再运行src/Configure脚本来建立新的Makefile。等到src/Configure执行完,再运行make命令。如果make命令成功运行,再回到Apache的根目录下,再次从安装选项里运行make命令,把这个新的Apache可执行文件安装到合适的目录上。
你可以在服务器的可执行目录中运行下面的命令来确认mod_proxy是否在输出中显示:
./httpd -l
代理模块的指令集
Apache的代理模块有以下指令。
ProxyBlock
语法:ProxyBlock
缺省值:None
这一命令可以终止对某一指定主机或域的访问控制,例如:
ProxyBlock cuckoo
这一命令终止了所有名称里有“cuckoo”的主机的访问。这样访问www.cuckoo.com.cn或cuckoo.game.com就无法实现。你也可以通过如下命令关闭对所有主机的访问:
ProxyBlock *
ProxyDomain
语法:ProxyDomain
缺省值:None
此这里为代理服务器指定缺省域名。当此域名设为intranet上的一个本地域时,任何不包括域名的请求都将以此域名作为缺省域名,例如:
ProxyDomain .bupt.com
当一个bupt.com的用户发出一个请求如http://cuckoo/us.html时,该请求将会被改变以指向下面的URL:
http://cuckoo.bupt.com/us.html
注意,你所指定的缺省域名前必须加一个句点。
ProxyPass
语法:ProxyPass
缺省值:None
此指令可以帮助你将一个Web服务器里的文件树型结构映射到你的代理服务器的文件系统里。例如,把以下语句加入到名为cuckoo.proxy.com的代理服务器的HTTP.CONF文件里:
ProxyPass /www/turbolinux http://www.turbolinux.com.cn
现在,你可以使用如下的URL来访问Turbolinux的站点:
http://cuckoo.proxy.com/www/turbolinuxt
其作用相当于为Turbolinux的站点建立了一个本地镜象。任何使用
ProxyRemote
语法:ProxyRemote
缺省值:None
你可以使用这条命令实现两台代理服务器之间的接口操作。
如果你要把某一Web站点的所有代理请求都直接发往它的代理服务器上,可以用下面的命令实现:
ProxyRemote http://www.cuckoo.com/ http://cuckoo.proxy.com
这条命令把所有与http://www.cuckoo.com/匹配的请求都送往http://cuckoo.proxy.com。
NoProxy
语法:NoProxy
缺省值:None
此命令用来在intranet 环境里对ProxyRemote命令的使用进行控制。你可以用它来指定一个域名、子网、IP地址或主机名,使在ProxyRemote命令指明的代理服务器不承担对它们的服务,例如:
ProxyRemote * http://cuckoo.proxy.com
NoProxy .proxy.com
第一句表示所有请求都发给http://cuckoo.proxy.com处理。而第二句则设置为所有对proxy.com的请求由局域代理服务器处理,而其它请求仍送往http://cuckoo.proxy.com处理。
ProxyPassReverse
语法:ProxyPassReverse
缺省值:None
用于建立逆向代理服务器。在逆向代理服务器的建立过程中,该命令根据Web服务器的实际返回值确定位置标志头。
ProxyRequests
语法:ProxyRequests off/on
缺省值:ProxyRequests off
你可以用这条命令来打开或关闭对代理访问的缓存服务。它不影响ProxyPass指令的作用。
ProxyReceiveBufferSize
语法:ProxyReceiveBufferSize
缺省值:None
此命令为从代理服务器送出的请求设置网络缓冲区的大小。字节数必须要大于512。但如果你使用系统的缺省缓冲区,则应用这条命令把它设为0。
CacheDefaultExpire
语法:CacheDefaultExpire
缺省值:CacheDefaultExpire 1
此命令提供一个缺省时间来销毁缓存的文件,这些文件的最后修改时间不详。
CacheDirLength
语法:CacheDirLength
缺省值:CacheDirLength 1
当磁盘处于开状态时,限制在CacheRoot指令规定的目录下建立的子目录名称的长度。
CacheDirLevels
语法:CacheDirLevels
缺省值:CacheDirLevels 3
设定了Apache用于建立和存储数据文件的子目录数。
CacheForceCompletion
语法:CacheForceCompletion
缺省值:CacheForceCompletion 90
CacheSize
语法:CacheSize
缺省值:CacheSize 5
此命令给出用于存储文件的磁盘空间,这些文件将存到CacheRoot指令规定的目录下。缺省设置不符合实际情况,本文推荐用户根据自己的负载设这为10MB 或1GB。
CacheGcInterval
语法:CacheGcInterval
缺省值:None
设定Apache经过多少时间(小时)检查文件缓存目录并删除过时的文件。同时它也是Apache强制执行CacheSize指令的时间。
CacheRoot
语法:CacheRoot
缺省值:None
用来进行磁盘缓存。你可以指定一个目录使代理服务器可以把写在缓存里的文件存储到磁盘上。对此目录必须具有写权限。
代理服务器的配置
要打开代理服务器,你必须把ProxyRequests设定为开(On)状态。在这之后,就可以根据你希望代理服务器实现的功能来增加配置。任何代理服务器配置语句都应放在
下面举例说明,如何配置代理服务器。
如果你有一套使用专有非路由IP地址的计算机网络,又想为这套系统提供诸如HTTP/FTP服务的国际互联网连接,那么你只需要一台有合法IP地址的计算机,并且它可以在代理模块里运行Apache。同时,这一台计算机必须在ProxyRequest设定为ON状态下运行Apache代理服务器,此外无须其它配置。所有的HTTP/FTP请求都可以由此代理服务器处理。
在这种配置情况下,代理服务器必须设为属于多个网络的,即它既可以访问非路由的个人网络、也可以访问可路由IP 网络。从一定程度上讲,这一台代理服务器可以作为这个个人网络的网络防火墙。
又如:因为大多数Internet和Intranet Web站点的内容都比较固定,因此把它们存储到局域代理服务器的高速缓存里将节省珍贵的网络带宽。一个开启缓冲区的代理服务器只有在缓冲区内包含过期文件或请求的文件不在缓冲区时才寻找并装入所请求的文件。你可以使用以下命令把你的代理服务器设置为这种工作状态:
CacheRoot /www/cache
CacheSize 1024
CacheMaxExpire 24
以上配置定义了一个有缓存功能的代理服务器,它把缓存的文件写入 /www/cache目录下。它允许写入1024K的数据(1MB),并且存储内容的生存时间为一天(24小时)。
1.5 Apache常见故障排除
由于Apache在/var/log/httpd目录下提供了访问记录文件access_log 以及出错文件error_log,所以当出现故障时,可以首先检查这些记录文件,一般故障都会在文件中指出。常出现的错误如文档路径错误、CGI脚本程序没有执行权限、CGI脚本程序本身有错误等。
如果故障属于服务器本身故障,可以使用下面的目录检查配置文件的设置:
检查配置文件句法 /usr/sbin/httpd –t
检查虚拟主机的配置/usr/sbin/httpd -S
小结
Apache服务器以功能强大、配置简单、使用代价小而博得了大量用户的青睐,很快成为使用最广泛的Web服务器。本文系统而全面的介绍了Apache服务器及其相关知识。
你可以在安装linux时选择安装Web Server,这样Apache服务器将自动安装;否则,可以使用configure脚本来安装。
每个希望能对Apache服务器进行熟练配置的技术人员都必须深入了解下面三个配置文件:access.conf、httpd.conf、srm.conf。你可以通过在配置文件中加入命令行来实现各种奇妙的功能,例如:设置服务器本身的信息、设定某个目录的功能和访问的控制信息、告诉服务器你想从你的Web服务器提供何种资源,以及从哪里、如何提供这些资源。
Apache服务器提供了很好的访问安全机制。对访问安全控制的讨论是本文的重点。你可以通过使用Allow、Deny、Option这三条指令将你的站点设置为需要根据客户主机名或IP地址限制访问。用户认证可以用来限制某些文档的访问权限,当我们将资源放在用户认证下面时,就可以要求用户输入名字和口令来获得对资源的访问。Apache服务器提供两种类型的虚拟主机:基于IP的虚拟主机和基于名称的虚拟主机。如同其他的Web服务器,Apache也提供了CGI、proxy服务。
关于apache服务器
如果配置Apache网站服务器
关于Apache服务器的问题。.
关于Apache服务器的问题。.
怎么配置PHP服务器(apache)?
Apache服务器如何使用ASP?
什么地方有Apache服务器下载?
apache服务器软件如何卸载?
apache 服务器在哪里可以下到?
Apache服务器是做什么用的?
关于linux下apache服务器的问题
Apache+PHP+MySQL服务器套件问题
winxp下怎么安装Apache服务器
用linux怎么配置apache服务器
Apache服务器显示网页代码什么原因?
关于apache服务器的配置问题
局域网中如何访问apache服务器
配置Apache服务器中出现的问题
电路探秘
宇宙探秘
怎样在一台服务器中装两个apache
谁有Apache 服务器的配置详细介绍
linux 如何设置 apache 服务器的开机自动运行
IBM e345中安装apache服务器要注意什么?