Quick HOWTO : Ch20 : The Apache Web Server/zh

出自Ubuntu中文



目录

介绍

Apache 可能是最流行的基于Linux的并在使用中的Web服务器应用程序。只要你正确的设置了DNS,并且你的服务器能够访问互联网,你就需要配置Apache,使它可以接受等待访问你的网站的浏览者的访问。

本章解释在一些小网站通常遇见的场景如何配置Apache。

下载和安装Apache

大多数的RedHat和Fedora Linux软件产品可以以RPM格式得到。当你搜索安装文件时,请记住Apache的RPM包的名字通常以httpd开头,后面跟着的是版本号,例如httpd-2.0.48-1.2.rpm。最好是使用最新版本的Apache。 (想了解更多关于RPMs,则请参见第6章, "Installing Linux Software").

在搜索安装文件时,请记住Redhat / Fedora中Apache RPM包的名字通常以httpd开头,后面跟着版本号,例如httpd-2.0.48-1.2.rpm。Ubuntu / Debian中Apache包则取而代之含有apache前缀。

注意: 除非特别注明,本章中提到的示例配置都是针对Redhat / Fedora发行版。如果你使用Debian / Ubuntu也不用担心,将会有注解提示你它们的不同之处。

如何开始运行Apache

设置Apache服务器是容易的,但是这个过程却因不同的Linux发行版本而有所差异。

Redhat / Fedora

使用chkconfig命令设置Apache在系统启动时启动:

   [root@bigboy tmp]# chkconfig httpd on

使用 httpd 初始化脚本(这个脚本在/etc/init.d 目录中)在启动之后来启动、停止和重启Apache:

   [root@bigboy tmp]# /etc/init.d/httpd start
   [root@bigboy tmp]# /etc/init.d/httpd stop
   [root@bigboy tmp]# /etc/init.d/httpd restart

你可以用下面的命令测试是否Apache进程正在运行:

   [root@bigboy tmp]# pgrep httpd

你应该得到一个普通的旧的进程ID号码。

Debian / Ubuntu

使用 sysv-rc-conf 命令来设置Apache在系统启动时启动:

   [root@u-bigboy tmp]# sysv-rc-conf apache on

使用 httpd 初始化脚本(这个脚本在/etc/init.d 目录中)在启动之后来启动、停止和重启Apache:

   [root@u-bigboy tmp]# /etc/init.d/apache start
   [root@u-bigboy tmp]# /etc/init.d/apache stop
   [root@u-bigboy tmp]# /etc/init.d/apache restart

你可以用下面的命令测试是否Apache进程正在运行:

   [root@u-bigboy tmp]# pgrep apache

你应该得到一个普通的旧的进程ID号码。

为Apache配置DNS

请记住,除非你已经把你的新的Linux Web 服务器作为在DNS域中www项的目标,否则你不可能得到正确的数据传输。如何配置DNS请参考18章, "Configuring DNS",或19章, "Dynamic DNS"。

DHCP与Apache

你需要记住的是,如果你的互联网连接使用DHCP来获得IP地址的话,那么你需要使用动态DNS使你的Web服务器能够获得正确的DNS项。 如果你的Web服务器和防火墙位于不同的计算机上,那么你可能还需要为你的Web数据传输设置端口转发,使之能够到达正确的Web服务器。 (19章, "Dynamic DNS",也解释了端口转发。)。

在你受保护的家庭网络里的DHCP是不同于以上的。 在本书中的示例拓扑为,Web服务器存在于192.168.1.0,家庭网络由一个防火墙保护。 这个防火墙使用NAT和端口转发使互联网数据传输到Web服务器。请记住,如果你的Web服务器使用DHCP获得地址的话,它的IP地址会发生改变。这可能引起你的防火墙端口转发出现中断,而不是动态DNS。

在这种情况下,推荐你在192.168.1.0网络中的Web服务器使用固定的或静态的在DHCP服务器分配地址范围之外的IP地址。 这样可以避免上面的问题出现。

一般配置步骤

在Redhat / Fedora发行版中Apache使用的配置文件是 /etc/httpd/conf/httpd.conf ,在Debian / Ubuntu发行版中是 /etc/apache*/httpd.conf。 同大多数的Linux应用程序一样,在对配置文件的更改生效前,你必需重启Apache。

你的网页放到哪里

所有的定义每个网站特性的声明都放在它们自己的 <VirtualHost>部分,或在httpd.conf文件中的容器内。在 <VirtualHost>容器中最常用到的声明或指令是:

  • servername:定义被<VirtualHost>容器管理的网站的名字。在命名虚拟主机中需要这个命令, 我将稍后解释。
  • DocumentRoot:定义在哪个目录中可以找到网页。

默认情况下,Apache搜索DocumentRoot目录,来寻找索引,或名叫 index.html网页。例如,如果你有个叫www.my-site.com 的服务器名,它的DocumentRoot 目录为/home/www/site1/。当你在浏览器中输入http://www.my-site.com时,Apache将显示 /home/www/site1/index.html文件的内容。

某些网页编辑器,如Microsoft FrontPage创建的文件后缀名为.htm而不是.html。如果你的HTML文件的连接指向以.htm结尾的文件,如用FrontPage产生的文件,通常这也不会产生问题。但是Apache不能识别最上级的index.htm网页。最简单的解决办法是创建一个叫index.html的符号链接(对于windows用户来说是个快捷方式),这个链接指向index.htm。这样当你编辑或复制index.htm时,index.html会自动更新。你就再也不用担心index.html和Apache了。

这个例子创建了一个到/home/www/site1目录下index.html的符号链接。

    [root@bigboy tmp]# cd /home/www/site1
    [root@bigboy site1]# ln -s index.htm index.html
    [root@bigboy site1]# ll index.*
    -rw-rw-r--    1 root     root        48590 Jun 18 23:43 index.htm
    lrwxrwxrwx    1 root     root            9 Jun 21 18:05 index.html -> index.htm
    [root@bigboy site1]#

在index.html项最开头的l表示一个链接,->表示链接目标。

默认文件位置

默认情况下,Apache会按照httpd.confDocumentRoot的声明在/var/www/html/目录下寻找全部网页文件。本章中的例子使用/home/www目录来阐释你如何能成功地将它们放置在其他的位置。

文件权限与Apache

Apache会显示所有可读的网页文件。你必须确认你已经为DocumentRoot目录下的文件以及子目录文件夹设置正确的权限。

将文件的拥有者设置成非特权用户是个不错的主意,这样的话网站开发者就不需要root用户密码来使用ftp或者scp。

要做到这个,

  1. 新建一个拥有/home/www目录的新用户。
  2. 使用递归方式来改变/home/www下文件和子目录的文件所有权。
  3. /home/www的权限属性改成755,以便让所有用户,包括apache的httpd daemon来读取里面的文件
    [root@bigboy tmp]# useradd -g users www
    [root@bigboy tmp]# chown -R www:users /home/www
    [root@bigboy tmp]# chmod 755 /home/www

现在让我们用ll命令来测试新的文件所有权

    [root@bigboy tmp]# ll /home/www/site1/index.*
    -rw-rw-r--    1 www     users       48590 Jun 25 23:43 index.htm
    lrwxrwxrwx    1 www     users           9 Jun 25 18:05 index.html -> index.htm
    [root@bigboy tmp]#

注意:请确认在用ftp或者scp上传文件的时候使用刚刚新建的那个用户,这样所有上传的文件都会拥有正确的文件拥有权。

如果你在设置apache完毕后用浏览你的网站还是看到"403 forbidden"有关权限的错误信息,那么你的DocumentRoot下的文件或者目录很有可能拥有错误的权限。附录 II, "代码, 脚本, 以及 设置," 有一个很短的脚本可以让你用递归的方式设置apache所需要的文件权限。如果你已经把文件都放在了默认的/home/www目录中,那么上面的第二步就不必要了。

网页的安全上下文环境

Fedora Core 3引入了安全上下文的概念,并把它作为安全加强的Linux (SELinux)的一部分。 (详见附录 I, "各种 Linux 话题"。) 某一网页可能有正确的权限,但是除非你已经指定了正确的安全上下文或daemon访问权限,Apache httpd daemon还是不能正确的读取该页面。上下文相关的配置错误会在浏览器中显示 "403 Forbidden" 信息,在某些情况下,你会得到默认的Fedora Apache页面,该页面时你希望的页面应该存在的地方。

当一个文件被创建后,它将继承它的父目录的安全上下文。如果你决定将你的网页放置在默认的 /var/www/目录,它们将继承该目录的上下文,并且你也不会有太多的麻烦。

某一文件的上下文依赖于它被给定的SELinux标签。表20-1列出了最重要的安全标签类型。

表 20-1 SELinux的安全上下文环境文件标记

上下文代码 描述
httpd_sys_content_t 常规的以.html和.htm为扩展名的静态网页所使用的类型。
httpd_sys_script_ro_t CGI脚本读取文件和目录所需。
httpd_sys_script_ra_t 和httpd_sys_script_ro_t类型相同,但它还允许CGI脚本附加的数据。
httpd_sys_script_rw_t 该类型的文件可以使用CGI脚本以任何方式更改,包括删除。
httpd_sys_script_exec_t 这类文件是CGI脚本执行时所需要的。

当网页需要放置在非Apache默认的目录下时,安全上下文果然便得很重要。本例中用户root创建了一个目录 /home/www/site1,某一新网站的网页将放置在这个目录中。使用 ls -Z 命令,你可以看到user_home_t security标签被赋值为这个目录,并且 index.html页面也创建在这个目录中。Apache不能访问这个标签。

    [root@bigboy tmp]# mkdir /home/www/site1
    [root@bigboy tmp]# ls -Z /home/www/
    drwxr-xr-x  root     root     root:object_r:user_home_t    site1
    [root@bigboy tmp]# touch /home/www/site1/index.html
    [root@bigboy tmp]# ls -Z /home/www/site1/index.html
    -rw-r--r--  root     root     root:object_r:user_home_t
    /home/www/site1/index.html
    [root@bigboy tmp]#

当通过浏览器访问index.html文件时得到"Forbidden 403"错误,即使所有的权限都是正确的。察看/var/log/httpd/error_log日志文件,有"Permission Denied" 的信息,并且/var/log/messages文件显示了内核审计错误。

[root@bigboy tmp]# tail /var/log/httpd/error_log 
[Fri Dec 24 17:59:24 2004] [error] [client 216.10.119.250] (13)Permission denied: access to / denied
[root@bigboy tmp]# tail /var/log/messages
Dec 24 17:59:24 bigboy kernel: audit(1103939964.444:0): avc:   denied  { getattr } for  pid=2188 exe=/usr/sbin/httpd path=/home/www/site1 dev=hda5 ino=73659 scontext=system_u:system_r:httpd_t tcontext=root:object_r:user_home_t tclass=dir
[root@bigboy tmp]#

SELinux 安全上下文标签可以使用 chcon 命令更改。识别出错误,然后以root身份使用chcon 命令,加上 -R (recursive) -h (modify symbolic links)选项,使用 -t 选项修改来修改目录的标签 httpd_sys_content_t

[root@bigboy tmp]# chcon -R -h -t httpd_sys_content_t /home/www/site1
[root@bigboy tmp]# ls -Z /home/www/site1/
-rw-r--r--  root     root     root:object_r:httpd_sys_content_t index.html
[root@bigboy tmp]#

现在浏览将不会再有错误。不用再为目录使用root身份运行 chcon 命令,因为在这个目录中新建的文件将继承父目录的SELinux安全标签。如果文件/home/www/site1/test.txt存在,你就可以看见。

[root@bigboy tmp]# touch /home/www/site1/test.txt
[root@bigboy tmp]# ls -Z /home/www/site1/ 
-rw-r--r--  root     root     root:object_r:httpd_sys_content_t index.html
-rw-r--r--  root     root     root:object_r:httpd_sys_content_t test.txt
[root@bigboy tmp]#

CGI脚本的安全上下文环境

指定虚拟宿机主=

指定虚拟宿主机例子

基于IP的虚拟宿主机

IP虚拟宿主机例子:单一通配符

IP虚拟宿主机例子:通配符与IP地址

有关虚拟宿主机和SSL的一个注意点=

配置 - 多站与IP地址

表20-2网页宿主机方案摘要

在确定DNS之前,测试你的网站

禁止目录浏览

处理缺页

在网页上使用数据压缩

压缩配置例子

Apache运行在一个处于NAT防火墙之后的服务器

步骤1:配置虚拟宿主机多个IP

步骤2:配置DNS查看功能

如何使用密码保护网页目录

conf.d目录

Apache问题与解决

测试基本HTTP可连接性

403禁止浏览信息

只显示默认Apache页面

当更新时,httpd.conf文件不兼容

服务器名字错误

Apache状态记录文件

表20-3Apache记录文件格式

表20-4HTTP状态代码

Apache错误记录文件

结论