• 欢迎访问Ppabc博客网站,专注于Linux、CentOS、Apache、Nginx、MySQL、PHP等开源工具安装优化的技术博客,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入Ppabc博客
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏Ppabc博客吧

Apache服务器的设置与优化 1

baidu空间 admin 12年前 (2008-03-08) 393次浏览

2007 年 06 月 16 日 星期六 11:25
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 类型。

[iaspec@www conf]$ pwd
/usr/local/apache/conf
[iaspec@www conf]$ ls
access.conf httpd.conf.OLD magic.default srm.conf
access.conf.default httpd.conf.SAVE mime.types srm.conf.default
httpd.conf magic mime.types.default

  新版本的 Apache 将原来 httpd.conf、srm.conf 与 access.conf 中的所有配置参数均放在了一个配置文件 httpd.conf 中,只是为了与以前的版本兼容的原因(使用这三个设置文件的方式来源于 NCSA-httpd),才使用三个配置文件。而提供的 access.conf 和 srm.conf 文件中没有具体的设置。
由于在新版本的 Apache 中,所有的设置都被放在了 httpd.conf 中,因此只需要调整这个文件中的设置。本文基于 redhat 7.2 下的 httpd.conf 为例,解释 Apache 服务器的各个设置选项,当然,其配置方法可扩展到几乎所有 unix 系统。

虽然 Apache 提供设置的参数很多,基本上这些 参数都很明确,也可以不加改动运行 Apache 服务器。但如果需要调整 Apache 服务器的性能,以及增加对某种特性的支持,就需要了解这些设置参数的含义。

需要指出的是,除了操作系统的性能调整之外,Apache 服务器本身的缺省配置绝不是最优化和最高效的,而是要适应几乎所有种类操作系统、所有种类硬件下的设置,多平台的软件不可能为特定平台和特定硬件提供最优化的缺省配置。因此要使用 Apache 的时候,性能调整是必不可少的。
本文目录快速访问:
httpd.conf 基本配置与性能优化的关系
另外一些加速方法
附录一、采用 mod_gzip 加速 Apache

httpd.conf 基本配置与性能优化的关系

httpd.conf 中首先定义了一些 httpd 守护进程运行时需要的参数,来决定其运行方式和运行环境。 下面就 httpd.conf 中的配置参数的定义及其各种配置、优化方法进行逐项说明:
(优化没有捷径,必须首先清楚各配置的含义)

  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/lock/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 的一次连接、多次传输功能,这样就可以在一次连接中传递多个 HTTP 请求。

  MaxKeepAliveRequests 100

  MaxKeepAliveRequests 为一次连接可以进行的 HTTP 请求的最大请求次数。将其值设为 0 将支持在一次连接内进行无限次的传输请求。事实上没有客户程序在一次连接中请求太多的页面,通常达不到这个上限就完成连接了。 可以适当将此数字调小,以获取最大速度。

  KeepAliveTimeout 15

  KeepAliveTimeout 测试一次连接中的多次请求传输之间的时间,如果服务器已经完成了一次请求,但一直没有接收到客户程序的下一次请求,在间隔超过了这个参数设置的值之后,服务器就断开连接。可以适当调小这个数值,以尽快释放空闲的连接。但也不可太小,不然多数客户都要重新连接,将耗费 CPU 时间。

MinSpareServers 5
MaxSpareServers 10

  在使用子进程处理 HTTP 请求的 Web 服务器上,由于要首先生成子进程才能处理客户的请求,因此反应时间就有一点延迟。但是,Apache 服务器使用了一个特殊技术来摆脱这个问题,这就是预先生成多个空余的子进程驻留在系统中,一旦有请求出现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。在运行中随着客户请求的增多,启动的子进程会随之增多,但这些服务器副本在处理完一次 HTTP 请求之后并不立即退出,而是停留在计算机中等待下次请求。但是空余的子进程副本不能光增加不减少,太多的空余子进程没有处理任务,也占用服务器的处理能力,因此也要限制空余副本的数量,使其保持一个合适的数量,使得既能及时回应客户请求,又能减少不必要的进程数量。

因此就可以使用参数 MinSpareServers 来设置最少的空余子进程数量, 以及使用参数 MaxSpareServers 来限制最多的空闲子进程数量,多余的服务器进程副本就会退出。根据服务器的实际情况来进行设置,如果服务器性能较高,并且也 被频繁访问,就应该增大这两个参数的设置。对于高负载的专业网站,这两个值应该大致相同,并且等同于系统支持的最多服务器副本数量,也减少不必要的副本退出。
比如,当系统高负载时,可以这样检测:
[iaspec@www iaspec]$ ps -ef|grep apache|wc
55 .. ..
[iaspec@www iaspec]$
这表明,高负载时有 55 个运行子进程,如果此服务器为 WEB 专用服务器,就应该考虑将这两个数值分别设为 50、60,或者 40、70,具体以速度测试结果为准。

  StartServers 5

  StartServers 参数就是用来设置 httpd 启动时启动的子进程副本数量,这个参数与上面定义的 MinSpareServers 和 MaxSpareServers 参数相关,都是用于启动空闲子进程以提高服务器的反应速度的。这个参数应该设置为前两个值之间的一个数值,小于 MinSpareServers 和大于 MaxSpareServers 都没有意义。
  MaxClients 150

在另一方面,服务器的能力毕竟是有限的,不可能同时处理无限多的连接请求,因此参数 Maxclients 就用于规定服务器支持的最多并发访问的客户数,如果这个值设置得过大,系统在繁忙时不得不在过多的进程之间进行切换来为太多的客户进行服务,这样对每个客户的反应就会减慢,并降低了整体的效率。如果这个值设置的较小,那么系统繁忙时就会拒绝一些客户的连接请求。当服务器性能较高时,就可以适当增加这个值的设置。对于专业网站,应该使用提高服务器效率的策略,因此这个参数不能超过硬件本身的限制,如果频繁出现拒绝访问现象,就说明需要升级服务器硬件了。当不太在意对客户浏览器的反应速度,或者认为反应速度较慢也比拒绝连接好,就也可以略微超过硬件条件来设置这个参数。
但具体这个数值以多少为宜呢?当对性能要求较高时,可以用下面的方法确定如何配置此参数。
首先,估计你的最大可能并发的连接数,或者在高负载时用 ps -ef|grep apache|wc 命令测得最大进程数,通常 MaxClients 应该是这个数值的两倍左右。如果当前网站在高负载时的访问速度可以接受,但有拒绝服务现象,则应把此参数调大,如果无拒绝服务现象,但访问速度缓慢,则应减低此数值。
这个参数同时限制了 MinSpareServers 和 MaxSpareServers 的设置,它们不应该大于这个参数的设置。
对于重负载的机器来说,仅仅这么做还是不够的。
Apache 允许为请求开的最大进程数是 256,MaxClients 的限制是 256.如果用户多了,用户就只能看到 Waiting for reply….然后等到下一个可用进程的出现。这个最大数,是 Apache 的程序决定的–它的 NT 版可以有 1024,但 Unix 版只有 256,你可以在 include/httpd.h 中
看到:
#ifndef HARD_SERVER_LIMIT
#ifdef WIN32
#define HARD_SERVER_LIMIT 1024
#else
#define HARD_SERVER_LIMIT 256
#endif
#endif
你可以把它调到 1024,然后再编译你的系统。记得在 httpd.conf 里也要更改相应配置。

  MaxRequestsPerChild 30

  使用子进程的方式提供服务的 Web 服务,常用的方式是一个子进程为一次连接服务,这样造成的问题就是每次连接都需要生成、退出子进程的系统操作,使得这些额外的处理过程占据了计算机的大量处理能力。因此最好的方式是一个子进程可以为多次连接请求服务,这样就不需要这些生成、退出进程的系统消耗,Apache 就采用了这样的方式,一次连接结束后,子进程并不退出,而是停留在系统中等待下一次服务请求,这样就极大的提高了性能。
  但由于在处理过程中子进程要不断的申请和释放内存,次数多了就会造成一 些内存垃圾,就会影响系统的稳定性,并且影响系统资源的有效利用。因此在一个副本处理过一定次数的请求之后,就可以让这个子进程副本退出,再从原始的 httpd 进程中重新复制一个干净的副本,这样就能提高系统的稳定性。这样,每个子进程处理服务请求次数由 MaxRequestPerChild 定义。 缺省的设置值为 30,这个值对于具备高稳定性特点的 Linux 系统来讲是过于保守的设置,可以设置为 1000 甚至更高,设置为 0 支持每个副本进行无限次的服务处理。

  #Listen 3000
  #Listen 12.34.56.78:80
  #BindAddress *

  Listen 参数可以指定服务器除了监视标准的 80 端口之外,还监视其他端口的 HTTP 请求。由于系统可以同时拥有多个 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 服务器支持的模块,事实上很多模块是没有必要的,不必要模块不会被载入内存。模块可以静态连接到 apache 服务器内部,也可以这样动态加载,将 Apache 的特性都编译成动态可加载模块是该 Port 的做法,而不是 Apache 的缺省做法,这样就以牺牲很小的性能的同时,带来极大的灵活性。
因而动态可加载的能力还是对性能有轻微的影响,因此可以重新编译 Apache,将自己所需要的功能编译进 Apache 服务器内部,可以让系统显得更为干净,效率也有轻微的提高。通常仅仅为了这一个目的就重新编译 Apache 是没有必要的,如果需要增加其他特性而重新编译 Apache,不妨在增加其他模块的同时将所有的模块都静态连接入 Apache 服务器。
这些模块都被放置到/usr/local/apache/modules/目录下, 每个模块对应 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 记录)为http://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 /etc/mime.types

  TypeConfig 用于设置保存有不同的 MIME 类型数据的文件名,在 Linux 下缺省设置为/usr/local/apache/etc/mime.types 或者/etc/mime.types。

  DefaultType text/plain

  如果 Web 服务器不能决定一个文档的缺省类型,这通常表示文档使用了非标准的后缀,那么服务器就使用 DefaultType 定义的 MIME 类型将文档发送给客户浏览器。这里的设置为 text/plain,这样设置的问题是,如果服务器不能判断出文档的 MIME,那么大部分情况下这个文档为一个二进制文档,但使用 text/plain 格式发送回去,浏览器将在内部打开它而不会提示保存。因此建议将这个设置更改为 application/octet-stream,这样浏览器将提示用户进行保存。
MIMEMagicFile /usr/share/magic

除了从文件的后缀出发来判断文件的 MIME 类型之外,Apache 还可以进一步分析文件的一些特征,来判断文件的真实 MIME 类型。这个功能是由 mod_mime_magic 模块实现的,它需要一个记录各种 MIME 类型特征的文件,以进行分析判断。上面的设置是一个条件语句,如果载入了这个模块,就必须指定相应的标志文件 magic 的位置。

HostnameLookups Off
通常连接时,服务器仅仅可以得到客户机的 IP 地址,如果要想获得客户机的主机名,以进行日志记录和提供给 CGI 程序使用,就需要使用这个 HostnameLookups 选项,将其设置为 On 打开 DNS 反查功能。但是这将使服务器对每次客户请求都进行 DNS 查询,增加了系统开销,使得反应变慢,因此缺省设置为使用 Off 关闭此选项。关闭选项之后,服务器就不会获得客户机的主机名,而只能使用 IP 地址来记录客户。

]]>


Selinux 中国 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Apache 服务器的设置与优化 1
喜欢 (0)