apache服务器
6.3 WWW服务器现在要开始我们的重点内容了:www server。目前能做www server的程序很多,在UN
IX下较常见的免费服务器就有很多种,例如NSCA,Apache等等。我们讨论的将是世界上
最常用的一种,即Apache Server。
6.3.1 Apache服务器
按照apache开发组的说法,Apache代表“A patched Server”,因为它是在更古老的
一些服务程序上通过一连串的补丁开发出来的。除非你买的是sun那样的系统,否则几乎
每个UNIX发行商都可以免费提供apache的源代码或者是可以安装的软件包。几乎所有的
Linux发行版本都会附带apache的软件包或者源代码,当然你也可以到任何能够提供UNI
X系统应用的ftp站点去下载这个东西,所以我不想告诉你如何去下载它的代码了。
可以取得的apache软件包可以是目标代码形式或者源代码方式,我们这里假定你用的
是rpm包,例如redhat或者turbo Linux附带的apache rpm包。以下说明的内容将适用于
这种rpm的缺省设置,特别是缺省目录设置,在后面我们将解释apache的编译,在那里我
们将讨论目录设置和模块设置等功能。
Apache的缺省配置文件放在/etc/httpd/conf下面,在较早的版本中,配置被分成几个
文件,如/etc/httpd/conf/httpd.conf,/etc/httpd/conf/srm.conf和/etc/httpd/con
f/access.conf。在较新的apache版本中,建议你只使用一个配置文件,即/etc/httpd/
conf/httpd.conf。我们将主要的讨论比较新的这种配置方式。我的版本是apache-1.3.
9。特别需要注意的是,如果你的系统配置目录中除了httpd.conf之外还有srm.conf和a
ccess.conf的话,那么系统缺省要去察看这两个文件。因此,建议你将这两个文件从系
统上删除。
/etc/httpd/conf/httpd.conf文件相当长,我们首先介绍基本的内容,在设置apache
的工作中,第一个任务是设置html文档的位置。
新的httpd.conf一般被分成几个段落,第一部分是全局变量的位置,按照我们习惯的
方式,将在缺省的httpd.conf上进行必要的修改,下面列出一些我们比较感兴趣的选择
:
ServerType
这个选项用来设置你的apache如何启动,它有两个选择,即standalone和inetd。sta
ndalone表示你的服务器程序是直接作为服务器守护进程启动,而inetd表示apache服务
器将在inetd程序中启动。一般我们总是建议用standalone方式,因为inetd在请求较多
的时候会出现一些问题。即使用ServerType standalone子句。
ServerRoot "/home/httpd"
设置Apache的缺声运行路径。不过,除非你在某些配置选项中使用相对路径,否则它
从来不会影响什么。
ErrorLog
CustomLog
这两行设置缺省的记账文件的位置,errorlog和customlog分别是出错信息和正常工作
信息的记录地点,例如
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/access_log common
Port
这个参数指明http服务器使用的端口,缺省值是80,当然你也可以选择其他的端口,
但是这意味着你在连接的时候必须明确地指出使用的端口。
范例:
Port 80
User
Group
设置服务器运行时使用的身份,通常我们为了安全,总是要把它设置成nobody,如:
User nobody
Group nobody
ServerAdmin
这个选项用来设置当服务器出现问题时,用来反馈问题的邮件地址,例如
ServerAdmin webmaster@mydomain.com
ServerName
通常apache服务器会从域名服务信息中得到服务器的域名,但是你也可以使用这个选
项来避免域名服务器出错时apache失效。例如
ServerName www.mydomain.com
DocumentRoot
这个选项设置缺省的服务器使用的html文件的位置,例如:下面的一行
DocumentRoot "/home/httpd/html"
意味着 http://www.mydomain.com/xxx.html 被解释为/home/httpd/html/xxx.html。
ScriptAlias
定义CGI脚本目录,例如
ScriptAlias /cgi-bin/ “/home/httpd/cgi-bin”
定义CGI脚本应该放在/home/httpd/cgi-bin/目录下,而反映在浏览器中的目录是/cg
i-bin/。
DirectoryIndex
这个选项定义缺省的主页文件,例如,DirectoryIndex index.html意味着http://ww
w.mydomain.com/将显示/home/httpd/html/index.html。
index.html
Alias
建立目录别名,例如
Alias /ftp/ “/home/httpd/html/ftp/”
UserDir
用宿主目录作为html目录。参考6.3.2节。
AccessFileName
定义身份控制的文件名,通常总是设置成为AccessFileName .htaccess
AddType
AddHandler
这两个选项用来加入各种文件映射,或者说MIME类型。通常AddType设定某种特定的文
件类型对应某个特定的扩展名字,而AddHandler则为这种类型定义一个处理程序。例如
,AddHandler cgi-script .cgi表示无论在什么地方,凡是看上去是一个.cgi的扩展名
的程序就作为CGI脚本执行(应该避免,对吗?不过对于那些~user的目录你可能只能用
这个办法了。好在还有一个options ExecCGI也对可以执行cgi的目录进行限制)
另外的一个常用的设定是
AddType text/html .shtml
AddHandler server-parsed .shtml
这两行允许服务器处理那些.shtml并且将它翻译成html送出。
显然,我们现在的任务主要是修改DocumentRoot和ScriptAlias,DirectoryIndex,写
一个简单的html文件,放到缺省的主页目录里,例如/home/httpd/html/index.html,设
置其属性为755,然后就可以启动apache了:
/usr/sbin/apachectl start
或者
/usr/sbin/httpd
如果是重新启动apache,执行/usr/sbin/apachectl restart或者killall –HUP ht
tpd。然后在浏览器中就可以实验页面服务是否可以使用了。如果apache抱怨找不到htt
pd.conf,可以执行
httpd –f /etc/httpd/httpd.conf
6.3.1 目录管理
如同其他所有的网络服务一样,Apache同样使用各种安全性控制,例如存取地址控制
和身份控制。这里我们先讲地址和目录控制。
Apache将目录作为单元来进行存取控制,每个目录在/etc/httpd/conf/httpd.conf中
使用一个段落,首先的是/目录,这实际是设置缺省值:
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
每个段落都是由这样的两组尖括号构成的行夹起来的,其中最主要的句子是Options,
AllowOverride,Allow/Deny,Order等。
Options
这个子句用来说明一些主要的设置,目前可以使用的设置有Indexes,Includes,Fol
lowSymLinks,ExecCGI,MultiView,当然还有两个最简单的选择就是None和All。None
是禁止所有选择,而All允许上面的所有Options。一般我们主要关心的是Indexes和Fol
lowSymLinks。Indexes是设定是否允许在目录下面没有index.html的时候显示目录,而
FollowSymLinks决定是否可以通过符号连接跨越DocumentRoot。例如,尽管/ftp不在/h
ome/httpd/html下面,但是我们仍然可以使用符号连接建立一个/home/httpd/html/ftp
使得可以直接输入http://mydomain.com/ftp来访问这个目录。
使用FollowSymLinks的办法很简单,就是首先在合适的目录段落里面Options Follow
SymLinks,(符号连接的上层就可以)然后建立一个别名:
Alias /ftp/ “home/httpd/html/ftp/”
后面的是你建立的到/ftp的符号连接。注意这一行应该位于所有目录段落之外。
AllowOverride
AllowOverride定义是否允许各个目录用目录中的.htaccess(后面解释)覆盖这里设定
的Options。它的选择有Options,FileInfo,AuthConfig,Limit或者它们的组合,当然
还有None和All。
由于/是缺省设置,所以这里没有设置太多的内容,相反,我们应该在/之后独立设置
各个目录的控制,例如:
<Directory "/home/httpd/html">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Dir