Apache服务器

  
Apache 服务器
Apache 服务器的设置文件位于 /usr/local/apache/conf/ 目录下,传统上使用三个配置文件 httpd.conf,access.conf srm.conf ,来配置 Apache 服务器的行为。
httpd.conf 提供了最基本的服务器配置,是对守护程序 httpd 如何运行的技术描述; srm.conf 是服务器的资源映射文件,告诉服务器各种文件的 MIME 类型,以及如何支持这些文件; access.conf 用于配置服务器的访问权限,控制不同用户和计算机的访问限制;这三个配置文件控制着服务器的各个方面的特性,因此为了正常运行服务器便需要设置好这三个文件。
  除了这三个设置文件之外, Apache 还使用 mime.types 文件用于标识不同文件
对应的 MIME 类型, magic 文件设置不同 MIME 类型文件的一些特殊标识,使得 Apache 服务器从文档后缀不能判断出文件的 MIME 类型时,能通过文件内容中的这些特殊标记来判断文档的 MIME 类型。
bash-2.02$ ls -l /usr/local/apache/conf
total 100
-rw-r--r-- 1 root wheel 348 Apr 16 16:01 access.conf
-rw-r--r-- 1 root wheel 348 Feb 13 13:33 access.conf.default
-rw-r--r-- 1 root wheel 30331 May 26 08:55 httpd.conf
-rw-r--r-- 1 root wheel 29953 Feb 13 13:33 httpd.conf.default
-rw-r--r-- 1 root wheel 12441 Apr 19 15:42 magic
-rw-r--r-- 1 root wheel 12441 Feb 13 13:33 magic.default
-rw-r--r-- 1 root wheel 7334 Feb 13 13:33 mime.types
-rw-r--r-- 1 root wheel 383 May 13 17:01 srm.conf
-rw-r--r-- 1 root wheel 357 Feb 13 13:33 srm.conf.default
  事实上当前版本的 Apache 将原来 httpd.conf srm.conf access.conf 中的所有配置参数均放在了一个配置文件 httpd.conf 中,只是为了与以前的版本兼容的原因(使用这三个设置文件的方式来源于 NCSA-httpd ),才使用三个配置文件。而提供的 access.conf srm.conf 文件中没有具体的设置。
  由于在新版本的 Apache 中,所有的设置都被放在了 httpd.conf 中,因此只需要调整这个文件中的设置。以下使用缺省提供的 httpd.conf 为例,解释 Apache 服务器的各个设置选项。然而不必因为它提供设置的参数太多而烦恼,基本上这些参数都很明确,也可以不加改动运行 Apache 服务器。但如果需要调整 Apache 服务器的性能,以及增加对某种特性的支持,就需要了解这些设置参数的含义。
  关于 Apache 服务器的性能,在 Internet 上存在很大的争议,基本上使用 Apache 的使用者几乎都不怀疑它的优秀性能, Apache 也支撑了很多著名的高负载的网站,但是在商业机构的评测中, Apache 往往得分不高。很多人指出,在这些评测中,商业 Web 服务器及其操作系统往往由其专业公司的工程师进行过性能调整,而 Free 的操作系统和 Web 服务器往往就使用其缺省配置或仅仅作很小的更改。需要指出的是,除了操作系统的性能调整之外, Apache 服务器本身的缺省配置绝不是最优化和最高效的,而是要适应几乎所有种类操作系统、所有种类硬件下的设置,多平台的软件不可能为特定平台和特定硬件提供最优化的缺省配置。因此要使用 Apache 的时候,性能调整是必不可少的。
  在商业评测中忽略了的另一个事实是,评测时往往对不同种类的功能进行比较,例如使用 Apache 的标准 CGI 的性能与 ISAPI NSAPI 等服务器端 API 比较,事实上 Apache 服务器与此可以比较的功能为 modperl FastCGI ,与 ASP 类似的功能为 PHP 等等,只不过由于 Apache 的开放模式,这些功能是由独立的开发组,作为独立的模块来实现的。但是在评测中,测试人员没有加入相应的模块评测其性能。
HTTP 守护进程的运行参数
   httpd.conf 中首先定义了一些 httpd 守护进程运行时需要的参数,来决定其运行方式和运行环境。
   ServerType standalone
   ServerType 定义服务器的启动方式,缺省值为独立方式 standalone httpd
服务器将由其本身启动,并驻留在主机中监视连接请求。在 Linux 下将在启动文件 /etc/rc.d/rc.local/init.d/apache 中自动启动 Web 服务器,这种方式是推荐设置。
  启动 Apache 服务器的另一种方式是 inet 方式,使用超级服务器 inetd 监视连接请求并启动服务器。当需要使用 inetd 启动方式时,便需要更改为这个设置,并屏蔽 /etc/rc.d/rc.local/init.d/apache 文件,以及更改 /etc/inetd.conf 并重起 inetd ,那么 Apache 就能从 inetd 中启动了。
  两种方式的区别是独立方式是由服务器自身管理自己的启动进程,这样在启动时能立即启动服务器的多个副本,每个副本都驻留在内存中,一有连接请求不需要生成子进程就可以立即进行处理,对于客户浏览器的请求反应更快,性能较高。而 inetd 方式要由 inetd 发现有连接请求后才去启动 http 服务器,由于 inetd 要监听太多的端口,因此反应较慢、效率较低,但节约了没有连接请求时 Web 服务器占用的资源。因此 inetd 方式只用于偶尔被访问并且不要求访问速度的服务器上。事实上 inetd 方式不适合 http 的突发和多连接的特性,因为一个页面可能包含多个图象,而每个图象都会引起一个连接请求,即使虽然访问人数造成教少,但瞬间的连接请求并不少,这就受到 inetd 性能的限制,甚至会影响由 inetd 启动的其他服务器程序。
   ServerRoot "/usr/local"
   ServerRoot 用于指定守护进程 httpd 的运行目录, httpd 在启动之后将自动将进程的当前目录改变为这个目录,因此如果设置文件中指定的文件或目录是相对路径,那么真实路径就位于这个 ServerRoot 定义的路径之下。
  由于 httpd 会经常进行并发的文件操作,就需要使用加锁的方式来保证文件操作不冲突,由于 NFS 文件系统在文件加锁方面能力有限,因此这个目录应该是本地磁盘文件系统,而不应该使用 NFS 文件系统。
   #LockFile /var/run/httpd.lock
   LockFile 参数指定了 httpd 守护进程的加锁文件,一般不需要设置这个参数, Apache 服务器将自动在 ServerRoot 下面的路径中进行操作。但如果 ServerRoot NFS 文件系统,便需要使用这个参数指定本地文件系统中的路径。
   PidFile /var/run/httpd.pid
   PidFile 指定的文件将记录 httpd 守护进程的进程号,由于 httpd 能自动复制其自身,因此系统中有多个 httpd 进程,但只有一个进程为最初启动的进程,它为其他进程的父进程,对这个进程发送信号将影响所有的 httpd 进程。 PidFILE 定义的文件中就记录 httpd 父进程的进程号。
   ScoreBoardFile /var/run/httpd.scoreboard
   httpd 使用 ScoreBoardFile 来维护进程的内部数据,因此通常不需要改变这个参数,除非管理员想在一台计算机上运行几个 Apache 服务器,这时每个 Apache 服务器都需要独立的设置文件 htt pd.conf ,并使用不同的 ScoreBoardFile
   #ResourceConfig conf/srm.conf
   #AccessConfig conf/access.conf
  这两个参数 ResourceConfig AccessConfig ,就用于和使用 srm.conf access.conf 设置文件的老版本 Apache 兼容。如果没有兼容的需要,可以将对应的设置文件指定为 /dev/null ,这将表示不存在其他设置文件,而仅使用 httpd.conf 一个文件来保存所有的设置选项。
   Timeout 300
   Timeout 定义客户程序和服务器连接的超时间隔,超过这个时间间隔(秒)后服务器将断开与客户机的连接。
   KeepAlive On
  在 HTTP 1.0 中,一次连接只能作传输一次 HTTP 请求,而 KeepAlive 参数用于支持 HTTP 1.1 版本的一次连接、多次传输功能,这样就可以在一次连接中传递多个 HTTP 请求。虽然只有较新的浏览器才支持这个功能,但还是打开使用这个选项。
   MaxKeepAliveRequests 100
   MaxKeepAliveRequests 为一次连接可以进行的 HTTP 请求的最大请求次数。将其值设为 0 将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。
   KeepAliveTimeout 15
   KeepAliveTimeout 测试一次连接中的多次请求传输之间的时间,如果服务器已经完成了一次请求,但一直没有接收到客户程序的下一次请求,在间隔超过了这个参数设置的值之后,服务器就断开连接。
MinSpareServers 5MaxSpareServers 10
  在使用子进程处理 HTTP 请求的 Web 服务器上,由于要首先生成子进程才能处理客户的请求,因此反应时间就有一点延迟。但是, Apache 服务器使用了一个特殊技术来摆脱这个问题,这就是预先生成多个空余的子进程驻留在系统中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。在运行中随着客户请求的增多,启动的子进程会随之增多,但这些服务器副本在处理完一次 HTTP 请求之后并不立即退出,而是停留在计算机中等待下次请求。但是空余的子进程副本不能光增加不减少,太多的空余子进程没有处理任务,也占用服务器的处理能力,因此也要限制空余副本的数量,使其保持一个合适的数量,使得既能及时回应客户请求,又能减少不必要的进程数量。
  因此就可以使用参数 MinSpareServers 来设置最少的空余子进程数量, 以及
使用参数 MaxSpareServers 来限制最多的空闲子进程数量,多余的服务器进程副本就会退出。根据服务器的实际情况来进行设置,如果服务器性能较高,并且也
被频繁访问,就应该增大这两个参数的设置。对于高负载的专业网站,这两个值
应该大致相同,并且等同于系统支持的最多服务器副本数量,也减少不必要的副
本退出。
   StartServers 5
   StartServers 参数就是用来设置 httpd 启动时启动的子进程副本数量,这个参数与上面定义的 MinSpareServers MaxSpareServers 参数相关,都是用于启动空闲子进程以提高服务器的反应速度的。这个参数应该设置为前两个值之间的一个数值,小于 MinSpareServers 和大于 MaxS pareServers 都没有意义。
   MaxClients 150
  在另一方面,服务器的能力毕竟是有限的,不可能同时处理无限多的连接请
求,因此参数 Maxclient s 就用于规定服务器支持的最多并发访问的客户数,如果这个值设置得过大,系统在繁忙时不得不在过多的进程之间进行切换来为太多的客户进行服务,这样对每个客户的反应就会减慢,并降低了整体的效率。如果这个值设置的较小,那么系统繁忙时就会拒绝一些客户的连接请求。当服务器性能较高时,就可以适当增加这个值的设置。对于专业网站,应该使用提高服务器效率的策略,因此这个参数不能超过硬件本身的限制,如果频繁出现拒绝访问现象,就说明需要升级服务器硬件了。对于非专业网站,不太在意对客户浏览器的反应速度,或者认为反应速度较慢也比拒绝连接好,就也可以略微超过硬件条件来设置这个参数。
  这个参数限制了 MinSpareServers MaxSpareServers 的设置,它们不应该大
于这个参数的设置。
   MaxRequestsPerChild 30
  使用子进程的方式提供服务的 Web 服务,常用的方式是一个子进程为一次连接服务,这样造成的问题就是每次连接都需要生成、退出子进程的系统操作,使得这些额外的处理过程占据了计算机的大量处理能力。因此最好的方式是一个子进程可以为多次连接请求服务,这样就不需要这些生成、退出进程的系统消耗, Apache 就采用了这样的方式,一次连接结束后,子进程并不退出,而是停留在系统中等待下一次服务请求,这样就极大的提高了性能。
  但由于在处理过程中子进程要不断的申请和释放内存,次数多了就会造成一
些内存垃圾,就会影响系统的稳定性,并且影响系统资源的有效利用。因此在一个副本处理过一定次数的请求之后,就可以让这个子进程副本退出,再从原始的
httpd 进程中重新复制一个干净的副本,这样就能提高系统的稳定性。这样,每
个子进程处理服务请求次数由 MaxRe questPerChild 定义。 缺省的设置值为 30
这个值对于具备高稳定性特点的 Linux 系统来讲是过于保守的设置,可以设置为 1000 甚至更高,设置为 0 支持每个副本进行无限次的服务处理。
   #Listen 3000
   #Listen 12.34.56.78:80
   #BindAddress *
   Listen 参数可以指定服务器除了监视标准的 80 端口之外,还监视其他端口的
HTTP 请求。由于 FreeBSD 系统可以同时拥有多个 IP 地址,因此也可以指定服务器只听取对某个 BindAddress< /B> IP 地址的 HTTP 请求。如果没有配置这一项,则服务器会回应对所有 IP 的请求。
  即使使用了 BindAddress 参数,使得服务器只回应对一个 IP 地址的请求,但是通过使用扩展的 Listen 参数,仍然可以让 HTTP 守护进程回应对其他 IP 地址的请求。此时 Listen 参数的用法与上面的第二个例子相同。这种比较复杂的用法主要用于设置虚拟主机。此后可以用 VirtualHost 参数定义对不同 IP 的虚拟主机,然而这种用法是较早的 HTTP 1.0 标准中设置虚拟主机的方法,每针对一个虚拟主机就需要一个 IP 地址,实际上用处并不大。在 HTTP 1.1 中,增加了对单 IP 地址多域名的虚拟主机的支持,使得虚拟主机的设置具备更大的意义。
LoadModule mime_magic_module libexec/apache/mod_mime_magic.so
LoadModule info_module libexec/apache/mod_info.so
LoadModule speling_module libexec/apache/mod_speling.so
LoadModule proxy_module libexec/apache/libproxy.so
LoadModule rewrite_module libexec/apache/mod_rewrite.so
LoadModule anon_auth_module libexec/apache/mod_auth_anon.so
LoadModule db_auth_module libexec/apache/mod_auth_db.so
LoadModule digest_module libexec/apache/mod_digest.so
LoadModule cern_meta_module libexec/apache/mod_cern_meta.so
LoadModule expires_module libexec/apache/mod_expires.so
LoadModule headers_module libexec/apache/mod_headers.so
LoadModule usertrack_module libexec/apache/mod_usertrack.so
LoadModule unique_id_module libexec/apache/mod_unique_id.so
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_proxy.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
AddModule mod_auth_db.c
AddModule mod_digest.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
Apache 服务器的一个重要特性就是其模块化的结构,这不但表现为其能在编
译时能通过新的模块加入新的功能,还表现为其模块可以动态加载入 http 服务程
序中,而不必载入不需要的模块。使用 Apache 的动态加载模块只需要设置好 Load Module AddModule 参数就可以了,这种特性就是 Apache DSO Dynamic Shared Object )特性,然而要想充分使用 DSO 特性仍然不是一个简单的事情,不适当的改动这里的设置就可能造成服务器不能正常启动。因此如果不是要增加或减少服务器提供的功能,就不要改动这里的设置。
  上面这些列表就显示了 Linux 下的缺省 Apache 服务器支持的模块,事实上很
多模块是没有必要的,不必要模块不会被载入内存。模块可以静态连接到 pache 服务器内部,也可以这样动态加载,将 Apache 的特性都编译成动态可加载模块是该 Port 的做法,而不是 Apache 的缺省做法,这样就以牺牲很小的性能的同时,带来极大的灵活性。
  因而动态可加载的能力还是对性能有轻微的影响,因此可以重新编译 Apache ,将自己所需要的功能编译进 Apache 服务器内部,可以让系统显得更为干净,效率也有轻微的提高。通常仅仅为了这一个目的就重新编译 Apache 是没有必要的,如果需要增加其他特性而重新编译 Apache ,不妨在增加其他模块的同时将所有的模块都静态连接入 Apache 服务器。有的使用者更喜欢动态加载模块,那么也不妨全部都使用动态加载模块。
  这些模块都被放置到 /usr/local/apache/libexec/ 目录下, 每个模块对应 Apache 服务器的一个特性。详细解释每个模块的功能需要相当多的篇幅,其中比较重要的特性将在后面相应的地方中进行解释,而具体每个模块的功能及用法就需要查看 Apache 的文档。
   #ExtendedStatus On
   Apache 服务器可以通过特殊的 HTTP 请求,来报告自身的运行状态,打开这个 ExtendedStatus 参数可以让服务器报告更全面的运行状态信息。
主服务器设置
   Apache 服务器需要各种设置,以定义自己使用各种参数以提供 Web 服务。对于使用虚拟主机的情况,除了在虚拟主机的定义项中覆盖的设置之外(有的设置必须重新定义),这里的设置也是虚拟主机的缺省设置。
   Port 80
   Port 定义了 Standalone 模式下 httpd 守护进程使用的端口,标准端口是 80 。这个选项只对于以独立方式启动的服务器才有效,对于以 inetd 方式启动的服务器则在 inetd.conf 中定义使用哪个端口。
  在 Unix 下使用 80 端口需要 root 权限,一些管理员为了安全的原因,认为 httpd 服务器不可能没有安全漏洞,因而更愿意使用普通用户的权限来启动服务器,这样就不能使用 80 端口及其他小于 1024 的端口,而必须使用大于 1024 的端口来启动 httpd ,一般情况下 8000 8080 也是常用的端口。而 Apache httpd 服务器本身可以在以 root 权限打开 80 端口后再改变为普通用户身份进行运行,这样就减少了危险性,因而就不需要考虑这个安全问题。但是如果普通用户也想安装配置自己的 WWW 服务器,那么就不得不使用大于 1024 的端口。
   User nobody
   Group nogroup
   User Group 配置是 Apache 的安全保证, Apache 在打开端口之后,就将其本身设置为这两个选项设置的用户和组权限进行运行,这样就降低了服务器的危险性。这个选项也只用于 Standalone 模式, inetd 模式在 inetd.conf 中指定运行 Apache 的用户。由于服务器必须执行改变身份的 setuid() 操作,因此初始进程应该具备 root 权限,如果是使用非 root 用户来启动 Aapche ,这个配置就不会发挥作用。
  缺省设置为 nobody nogroup ,这个用户和组在系统中不拥有文件,保证了服务器本身和由它启动的 CGI 进程没有权限更改文件系统。在某些情况下,例如为了运行 CGI Unix 交互,也需要让服务器来访问服务器上的文件,如果仍然使用 nobody nogroup ,那么系统中将会出现属于 nobody 的文件,这对于系统安全是不利的,因为其他程序也会以 nobody nogroup 的权限执行某些操作,就有可能访问这些 nobody 拥有的文件,造成安全问题。一般情况下要为 Web 服务设定一个特定的用户和组,同时在这里更改用户和组设置。
   ServerAdmin you@your.address
  配置文件中应该改变的也许只有 ServerAdmin 这一项用于配置 WWW 服务器的管理员的 email 地址,这将在 HTTP 服务出现错误的条件下返回给浏览器,以便让 Web 使用者和管理员联系,报告错误。习惯上使用服务器上的 webmaster 作为 WWW 服务器的管理员,通过邮件服务器的别名机制,将发送到 webmaster 的电子邮件发送给真正的 Web 管理员。
   #ServerName new.host.name
  缺省情况下,并不需要指定这个 ServerName 参数,服务器将自动通过名字解
析过程来获得自己的名字,但如果服务器的名字解析有问题(通常为反向解析不
正确),或者没有正式的 DNS 名字,也可以在这里指定 IP 地址。当 ServerName
置不正确的时候,服务器不能正常启动。
  通常一个 Web 服务器可以具有多个名字,客户浏览器可以使用所有这些名字或 IP 地址来访问这台服务器,但在没有定义虚拟主机的情况下,服务器总是以自己的正式名字回应浏览器。 ServerName 就定义了 Web 服务器自己承认的正式名字,例如一台服务器名字(在 DNS 中定义了 A 类型)为 exmaple.org.cn ,同时为了方便记忆还定义了一个别名( CNAME 记录)为 www.exmaple.org.cn ,那么 Apache 自动解析得到的名字就为 example.org.cn ,这样不管客户浏览器使用哪个名字发送请求,服务器总是告诉客户程序自己为 example.org.cn 。虽然这一般并不会造成什么问题,但是考虑到某一天服务器可能迁移到其他计算机上,而只想通过更改 DNS 中的 www 别名配置就完成迁移任务,所以不想让客户在其书签中使用 Linux 记录下这个服务器的地址,就必须使用 ServerName 来重新指定服务器的正式名字。
   DocumentRoot "/www/"
   DocumentRoot 定义这个服务器对外发布的超文本文档存放的路径,客户程序请求的 UR L 就被映射为这个目录下的网页文件。这个目录下的子目录,以及使用
符号连接指出的文件和目录都能被浏览器访问,只是要在 URL 上使用同样的相对目录名。
  注意,符号连接虽然逻辑上位于根文档目录之下,但实际上可以位于计算机
上的任意目录中,因此可以使客户程序能访问那些根文档目录之外的目录,这在
增加了灵活性的同时但减少了安全性。 Apache 在目录的访问控制中提供了 FollowSymLinks 选项来打开或关闭支持符号连接的特性。
Options FollowSymLinks
AllowOverride None
   Apache 服务器可以针对目录进行文档的访问控制,然而访问控制可以通过两
种方式来实现,一个是在设置文件 httpd.conf (或 access.conf )中针对每个目
录进行设置,另一个方法是在每个目录下设置访问控制文件,通常访问控制文件
名字为 .htaccess 。虽然使用这两个方式都能用于控制浏览器的访问,然而使用配置文件的方法要求每次改动后重新启动 httpd 守护进程,比较不灵活,因此主要用于配置服务器系统的整体安全控制策略,而使用每个目录下的 .htaccess 文件设置具体目录的访问控制更为灵活方便。
   Directory 语句就是用来定义目录的访问限制的,这里可以看出它的标准语法,为一个目录定义访问限制。上例的这个设置是针对系统的根目录进行的,设置了允许符号连接的选项 FollowSymLinks ,以及使用 AllowOverride None 表示不允许这个目录下的访问控制文件来改变这里进行的配置,这也意味着不用查看这个目录下的相应访问控制文件。
  由于 Apache 对一个目录的访问控制设置是能够被下一级目录继承的,因此对
根目录的设置将影响到它的下级目录。注意由于 AllowOverride None 的设置,使
Apache 服务器不需要查看根目录下的访问控制文件,也不需要查看以下各级目
录下的访问控制文件,直至 httpd.conf (或 access.conf )中为某个目录指定了
允许 Alloworride ,即允许查看访问控制文件。由于 Apache 对目录访问控制是采用的继承方式,如果从根目录就允许查看访问控制文件,那么 Apache 就必须一级一级的查看访问控制文件,对系统性能会造成影响。而缺省关闭了根目录的这个特性,就使得 Apache httpd.conf 中具体指定的目录向下搜寻,减少了搜寻的级数,增加了系统性能。因此对于系统根目录设置 AllowOverride None 不但对于系统安全有帮助,也有益于系统性能。
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
  这里定义的是系统对外发布文档的目录的访问设置,设置不同的 AllowOverride 选项,以定义配置文件中的目录设置和用户目录下的安全控制文件的关系,而 Options 选项用于定义该目录的特性。
  配置文件和每个目录下的访问控制文件都可以设置访问限制,设置文件是由
管理员设置的,而每个目录下的访问控制文件是由目录的属主设置的,因此管理
员可以规定目录的属主是否能覆盖系统在设置文件中的设置,这就需要使用 AllowOverride 参数进行设置,通常可以设置的值为:
AllowOverride 的设置 对每个目录访问控制文件作用的影响
All 缺省值,使访问控制文件可以覆盖系统配置
None 服务器忽略访问控制文件的设置
Options 允许访问控制文件中可以使用 Options 参数定义目录的选项
FileInfo 允许访问控制文件中可以使用 AddType 等参数设置
AuthConfig 允许访问控制文件使用 AuthName AuthType 等针对每个用户的认证机制,这使目录属主能用口令和用户名来保护目录 Limit 允许对访问目录的客户机的 IP 地址和名字进行限制
  每个目录具备一定属性,可以使用 Options 来控制这个目录下的一些访问特性设置,以下为常用的特性选项:
Options 设置 服务器特性设置
All 所有的目录特性都有效,这是缺省状态
None 所有的目录特性都无效
FollowSymLinks 允许使用符号连接,这将使浏览器有可能访问文档根目录 DocumentRoot )之外的文档 SymLinksIfOwnerMatch 只有符号连接的目的与符号连接本身为同一用户所拥有时,才允许访问,这个设置将增加一些安全性
ExecCGI 允许这个目录下可以执行 CGI 程序 Indexes 允许浏览器可以生成这个目录下所有文件的索引,使得在这个目录下没有 index.html (或其他索引文件)时,能向浏览器发送这个目录下的文件列表
 此外,上例中还使用了 Order Allow Deny 等参数,这是 Limit 语句中用来根据浏览器的域名和 IP 地址来控制访问的一种方式。其中 Order 定义处理 Allow Deny 的顺序,而 Allow Deny 则针对名字或 IP 进行访问控制设置,上例使用 allowfrom all ,表示允许所有的客户机访问这个目录,而不进行任何限制。
   UserDir public_html
  当在一台 Linux 上运行 Apache 服务器时,这台计算机上的所有用户都可以有自己的网页路径,形如 http://example.org.cn/~user ,使用波浪符号加上用户名就可以映射到用户自己的网页目录上。映射目录为用户个人主目录下的一个子目录,其名字就用 UseDir 这个参数进行定义,缺省为 public_html 。如果不想为正式的用户提供网页服务,使用 DISABLED UserDir 的参数即可。
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#
  这里可以看到 Directory 的另一个用法,即可以通过简单的模式匹配方法,针对分布在不同目录下的子目录定义访问控制权限。这样设置就需要 Apache 服务器对每个路径进行额外的处理,因此就会降低服务器的性能,所以缺省情况并没有打开这种访问限制。
  这里可以看到另外一个语句 Limit Limit 语句就是用来针对具体的请求方法来设定访问控制的,其中可以使用 GET POST 等各种服务器支持的请求方法做 Limit 的参数,来设定对不同请求方法的访问限制。一般可以打开对 GET POST HEAD 三种请求方法,而屏蔽其他的请求方法,以增加安全性。 Limit 语句中,可以用 Order Allow Deny Allow Deny 中可以使用匹配的方法针对域名和 IP 进行限制,只是对于域名是从后向前匹配,对于 IP 地址则从前向后匹配。
   DirectoryIndex index.html
  很多情况下, URL 中并没有指定文档的名字,而只是给出了一个目录名。那么 Apache 服务器就自动返回这个目录下由 DirectoryIndex 定义的文件,当然可以指定多个文件名字,系统会这个目录下顺序搜索。当所有由 DirectoryIndex 指定的文件都不存在时, Apache 服务器可以根据系统设置,生成这个目录下的所有文件列表,提供用户选择。此时该目录的访问控制选项中的 Indexes 选项( Options Indexes )必须打开,以使得服务器能够生成目录列表,否则 Apache 将拒绝访问。
   AccessFileName .htaccess
   AccessFileName 定义每个目录下的访问控制文件的文件名,缺省为 .htaccess ,可以通过更改这个文件,来改变不同目录的访问控制限制。
Order allow,deny
Deny from all
  除了可以针对目录进行访问控制之外,还可以根据文件来设置访问控制,这
就是 File 语句的任务。使用 File 语句,不管文件处于哪个目录,只要名字匹配, 就必须接受相应的访问控制。这个语句对于系统安全比较重要,例如上例将屏蔽所有的使用者不能访问 .htaccess 文件,这样就避免 .htaccess 中的关键安全信息不至于被客户获取。
   #CacheNegotiatedDocs
  缺省情况下如果代理服务器和 Apache 服务器协商是否缓存其网页, Apache
予否定的回答,不希望自己的网页被代理服务器缓存。然而这样就不能有效的利用代理服务器的优势,因此可以设置 CacheNegotiatieDocs 选项, 使得代理服务器可以对网页进行缓存。然而即使不设置这个选项,有的代理服务器(或通过调整设置)也能对网页进行缓存。
   UseCanonicalName On
  打开这个 UseCanonicalName Web 服务器的标准做法,因为客户发送的大部分请求都是对本服务器的引用,这样服务器就能使用 ServerName Port 选项的设置内容构建完整的 URL ,并回应客户,使浏览器能得到规范的 URL 。如果将这个参数设置为 Off ,那么 Apache 将使用从客户请求中获得服务器的名字和端口值(支持 HTTP 1.1 的客户的请求中将会有这些信息),重新构建 URL
   TypesConfig /usr/local/apache/etc/mime.types
   TypeConfig 用于设置保存有不同的 MIME 类型数据的文件名,在 Linux 下缺省设置为 /usr/local/apache/etc/mime.types
   DefaultType text/plain
  如果 Web 服务器不能决定一个文档的缺省类型,这通常表示文档使用了非标准的后缀,那么服务器就使用 DefaultType 定义的 MIME 类型将文档发送给客户浏览器。这里的设置为 text/plain ,这样设置的问题是,如果服务器不能判断出文档的 MIME ,那么大部分情况下这个文档为一个二进制文档,但使用 text/plain 格式发送回去,浏览器将在内部打开它而不会提示保存。因此建议将这个设置更改为
application/octet-stream ,这样浏览器将提示用户进行保存。
MIMEMagicFile /usr/local/apache/etc/magic
  除了从文件的后缀出发来判断文件的 MIME 类型之外, Apache 还可以进一步分
析文件的一些特征,来判断文件的真实 MIME 类型。这个功能是由 mod_mime_magic 模块实现的,它需要一个记录各种 MIME 类型特征的文件,以进行分析判断。上面的设置是一个条件语句,如果载入了这个模块,就必须指定相应的标志文件 magic 的位置。
如果使用了 IndexOptions FancyIndexing 选项,可以让服务器产生的目录列
表中针对各种不同类型的文档引用各种图标。而哪种文件使用哪种图标,则使用
下面的 AddIconByEncoding AddIconByType 以及 AddIcon 来定义,分别依据 MIME 的编码、类型以及文件的后缀来判断使用何种图标。如果不能确定文档使用的图标,就使用 DefaultIcon 定义的缺省图标。
  同样,使用 AddDescription 可以为不同类型的文档加入不同的描述。并且,
服务器还在目录下,查询使用 ReadmeName HeaderName 定义的文件(自动加上 .
html 后缀,如果没有发现,再使用 .txt 后缀进行搜索),如果发现了这些文件,
就在文件列表之前首先显示这些文件的内容,以使得普通目录列表具备更大的可
理解性。
   IndexIgnore 让服务器在列出文件列表时忽略相应的文件, 这里使用模式配
置的方式定义文件名。
AddEncoding x-compress Z
AddEncoding x-gzip gz
   AddEncoding 用于告诉一些使用压缩的 MIME 类型,这样可以让浏览器进行解压缩操作。
AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
AddLanguage it .it
LanguagePriority en fr de
  一个 HTML 文档可以同时具备多个语言的版本,如对于 file1.html 文档可以具
file1.html.en file1.html.fr 等不同的版本,每个语言后缀必须使用 AddLanguage 进行定义。这样服务器可以针对不同国家的客户,通过与浏览器进行协商,发送不同的语言版本。而 LanguagePriority 定义不同语言的优先级,以便在浏览器没有特殊要求时,按照顺序使用不同的语言版本回应对 file1.html 的请求。
这个国际化的能力实际的应用并不多。
#AddType application/x-httpd-php .phtml
#AddType application/x-httpd-php-source .phps
  AddType 参数可以为特定后缀的文件指定 MIME 类型,这里的设置将覆盖 mime.types 中的设置。
   #AddHandler cgi-script .cgi
   AddHandler 是用于指定非静态的处理类型,用于定义文档为一个非静态的文
档类型,需要进行处理,再向浏览器返回处理结果。例如上面注释中的设置是将以 .cgi 结尾的文件设置为 cgi-script 类型,那么服务器将启动这个 CGI 程序以进行处理。如果需要在前面 AliasScript 定义的路径之外执行 CGI 程序,就需要使用这个参数进行设置,此后以 .cgi 结尾的文件将被当作 CGI 程序执行。
  在配置文件、这个目录中的 .htaccess 以及其上级目录的 .htaccess 中必须允许执行 CGI 程序,这需要通过 Options ExecCGI 参数设定。
#AddType text/html .shtml
#AddHandler server-parsed .shtml
  另外一种动态进行处理的类型为 server-parsed ,由服务器自身预先分析网页内的标记,将标记更改为正确的 HTML 标识。由于 server-parsed 需要对 text/html 类型的文档进行处理,因此首先定义了对应的 .shtml text/html 类型。
  然而要支持 SSI ,还要首先要在配置文件(或 .htaccess )中使用 Options Includes 允许该目录下的文档可以为 SSI 类型,或使用 Options IncludesNOExec 让执行普通的 SSI 标志,但不执行其中引用的外部程序。
  另一种指定 server-parsed 类型的方式为使用 XBitBack 设置选项,如果将 XBitHack 设置为 On ,服务器将检查所有 text/html 类型的文档(包括 .html 后缀的文档),如果发现文件属性具备执行位 “x" ,则服务器就认为它是服务器分析文档,需要服务器进行处理。推荐使用 AddHandler 进行设置,而将 XBitBack 设置为 Off ,因为使用 XBitBack 将对所有的 HTML 文档都执行额外的检查,降低了效率。
#AddHandler send-as-is asis
#AddHandler imap-file map
#AddHandler type-map var
上面被注释的 AddHandler 用于支持 Apache 服务器的 asis map var 处理能力
# Action media/type /cgi-script/location
# Action handler-name /cgi-script/location
 因为 Apache 内部提供的处理功能有限,因此可以使用 Action 为服务器定义外
部程序作为可处理的动态文档类型,这些外部程序与标准 CGI 程序相同,都是对输入的数据处理之后,再输出不同 MIME 类型的结果。例如要定义一个对特殊后缀 wri 都先执行 wri2txt 进行处理操作,再返回结果的操作,可以使用:
Action windows-writer /bin/wri2txt
AddHandler windows-writer wri
 更进一步,可以直接使用 Action 定义对某个 MIME 类型预先进行处理操作,这
需要例子中第一种格式的 Action 参数设置方式。这样设置方式就不再需要额外的 AddHandler 用来将处理操作与文件后缀联系起来,而是使用 Action 直接处理 MIME 类型的文件。但如果文档后缀没有正式的 MIME 类型,还需要先定义一个 MIME 类型。
#MetaDir .web
#MetaSuffix .meta
  Meta 信息是在文档发送给客户之前,预先发送给客户浏览器一些数据,因此
浏览器可以通过 HEAD 请求来访问这些 Meta 信息而不必真正通过 GET 来返回全部文档数据。服务器通常发送给浏览器的是一些标准的 HTTP 头信息,如果要想增加额外的信息,就需要使用 MetaDir 来定义 Meta 数据存放的目录, MetaS uffix 用于指定包含 Meta 数据的文件后缀。
#ErrorDocument 500 "The server made a boo boo.
#ErrorDocument 404 /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
#ErrorDocument 402
http://some.other_server.com/subscription_info.html
  如果客户请求的网页不存在,或者没有访问权限等情况发生时,服务器将产
生一个错误代码,同时也将回应客户浏览器一个标识错误的网页。
ErrorDocument 就用于设置当出现哪个错误时应该回应客户浏览器那些内容, ErrorDocument 的第一个参数为错误的序号,第二个参数为回应的数据,可以为简单的文本,本地网页,本地 CGI 程序,以及远程主机上的网页。
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4.0" force-response-1.0
BrowserMatch "Java/1.0" force-response-1.0
BrowserMatch "JDK/1.0" force-response-1.0
  BrowserMatch 命令为特定的客户程序,设置特殊的参数,以保证对老版本浏
览器的兼容性,并支持新浏览器的新特性。
#
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# Deny from all
# ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
用于设置访问控制的设置主要是针对目录和文件进行设置的,然而也可以针对不同的 URL 进行访问控制的设置,这样就不必担心 ScriptAlias Alias 是否将路径设置到了受控制的目录之外了。针对 URL 进行控制的语句为 Location 语句,这样不但能对服务器上的文件、 CGI 提供保护,此外,它还能保护不能找到对应文件,而是由服务器本身提供的特殊功能 URL http://servername/server-status 用于报告当前 Apache 服务器的状态, http://servername/server-info 用于报告 Apache 服务器的统计信息。与此相关的设置还有 ExtendedStatus 参数,可以让服务器输出更详细的的报告。
#
#ProxyRequests On
#
#
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#ProxyVia On
#CacheRoot "/www/proxy"
#CacheSize 5
#CacheGcInterval 4
#CacheMaxExpire 24
#CacheLastModifiedFactor 0.1
#CacheDefaultExpire 1
#NoCache a_domain.com another_domain.edu joes.garage_sale.com
#
   Apache 服务器本身就具备代理的功能,然而这要求加载入 mod_proxy 模块。这能使用 IfModule 语句进行判断,如果存在 mod_proxy 模块,就使用 ProxyRequests 打开代理支持。此后的 Directory 用于设置对 Proxy 功能的访问权限设置,以及用于设置缓冲的各个参数设置。
虚拟主机
#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78
#
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common
#
#
  缺省设置文件中的这些内容是用于设置命名基础的虚拟主机服务器时使用。
其中 NameVirtualHost 来指定虚拟主机使用的 IP 地址,这个 IP 地址将对应多个 DNS 名字,如果 Apache 使用了 Listen 参数控制了多个端口,那么就可以在这里加上端口号以进一步进行区分对不同端口的不同连接请求。此后,使用 VirtualHost 语句,使用 NameVirtualHost 指定的 IP 地址作参数,对每个名字都定义对应的虚拟主机设置。
  虚拟主机是在一台 Web 服务器上,可以为多个单独域名提供 Web 服务,并且每个域名都完全独立,包括具有完全独立的文档目录结构及设置,这样域名之间完全独立,不但使用每个域名访问到的内容完全独立,并且使用另一个域名无法访
问其他域名提供的网页内容。
  虚拟主机的概念对于 ISP 来讲非常有用,因为虽然一个组织可以将自己的网页挂在具备其他域名的服务器上的下级往址上,但使用独立的域名和根网址更为正式,易为众人接受。传统上,必须自己设立一台服务器才能达到单独域名的目的,然而这需要维护一个单独的服务器,很多小单位缺乏足够的维护能力,更为合适的方式是租用别人维护的服务器。 ISP 也没有必要为一个机构提供一个单独的服务器,完全可以使用虚拟主机能力,使服务器为多个域名提供 Web 服务,而且不同的服务互不干扰,对外就表现为多个不同的服务器。
  有两种设定虚拟主机的方式,一种是基于 HTTP 1.0 标准,需要一个具备多 IP
地址的服务器,再配置 DNS 服务器,给每个 IP 地址以不同的域名,最后才能配置 Apache 的配置文件,使服务器对不同域名返回不同的 Web 文档。由于这需要使用额外的 IP 地址,对每个要提供服务的域名都要使用单独的 IP 地址,因此这种方式实现起来问题较多。
  可以在一个网络界面上绑定多个 IP 地址, Linux 下需要使用 ifconfig alias 参数来进行这个配置,但此时会影响网络性能。
   HTTP 1.1 标准在协议中规定了对浏览器和服务器通信时,服务器能够跟踪浏
览器请求的是哪个主机名字。因此可以利用这个新特性,使用更轻松的方式设定
虚拟主机。这种方式不需要额外的 IP 地址,但需要新版本的浏览器支持。这种方式已经成为建立虚拟主机的标准方式。
  要建立非 IP 基础的虚拟主机,多个域名是不可少的配置,因为每个域名就对
应一个要服务的虚拟主机。因此需要更改 DNS 服务器的配置,为服务器增加多个 C NAME 选项,如:
linux IN A 192.168.1.64
vhost1 IN CNAME linux
vhost2 IN CNAME linux
 基本的设置选项都是为了 linux 主机设定的,如果要为 vhost1 vhost2 设定
虚拟主机,就要使用 VirtualHost 语句定义不同的选项,在语句中可以使用配置文件前面中的大部分选项,而可以重新定义几乎所有的针对服务器的设置。
NameVirtualHost 192.168.1.64
DocumentRoot /www/data
ServerName linux.example.org.cn
DocumentRoot /vhost1
ServerName vhost1.example.org.cn
DocumentRoot /vhost2
ServerName vhost2.example.org.cn
  这里需要注意的是, VirtualHost 的参数地址一定要和 NameVirtualHost 定义的地址相一致,必须保证所有的值严格一致, Apache 服务器才承认这些定义是为这个 IP 地址定义的虚拟主机。
  此外,定义过 NameVirtualHost 之后,那么对这个 IP 地址的访问都被区分不同的虚拟主机进行处理,而对其他 IP 地址的访问,例如 127.0.0.1 ,才应用前面定义的缺省选项。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值