Quick HOWTO : Ch20 : The Apache Web Server/zh
出自Ubuntu中文
| 点击翻译: |
English • 中文 |
目录 |
介绍
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.conf中DocumentRoot的声明在/var/www/html/目录下寻找全部网页文件。本章中的例子使用/home/www目录来阐释你如何能成功地将它们放置在其他的位置。
文件权限与Apache
Apache会显示所有可读的网页文件。你必须确认你已经为DocumentRoot目录下的文件以及子目录文件夹设置正确的权限。
将文件的拥有者设置成非特权用户是个不错的主意,这样的话网站开发者就不需要root用户密码来使用ftp或者scp。
要做到这个,
- 新建一个拥有
/home/www目录的新用户。 - 使用递归方式来改变
/home/www下文件和子目录的文件所有权。 - 将
/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]#
