首页 > 代码库 > Apache配置文件httpd.conf

Apache配置文件httpd.conf

    通过yum安装的httpd,默认情况下其配置文件为/etc/httpd/conf/httpd.conf, 以及/etc/httpd/conf.d/*.conf。

    配置文件主要有三部分组成

[root@localhost ~]# grep ‘Section‘ /etc/httpd/conf/httpd.conf 
### Section 1: Global Environment
### Section 2: ‘Main‘ server configuration
### Section 3: Virtual Hosts
  1. Global Environment    全局环境配置,决定Apache服务器的全局参数

  2. Main server configuration    主服务配置,相当于是Apache中的默认Web站点,如果我们的服务器中只有一个站点,那么就只需在这里配置就可以了。

  3. Virtual Hosts        虚拟主机,虚拟主机不能与Main Server主服务器共存,当启用了虚拟主机之后,Main Server就不能使用了



配置文件的语法

    指令是不区分大小写的,但是约定,指令单词的首字母大写。但是指令的值可能会区分大小写,而且有些指令可以重复使用多次。

配置文件的语法测试

[root@localhost ~]# service httpd configtest    # 实际上就是调用 httpd -t
OR
[root@localhost ~]# httpd -t

[root@localhost ~]# service httpd reload    # 重新读取配置文件
[root@localhost ~]# service httpd restart   # 重启服务

注意:大多数配置修改后,使用service httpd reload即可生效;但是修改了监听地址和端口则需要重启服务才能生效


1、设置监听地址和端口

语法: Listen [IP:]PORT

Listen 80                    # 监听在本机所有网卡的80端口
Listen 192.168.11.101:8080   # 只监听192.168.11.101网卡的8080端口

注意:Listen指令可以重复使用,如果需要监听多个端口,则必须写多行Listen指令

2、配置服务器HTTP响应头

语法:ServerTokens  Major|Minor|Minimal|ProductOnly|OS|Full

说明:此指令控制Server回送给客户端的响应头域是否包含关于服务器相关的描述信息。

wKiom1PXBjzz1L7uAADvJVWEepY584.jpg

注意:此设置将作用于整个服务器,而且不能在虚拟主机的层次启用或禁用。

3、设置保持长连接

  KeepAlive配置的含义:对于HTTP/1.1的客户端来说,将会尽量的保持客户的HTTP连接,通过一个连接传送多份HTTP请求响应。这样对于客户端来说,可以提高50%左右的响应时间,而于服务器端来说则降低了更多个连接的开销。不过这个依赖于客户端是否想保持连接。IE默认是保持连接的,当你打开100个图片的网站时,IE有可能只打开2个连接,通过这两个连接传送数据,而不是开100个连接。


语法:keepAlive {on | off}

MaxKeepAliveRequests  数字       # 一个连接最多可以发送多少次请求
KeepAliveTimeout  数字(单位为秒) # 连接超时时间
# KeepAliveTimeout 为持久连接保持的时间,也就是说,在这此连接结束后开始计时,多长时间内没有重新发送HTTP请求,就断掉连接。默认设置为5秒,这个值可以大点,但不能太大,否则会出现同时等候过多连接,导致多的内存被占用。
    在 Apache 服务器中,KeepAlive 是一个布尔值,On 代表打开,Off 代表关闭,这个指令在其他众多的 HTTPD 服务器中都是存在的。
 
  KeepAlive 配置指令决定当处理完用户发起的 HTTP 请求后是否立即关闭 TCP 连接,如果 KeepAlive 设置为 On,那么用户完成一次访问后,不会立即断开连接,如果还有请求,那么会继续在这一次 TCP 连接中完成,而不用重复建立新的 TCP 连接和关闭 TCP 连接,可以提高用户访问速度。
 
  那么我们考虑3种情况:
   1。用户浏览一个网页时,除了网页本身外,还引用了多个 javascript. 文件,多个 css 文件,多个图片文件,并且这些文件都在同一个 HTTP 服务器上。
  2。用户浏览一个网页时,除了网页本身外,还引用一个 javascript. 文件,一个图片文件。
  3。 用户浏览的是一个动态网页,由程序即时生成内容,并且不引用其他内容。
 
  对于上面3中情况,我认为:1 最适合打开 KeepAlive ,2 随意,3 最适合关闭 KeepAlive
 
  下面我来分析一下原因。
 
  在 Apache 中,打开和关闭 KeepAlive 功能,服务器端会有什么异同呢?
 
  先看看理论分析。
 
  打开 KeepAlive 后,意味着每次用户完成全部访问后,都要保持一定时间后才关闭会关闭 TCP 连接,那么在关闭连接之前,必然会有一个 Apache 进程对应于该用户而不能处理其他用户,假设 KeepAlive 的超时时间为 10 秒种,服务器每秒处理 50 个独立用户访问,那么系统中 Apache 的总进程数就是 10 50 = 500 个,如果一个进程占用 4M 内存,那么总共会消耗 2G 内存,所以可以看出,在这种配置中,相当消耗内存,但好处是系统只处理了 50次 TCP 的握手和关闭操作。
 
  如果关闭 KeepAlive,如果还是每秒50个用户访问,如果用户每次连续的请求数为3个,那么 Apache 的总进程数就是 50 3 150 个,如果还是每个进程占用 4M 内存,那么总的内存消耗为 600M,这种配置能节省大量内存,但是,系统处理了 150 次 TCP 的握手和关闭的操作,因此又会多消耗一些 CPU 资源。
 
  在看看实践的观察。
 
  我在一组大量处理动态网页内容的服 务器中,起初打开 KeepAlive 功能,经常观察到用户访问量大时Apache进程数也非常多,系统频繁使用交换内存,系统不稳定,有时负载会出现较大波动。关闭了 KeepAlive 功能后,看到明显的变化是: Apache 的进程数减少了,空闲内存增加了,用于文件系统Cache的内存也增加了,CPU 的开销增加了,但是服务更稳定了,系统负载也比较稳定,很少有负载大范围波动的情况,负载有一定程度的降低;变化不明显的是:访问量较少的时候,系统平均 负载没有明显变化。
 
 
  总结一下:
  在内存非常充足的服务器上,不管是否关闭 KeepAlive 功能,服务器性能不会有明显变化;
  如果服务器内存较少,或者服务器有非常大量的文件系统访问时,或者主要处理动态网页服务,关闭 KeepAlive 后可以节省很多内存,而节省出来的内存用于文件系统Cache,可以提高文件系统访问的性能,并且系统会更加稳定。
 
 
   补充:
  关于是否应该关闭 KeepAlive 选项,我觉得可以基于下面的一个公式来判断。
 
  在理想的网络连接状况下, 系统的 Apache 进程数和内存使用可以用如下公式表达:
HttpdProcessNumber = KeepAliveTimeout * TotalRequestPerSecond / Average(KeepAliveRequests)
HttpdUsedMemory = HttpdProcessNumber * MemoryPerHttpdProcess
  换成中文:
总Apache进程数 = KeepAliveTimeout * 每秒种HTTP请求数 / 平均KeepAlive请求
Apache占用内存 = 总Apache进程数 * 平均每进程占用内存数
 
  需要特别说明的是:
  [平均KeepAlive请求] 数,是指每个用户连接上服务器后,持续发出的 HTTP 请求数。当 KeepAliveTimeout 等 0 或者 KeepAlive 关闭时,KeepAliveTimeout 不参与乘的运算从上面的公式看,如果 [每秒用户请求] 多,[KeepAliveTimeout] 的值大,[平均KeepAlive请求] 的值小,都会造成 [Apache进程数] 多和 [内存] 多,但是当 [平均KeepAlive请求] 的值越大时,[Apache进程数] 和 [内存] 都是趋向于减少的。
 
  基于上面的公式,我们就可以推算出当 平均KeepAlive请求 <= KeepAliveTimeout 时,关闭 KeepAlive 选项是划算的,否则就可以考虑打开。

4、DSO模块加载

语法:LoadModule  模块名称  模块路径

注意:可以使用绝对路径和相对路径,相对路径为ServerRoot定义的路径

[root@localhost ~]# httpd -M        # 列出已经装载的所有DSO及非DSO模块
[root@localhost ~]# httpd -l        # 列出支持使用的非DSO模块

5、设置站点名称

语法:ServerName www.example.com:80

注意:如果设置这项,在启动apache的时候 apache会去试图反解当前主机监听的IP地址去得到主机名 如果反解不出来就会报错。并使用127.0.0.1。

解决办法:           

  1. 启动这个选项并设置站点名称

  2. 添加监听地址对应的主机名 host记录

# vi /etc/hosts
172.16.100.1   www.example.com   www

6、配置站点根目录

# DocumentRoot: The directory out of which you will serve your
# documents. By default, all requests are taken from this directory, but
# symbolic links and aliases may be used to point to other locations.
#
DocumentRoot "/var/www/html"

7、配置访问属性

<Directory "/var/www/html">
Options             #以下为选项,一般是写成一行,这里为了方便归类,写成竖排
    Indexes             #缺少主页时,允许将目录中的所有文件以列表的方式发回给用户(危险)
    FollowSymLinks      #允许跟随符号连接所指向的原始文件(危险)
    none                #所有都不启用
    all                 #所有都启用
    ExecCGI             #允许使用mod_cgi模块执行CGI脚本
    Includes            #允许使用mod_include模块实现服务器端包含(SSI)
    MultiViews          #允许使用mod_negotiation实现内容协商
    SymLinksIfOwnerMatch    #在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件

# AllowOverride controls what directives may be placed in .htaccess files.
# 控制哪些指令可以应用在.htaccess文件中,也就是.htaccess中的配置能否覆盖主配置文件中的指令
AllowOverride       
    None                #  
    Option              #
    FileInfo            #
    AuthConfig          #
    Limit               #
 
 Order allow,deny   #这两行都是基于IP访问控制的, 后面一项是默认选项(这里是deny)
 Allow from all     
</Directory>

作用:限制访问站点资源的客户端来源,即设置允许或拒绝访问服务器资源的来源主机。

配置指令:

         Order allow,deny|deny,allow

         Allow from  all|IP地址|网络号       # 定义允许列表

         Deny from   all|IP地址|网络号       # 定义拒绝列表

         指令说明:Order指令是用来定义allow和deny哪一个为默认法则;

                   写在后面的为默认法则;

                   写在前面的指令,没有显示定义的,即受后面指令控制。

例子:

Order allow,deny
Allow from 172.16.0.0/16    //仅允许这个网段内的客户端访问

Order deny,allow
Deny from 172.16.0.0/16     //仅拒绝这个网段内的客户端访问

Order allow,deny
Allow from 172.16.0.0/16
Deny from 172.16.100.7      //最长匹配原则 172.16.100.7是被拒绝的

参数说明:

Order定义allow和deny哪个为默认法则:写在后面的为默认法则,即deny,意味着写在前面的指令没有明确定义的即后面的控制。

以第二行为例,如果allow后面没有明确说明,则除此条规则外全部都是deny。

例子:

1、仅允许这个网段的IP访问

<Directory "/var/www/html">
   Options Indexes FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from 192.168.11.0/24
</Directory>

2、只禁止某个IP段的主机访问,其他全部放行

<Directory "/var/www/html">
   Options Indexes FollowSymLinks
   AllowOverride None
   Order deny,allow
   deny from 192.168.11.0/24
</Directory>

8、定义默认主页

DirectoryIndex index.html index.html.var  
#默认主页为index.html,会依次向后查询

9、配置日志功能

# 错误日志
ErrorLog logs/error_log

LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined     
#combined日志模版
LogFormat "%h %l %u %t \"%r\" %>s %b" common #common日志模版
LogFormat "%{Referer}i -> %U" referer        #rederer日志模版
LogFormat "%{User-agent}i" agent             #agent日志模版

# 访问日志
CustomLog logs/access_log combined           #这里使用的是combined的模版
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时的远程用户名,没有认证时为-
%t: 收到请求时的时间;
%r: 请求报文的起始行;
%>s: 响应状态码;
%b: 响应报文的长度,单位为字节
%{Header_Name}i: 记录指定请求报文首部的内容

10、配置路径别名

Alias /icons/ "/var/www/icons/"  
#意味着访问http://Server_IP/icons/时,其页面文件来自于/var/www/icons/这个位置

11、设定默认字符集

AddDefaultCharset UTF-8

12、告知 Apache 如何解析特定的扩展名

比如apache解析 PHP

AddType application/x-httpd-php .php    
AddType application/x-httpd-php-source .phps

但是php官方站点提到:

    为了避免潜在的危险,例如上传或者创建类似 exploit.php.jpg 的文件并被当做 PHP 执行,我们不再使用 Apache 的 AddType 指令来设置。参考下面的例子,你可以简单的将需要的扩展名解释为 PHP。我们演示为增加.php。

<FilesMatch \.php$>
   SetHandler application/x-httpd-php
</FilesMatch>

或者,你也想将 .php,.php2,.php3,.php4,.php5,.php6,以及 .phtml 文件都当做 PHP 来运行,我们无需额外的设置,仅需按照下面这样来:

<FilesMatch "\.ph(p[2-6]?|tml)$">
   SetHandler application/x-httpd-php
</FilesMatch>

然后,可以将 .phps 文件由 PHP 源码过滤器处理,使得其在显示时可以高亮源码,设置如下:

<FilesMatch "\.phps$">
   SetHandler application/x-httpd-php-source
</FilesMatch>



本文出自 “Share your knowledge” 博客,请务必保留此出处http://skypegnu1.blog.51cto.com/8991766/1532126