httpd主要有以下特性:

高度模块化:core + modules

DSO: Dynamic Shared Object,动态共享库

MPM:Multipath Processing Modules,多道处理模块

  同时支持以下功能:虚拟主机;CGI:Common Gateway Interface,通用网关接口;反向代理;负载均衡;路径别名;丰富的用户认证机制;basic;digest;支持第三方模块。

配置文件参数格式特点: 

配置指令不区分字符大小写

值可能区分大小写

有些指令可以重复出现多次 

配置文件格式包含三部分:

全局配置

主机配置:适用于主机只提供一个站点

虚拟主机:用于提供多个站点

常用配置:

1、ServerRoot

用于指定Apache的运行目录,服务启动之后自动将目录改变为当前目录,在后面使用到的所有相对路径都是想对这个目录下。

2、Listen 80

(1) IP省略时表示监听本机上所有可用的IP地址;

(2) Listen指令可以出现多次,用于指明多个不同的监听端口或套接字

3、LoadModule:加载特定的DSO模块

Apache默认将已编译的DSO模块存放于目录结构小节中所示的动态加载模块目录中。

语法:LoadModule module filename

如:LoadModule rewrite_module modules/mod_rewrite.so

如果filename使用相对路径,则路径是相对于ServerRoot所指示的相对路径。

4、User,Group

设置实际提供服务的子进程的用户。为了使用这个指令,服务器必须以root身份启动和初始化。如果你以非root身份启动服务器,子进程将不能够切换至非特权用户,并继续以启动服务器的原始用户身份运行。如果确实以root用户启动了服务器,那么父进程将仍然以root身份运行。用于运行子进程的用户必须是一个没有特权的用户,这样才能保证子进程无权访问那些不想为外界所知的文件,同样的,该用户亦需没有执行那些不应当被外界执行的程序的权限

强烈建议专门为Apache子进程建立一个单独的用户和组。一些管理员使用nobody用户,但是这并不能总是符合要求,因为可能有其他程序也在使用这个用户。

5、ServerAdmin

设置在所有返回给客户端的错误信息中包含的管理员邮件地址。一般较少设置。

6、ServerName

设置服务器用于辨识自己的主机名和端口号。

7、DocumentRoot

设置Web文档根目录,如果directory-path不是绝对路径,则被假定为是相对于ServerRoot的路径。指定DocumentRoot时不应包括最后的"/"。

8. <Directory>

<Directory>和</Directory>用于封装一组指令,使之仅对某个目录及其子目录生效。

Directory-path可以是一个目录的完整路径,或是包含了Unix shell匹配语法的通配符字符串。在通配符字符串中,"?"匹配任何单个的字符,"*"匹配任何字符序列。也可以使用"[]"来确定字符范围。在"~" 字符之后也可以使用正则表达式。

   如果有多个(非正则表达式)<Directory>配置段符合包含某文档的目录(或其父目录),那么指令将以短目录优先的规则进行应用,并包含.htaccess文件中的指令。正则表达式将在所有普通配置段之后予以考虑。所有的正则表达式将根据它们出现在配置文件中的顺序进行应用。

<Directory>指令不可被嵌套使用,也不能出现在<Limit>或<LimitExcept>配置段中。

9. <Files>

提供基于文件名的访问控制,类似于<Directory>和<Location>指令。

filename参数应当是一个文件名或是一个包含通配符的字符串,匹配方法如上。在此配置段中定义的指令将作用于其基本名称(不是完整的路径)与指定的文件名相符的对象。<Files>段将根据它们在配置文件中出现的顺序被处理:在<Directory>段和.htaccess文件被处理之后,但在<Location>段之前。<Files>能嵌入到<Directory>段中以限制它们作用的文件系统范围,也可用于.htaccess文件当中,以允许用户在文件层面上控制对它们自己文件的访问。

10. <IfModule>

封装根据指定的模块是否启用而决定是否生效的指令。

module-file是指编译模块时的文件名,比如mod_rewrite.c。

module-identifier是指模块的标识符,比如mod_rewrite。

在<IfModule>配置段中的指令仅当测试结果为真的时候才进行处理,否则所有其间的指令都将被忽略。

11、

<Directory />
    Options FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
</Directory>

  • Options

Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用;

FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容;

None: none

All: 所有的都启用;

  • AllowOverride

如果此指令被设置为None,那么.htaccess文件将被完全忽略。事实上,服务器根本不会读取.htaccess文件。

当此指令设置为All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override。

directive-type可以是下列各组指令之一:

AuthConfig  允许使用与认证授权相关的指令

FileInfo  允许使用控制文档类型的指令、控制文档元数据的指令、mod_rewrite中的指令、mod_actions中的Action指令

Indexes  允许使用控制目录索引的指令

Limit  允许使用控制主机访问的指令

Options[=Option,...]  允许使用控制指定目录功能的指令(Options和XBitHack)。可以在等号后面附加一个逗号分隔的(无空格的)Options选项列表,用来控制允许Options指令

使用哪些选项。

  • 基于来源地址访问控制

Order: 检查次序

Order Allow Deny:只有明确Allow的来源地址,才允许访问,其它的均为Deny

Order Deny Allow: 

Allow from:允许访问的来源地址

Deny from:拒绝访问的来源地址

12、DirectoryIndex index.html index.php

当客户端请求一个目录时寻找的资源列表。Local-url(%已解码的)是一个相对于被请求目录的文档的URL(通常是那个目录中的一个文件)。可以指定多个URL,服务器将返回最先找到的那一个。

13、ErrorLog "logs/error_log"

指定当服务器遇到错误时记录错误日志的文件。如果file-path不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot的相对路径

14、LogLevel

用于调整记录在错误日志中的信息的详细程度。

可以选择下列level,依照重要性降序排列:

emerg  紧急(系统无法使用)

alert  必须立即采取措施

crit  致命情况

error  错误情况

warn  警告情况

notice  一般重要情况

info   普通信息

debug  调试信息

当指定了某个级别时,所有级别高于它的信息也会被同时记录。比如,指定 LogLevel info ,则所有notice和warn级别的信息也会被记录。建议至少使用crit级别。

显示的格式日下: 

[Mon Oct 10 15:54:29 2005] [error] [client 192.168.10.22] access to /download/ failed, reason: user admin not allowed access 

15、LogFormat

定义访问日志的记录格式。

日志的缺省格式有如下几种: 

LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined 

LogFormat "%h %l %u %t "%r" %>s %b" common #common为日志格式名称 

LogFormat "%{Referer}i -> %U" referer 

LogFormat "%{User-agent}i" agent 

CustomLog logs/access_log common 

格式中的各个参数如下: 

%h --客户端的ip地址或主机名 

%l --The 这是由客户端 identd 判断的RFC 1413身份,输出中的符号 "-" 表示此处信息无效。 

%u --由HTTP认证系统得到的访问该网页的客户名。有认证时才有效,输出中的符号 "-" 表示此处信息无效。 

%t --服务器完成对请求的处理时的时间。 

"%r" --引号中是客户发出的包含了许多有用信息的请求内容。 

%>s --这个是服务器返回给客户端的状态码。 

%b --最后这项是返回给客户端的不包括响应头的字节数。 

"%{Referer}i" --此项指明了该请求是从被哪个网页提交过来的。 

"%{User-Agent}i" --此项是客户浏览器提供的浏览器识别信息。 

下面是一段访问日志的实例: 

192.168.10.22 - bearzhang [10/Oct/2005:16:53:06 +0800] "GET /download/ HTTP/1.1" 200 1228 

192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/blank.gif HTTP/1.1" 304 -

192.168.10.22 - - [10/Oct/2005:16:53:06 +0800] "GET /icons/back.gif HTTP/1.1" 304 -

16、CustomLog

设定日志的文件名和格式。

17、ErrorDocument

定义错误显示页面,批示当遇到错误的时候服务器将给客户端什么样的应答。

ErrorDocument 500 "The server made a boo boo."

ErrorDocument 404 /missing.html

ErrorDocument 404 "/cgi-bin/missing_handler.pl"

ErrorDocument 402 http://www.example.com/subscription_info.html  

18、Alias

路径别名

Alias /alias/ "/path/to/somewhere/" ##前面加“/”后面也要加,否则都不加。

意味着访问http://Server_IP/alias/时,其页面文件来自于/path/to/somewhere这个位置。

19、#EnableMMAP off

    是否允许内存映射:如果httpd在传送过程中需要读取一个文件的内容,它是否可以使用内存映射。如果为on表示如果操作系统支持的话,将使用内存映射。在一些多核处理器的系统上,这可能会降低性能,如果在挂载了NFS的DocumentRoot上,如果开启此项功能,可能造成因为分段而造成httpd崩溃。

20、#EnableSendfile off

    这个指令控制httpd是否可以使用操作系统内核的sendfile支持来将文件发送到客户端。默认情况下,当处理一个请求并不需要访问文件内部的数据时(比如发送一个静态的文件内容),如果操作系统支持,Apache将使用sendfile将文件内容直接发送到客户端而并不读取文件。

21、LoadModule

LoadModule foo_module modules/mod_foo.so

    ## 如果是使用相对路径,则为相对于ServerRoot所定义的位置而言,如果取消装载,直接在配置文件中把这一行取消

httpd -M   列出已经装载的所有DSO以及非DSO模块 

    Loaded Modules:

    core_module (static)

    mpm_prefork_module (static)

    http_module (static)

    so_module (static)

    auth_basic_module (shared)    

httpd -l   列出支持的非DSO模块(比如已经编译进入主程序的)

     Compiled in modules:

          core.c        # 核心模块

          prefork.c     # 编译时,有且只有一个模型

          http_core.c   # http核心模块

          mod_so.c      # 实现模块装卸

22、CGI(不懂)

CGI脚本路径别名 

    CGI(Common Gateway Interface): 允许网页访问在特定目录下执行一些脚本,shell脚本依赖系统命令,有时需要UID和GID, 这也造成了安全隐患。

    PHP,python 等脚本语言也是用类似的协议,但是由于有自己库,可以避免依赖系统库。 

    控制CGI脚本路径别名的模块: mod_alias, mod_cgi 

    在/etc/httpd/conf/httpd.conf 配置 

## 配置文件中配置 

ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"

## 在/var/www/cgi-bin/ 下面创建测试脚本,如下,并给执行权限  

#!/bin/bash 

#                

cat << EOF

Content-Type: text/html

<pre>

The hostname is: `hostname`.

The time is: `date`.

</pire>

EOF

## 为了测试方便,关闭虚拟机的iptables,用宿主机访问192.168.233.128/cgi-bin/test.sh, 的到如下结果,说明测试成功。

httpd配置文件详解(一)_httpd

extra部分配置

httpd-default.conf

1、ServerSignature Off

取消apache的版本返回显示签名

2、ServerTokens

建议ServerTokens Full修改为ServerTokens Prod

该参数设置http头部返回的apache版本信息,可用的值和含义如下: 

Prod:仅软件名称,例如:apache 

Major:包括主版本号,例如:apache/2 

Minor:包括次版本号,例如:apache/2.0 

Min:仅apache的完整版本号,例如:apache/2.0.54 

OS:包括操作系统类型,例如:apache/2.0.54(Unix) 

Full:包括apache支持的模块及模块版本号,例如:Apache/2.0.54 (Unix) mod_ssl/2.0.54 OpenSSL/0.9.7g 

3、KeepAlive On

会话保持是否保持

4、Timeout 60

会话保持时间,建议修改为 Timeout 100

5、MaxKeepAliveRequests

请求允许持久性连接时的最大数量,设置为0,允许数量不限,根据实际情况调节。

6、HostnameLookups Off

当打开此项功能时,在记录日志的时候同时记录主机名,这需要服务器来反向解析域名,增加了服务器的负载,通常不建议开启。


httpd-mpm.conf

apache2主要的优势就是对多处理器的支持更好,在编译时同过使用--with-mpm选项来决定apache2的工作模式。如果知道当前的apache2使用什么工作机制,可以通过httpd -l命令列出apache的所有模块,就可以知道其工作方式: 

  • prefork:如果httpd -l列出prefork.c,则需要对下面的段进行配置: 

<IfModule prefork.c> 

StartServers 5 #启动apache时启动的httpd进程个数。 

MinSpareServers 5 #服务器保持的最小空闲进程数。 

MaxSpareServers 10 #服务器保持的最大空闲进程数。 

MaxClients 150 #最大并发连接数。 

MaxRequestsPerChild 1000 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。 

</IfModule> 

在 该工作模式下,服务器启动后起动5个httpd进程(加父进程共6个,通过ps -ax|grep httpd命令可以看到)。当有用户连接时,apache会使用一个空闲进程为该连接服务,同时父进程会fork一个子进程。直到内存中的空闲进程达到 MaxSpareServers。该模式是为了兼容一些旧版本的程序。我缺省编译时的选项。 

  • worker:如果httpd -l列出worker.c,则需要对下面的段进行配置: 

<IfModule worker.c> 

StartServers 2 #启动apache时启动的httpd进程个数。 

MaxClients 150 #最大并发连接数。 

MinSpareThreads 25 #服务器保持的最小空闲线程数。 

MaxSpareThreads 75 #服务器保持的最大空闲线程数。 

ThreadsPerChild 25 #每个子进程的产生的线程数。 

MaxRequestsPerChild 0 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。 

</IfModule> 

该 模式是由线程来监听客户的连接。当有新客户连接时,由其中的一个空闲线程接受连接。服务器在启动时启动两个进程,每个进程产生的线程数是固定的 (ThreadsPerChild决定),因此启动时有50个线程。当50个线程不够用时,服务器自动fork一个进程,再产生25个线程。 

  • perchild:如果httpd -l列出perchild.c,则需要对下面的段进行配置: 

<IfModule perchild.c> 

NumServers 5 #服务器启动时启动的子进程数 

StartThreads 5 #每个子进程启动时启动的线程数 

MinSpareThreads 5 #内存中的最小空闲线程数 

MaxSpareThreads 10 #最大空闲线程数 

MaxThreadsPerChild 2000 #每个线程最多被请求多少次后退出。0不受限制。 

MaxRequestsPerChild 10000 #每个子进程服务多少次后被重新fork。0表示不受限制。 

</IfModule> 

该模式下,子进程的数量是固定的,线程数不受限制。当客户端连接到服务器时,又空闲的线程提供服务。 如果空闲线程数不够,子进程自动产生线程来为新的连接服务。该模式用于多站点服务器。

httpd-userdir.conf(未用过)

如果期望让每个用户都可以创建个人站点:http://Server_IP/~Username/,可以启用此部分配置

userdir disablied: 禁止

userdir public_html

public_html是用户家目录下的目录名称,所有位于此目录中的文件均可通过前述的访问路径进行访问用户的家目录得赋予运行httpd进程的用户拥有(进入)执行权限;

httpd-languages.conf

字符集配置,,默认为UTF-8(?),字符集和网页不匹配,访问时为乱码,可在httpd.conf中增加AddDefaultCharset UTF-8设置默认字符集。