Linux Apache Web 服务器终极教程作者:佚名 文章来源:internet 根据著名的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服务并不需要太多的系统资 源,但是想要能为大量的客户提供服务就需要更多的系统资源。 获取软件 你可以在http://www.apache.org中获得Apache的最新版。而几乎所有的 Linux发行版中均包含有Apache软件包,你也可以直接使用它。 需要注意的是,Apache软件包有两种:一种是源代码,下载后需要自己重新编 译;另一种是可执行文件,下载后只需解压就可以使用。 安装软件 你可以通过以下三种方法安装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
本节将针对Apache中有关安全方面的设置做出详细的叙述,涉及到Apache的配置文件、Apache的目录访问控制、在Apache上运行CGI等安全方面的设置。 4.5.1 Apache的配置文件 对于RedHat Linux系统,Apache的配置文件放在/etc/httpd/conf/目录下。如果是自行编译安装的Apache,则视编译时指定的目录路径而定,默认是/usr/local/apache/conf。 在conf目录下有3个Apache的配置文件: httpd.conf access.conf srm.conf Apache启动时先调用httpd.conf,然后调用srm.conf,最后调用access.conf。但现代版本的Apache为避免管理和维护的混乱,已经改为将所有Apache的相关配置命令放在httpd.conf文件中,不再使用srm.conf和access.conf文件。虽然这两个文件仍然存在,但内容中没有任何配置命令,形同虚设。 httpd.conf文件分为以下3部分: Global Environment 'Main' server configuration Virtual Hosts 下面将讲述这3部分的用法和与安全相关的注意点。 4.5.1.1 Global Environment ServerType standalone 用来指定Apache的启动方式:standalone和inetd。standalone模式是Apache独立运行,也是默认的启动方式。inetd模式是守护进程监听http的连接请求才启动httpd进程,请求完毕后就结束httpd进程,这样服务器负担很重。 ServerRoot "/etc/httpd" Apache的目录,此处是存放配置、出错记录、日志文件的根目录。目录后面不要加“/”字符。 LockFile /var/lock/httpd.lock 保留默认值,不要更改。 PidFile /var/run/httpd.pid 指定记录Apache的父进程id的文件名及路径。 ScoreBoard /var/run/httpd.scoreboard 指定用于储存服务器进程处理信息的文件名和路径。 #ResourceConfig conf/srm.conf #AccessConfig conf/access.conf 在标准的配置中,服务器启动时会处理这两个文件。因为现在的Apache只使用httpd.conf文件,摒弃了srm.conf和access.conf文件,所以这两行用“#”注释掉。 Timeout 300 设置超时时间。如果远程客户端超过300秒还没连上Apache Server,或者Apache Server超过300秒没有传送字节给客户端,就立即断开连接。 KeepAlive On KeepAlive允许客户端的每个连接有多个请求,设为Off时此项无效。 MaxKeepAliveRequests 100 设置每次连接期间所允许的最大请求数目。设为0时表示允许无限制数目。设置数字越大,则服务器性能越高。 KeepAliveTimeout 15 设置等待同一个客户端的同一个连接发出下一个连接请求超过一定的时间就断线。 MinSpareServers 5 MaxSpareServers 20 设置最小的闲置服务处理程序的数目和最大的闲置服务处理程序的数目。如果实际数目少于MinSpareServers,则将增加处理程序;反之,如果实际数目超过MaxSpareServers,一些多余的处理程序将被杀掉。 StartServers 8 设置启动并初始化后启动服务进程的数目。 MaxClient 150 设置服务运行的总数量。一旦达到此数目,新来的客户端就被拒绝,所以该限制数目不能设得太小。 MaxRequestsPerChild 100 设置每个子程序处理结果前的要求数目,设为0表示不限制。 #Listen 3000 #Listen 12.34.56.78:80 Listen 80 设置Apache监听的连接端口或IP地址及端口,默认是80。 #BindAddress * 该选项用来支持虚拟主机,并告知服务器监听哪个IP地址。可以使用“*”,或具体的IP地址和完整的域名。 #LoadModule foo_module libexec/mod_foo.so DSO(Dynamic Shared Object)支持。DSO模块的概念和作用与Windows的DLL文件极其相似。 #ExtendedStatus On 当“server-status”管理程序被执行时,检查Apache的运行状态信息。默认是Off。 4.5.1.2 'Main' Server Configuration 如果在第一部分“Global Environment”中的ServerType命令设为inetd的话,那么这部分就没有任何效果,直接跳到ServerAdmin命令。 Port 80 设置Standalone服务器监听的连接端口,也可以设为其他端口,必须小于1 023。必须以root身份才能更改端口。 User apache Group apache 指定运行httpd的用户和用户组。必须首先以root身份指派。 ServerAdmin root@localhost 设置管理员的电子邮件地址,当Apache有问题时会自动发E-mail通知管理员。 #ServerName localhost 设置主机名称,可以用域名和IP地址。 DocumentRoot "/var/www/html" 设置Apache放置网页的目录路径。Options FollowSymLinks AllowOverride None 设置Apache能够访问的每一个目录被访问时所执行的动作。本章后面将详细叙述Apache的目录存取方法。 Options Indexes Include FollowSymLinks AllowOverride None Order allow, deny Allow from all 此处设置Apache的网页目录的执行动作。本章节后面将详细叙述目录的存取方法。AllowOverride None Options None Allow from all 此处可以防止用户创建自己的.htaccess文件。在这个文件中可以改变全局参数,以致会影响到整个系统的安全。可以在httpd.conf文件中加入的命令中都加上上面的代码。 UserDir public_html 设置用户在自己的目录下建立public_html放置网页,即/home/*/public_html/。这样在浏览器地址栏输入“http://Apache服务器/用户名/”就能显示网页。设置的目录必须告知用户,否则他们不知道网页放在什么地方。 DirectoryIndex index.html index.htm index.shtml index.php index.php4 index.php3 index.cgi 设置Apache的默认首页文档。 AccessFileName .htacess 指定控制存取的文件名称。Apache默认的是.htaccess。本章将在后面详细叙述该文件的用法。 Order allow,deny Deny from all 防止用户端看到ht开头的文件内容。因为.htaccess记载了相关信息,.htpasswd记载了密码信息,不允许其他人访问这些文件。 #CacheNegotiatedDocs 指定Proxy服务器是否将交互产生的文件存在Cache中。将该命令注释掉则是不指定。 UseCanonicalName On 设置是否使用标准的名称,默认是On。 TypeConfig /etc/mime.types 指定存放MIME文件类型的文件。 Default Type text/plain 如果Apache不能识别此文件类型时,则按照预设的格式显示,一般以文本文件显示。MIMEMagicFile conf/magic mod_mime_magic模块可以让Apache由文件内容决定其MIME类型。如果存在该模块,才会处理MIMEMagicFile这一段。上面3行是当没有该模块时就处理这一段。 HostnameLookups off 设置Apache是否向名称服务器解析该IP地址,记录此链接的名称(如Hacker.com.cn)。因为DNS解析要花一定时间,所以默认设为off,仅记录IP。 ErrorLog /var/log/httpd/error_log 指定Apache发生错误时记录文件的位置。如果在中没有指定记录文件,则用/var/log/httpd/error_log,否则使用 指定的文件。 LogLevel warn 指定记录的详细等级,有8个等级:debug、info、notice、warn、error、crit、alert和emerg。按从详细到简略排列。 LogFormat "%h %l %u %t\"%r"\"%>s%b\"{Referer}I"\"%{UserAgent}I\""combind Logformat"%h%l%u%t\"%r"\"%>s%b"common Logformat "%{Referer}I->%U"referer LogFormat"%{User-agent}I"agint 定义4种格式的别名:combind、commen、referer和agint。 #CustomLog /var/log/httpd/access_log common CustomLog /var/log.httpd/access_log combind 指定记录文件使用哪种自定义的格式。其他不使用的自定义格式将被注释掉。 以上是关于日志文件的,将在后面的Apache日志文件中详细叙述。 ServerSignature On 设为On,当Apache产生错误时,就在网页上显示Apache的版本信息、主机名称、端口等一行信息。设为Off,就不显示相关的信息。设为E-mail时,就有“mailto:”给管理员的超链接。 Alias/icons /"var/www/icons/" 使用较短的别名,其格式为:Alias 别名 原名。可以无限制地建立别名。注意别名的后面如果有“/”,那么在使用URL时也得有“/”。 ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" 和Alias类似,设置服务器脚本目录。 应该强制性地使用ScriptAlias命令来限定CGI程序位于某个或者某几个特定的位置。一般可以设置多个ScriptAlias。必须保证cgi-bin目录不在html目录下,这一点非常重要,这样可以防止黑客通过浏览它们而查看CGI程序。 IndexOptions FancyIndexing 以特定的图形显示文件清单。 AddIconByEncoding (CMP, /icons/compressed.gif) x-compress x-gzip …… DefaultIcon /icons/unknown.gif 指定显示文件清单时各种文件类型的对应图形。 4.5.1.3 Virtual Hosts 这部分是设置虚拟主机的。所谓虚拟主机,就是指一台服务器作为多域名的Web服务器。ISP经常通过一台服务器为其客户提供Web服务。而客户通常希望主页以自己的名字出现,而不是在该ISP的名字后面,因为使用单独的域名和根网址可以看起来更正式一些。传统上,用户必须自己设立一台服务器才能达到拥有单独域名的目的,然而这需要维护一个单独的服务器。很多小单位缺乏足够的维护能力,更为合适的方式是租用别人维护的服务器。ISP也没有必要为一个机构提供一个单独的服务器,完全可以使用虚拟主机的能力,使服务器为多个域名提供Web服务,而且不同的服务互不干扰,对外就表现为多个不同的服务器。虚拟主机就是解决这种问题的方案,使客户的域名实际指向ISP的同一台服务器。 1.Apache支持虚拟主机的方式 Apache有两种支持虚拟主机的方式。一是为每一个虚拟主机设置单独的httpd进程,二是为所有的主机设置一个单独的httpd进程。 为每一个虚拟机设置单独的httpd进程 在httpd.conf文件的第一部分Global Environment中的BindAddress命令或Listen命令就是用来指定虚拟主机的地址和端口的。 BindAddress命令用来指定单一的地址,可以使用域名或IP地址。该命令在httpd.conf文件中只能出现一次。 Listen命令可以让httpd进程监听多个地址或端口。反复使用Listen命令就能实现这个要求。 为所有的主机设置一个单独的httpd进程 这是一个常用的方法。用户只要维护一个httpd.conf文件。在此文件的第三部分Virtual Host中,用 命令来为所有的虚拟主机进行配置。有多个虚拟主机就有多个 段。在不同的虚拟主机的 段中可以指定不同的ServerAdmin、ServerName、DocumentRoot、ErrorLog和TransferLog。 2.虚拟主机的实现方式 虚拟主机有三种实现方式:以主机名称的方式虚拟、以IP的方式虚拟、以端口的方式虚拟。下面就举一个在httpd.conf的第三部分Virtual Host中实现上面提及的方式的例子。 以主机名称的方式虚拟 如果用户的一台服务器有多个域名,Virtual Host文件举例如下: NameVirtualHost 210.12.195.6 ServerAdmin [email protected] DocumentRoot /var/www/html/hacker ServerName hacker.com.cn ServerAdmin [email protected] DocumentRoot /var/www/html/pcfrient Servername pcfrient.com.cn 以IP的方式虚拟 注册域名是要花一笔费用的。解决方案是可以用IP的方式来虚拟。在Linux中可以为一个网卡捆绑两个IP地址。如服务器的地址是210.12.195.6,现在有一个IP地址210.12.195.9没有使用。将210.12.195.9捆绑到服务器的网卡中,执行下列命令: #ifconfig eth0:0 210.12.195.9 这样,服务器就有两个IP地址了。以IP的方式虚拟和以主机名称的方式虚拟类似,请看下面的例子: NameVirtualHost 210.12.195.6ServerAdmin [email protected] DocumentRoot /var/www/html/hacker ServerAdmin [email protected] DocumentRoot /var/www/html/pcfrient 以IP的方式虚拟不用NameVirtualHost命令。 以主机名称和IP的方式虚拟 就是上面的两个方式的结合。看下面的例子: NameVirtualHost 210.12.195.6ServerAdmin [email protected] DocumentRoot /var/www/html/hacker ServerName hacker.com.cn ServerAdmin [email protected] DocumentRoot /var/www/html/pcfrient 以端口的方式虚拟 http默认的端口是80,如果用户要开设另一个端口443作为另一个虚拟主机,举例如下: Listen 80 Listen 443ServerAdmin [email protected] DocumentRoot /var/www/html/hacker ServerAdmin [email protected] DocumentRoot /var/www/html/pcfrient 以不同的IP和端口的方式虚拟 该方式是以IP的方式虚拟和以端口的方式虚拟的结合。假设服务器捆绑了两个IP地址,210.12.192.6和210.12.195.9,后面的IP地址用端口443。举例如下: Listen 210.12.192.6:80 Listen 210.12.195.9:443ServerAdmin [email protected] DocumentRoot /var/www/html/hacker ServerAdmin [email protected] DocumentRoot /var/www/html/pcfrient