httpd主要有如下特性:php
高度模块化:core + moduleshtml
DSO: Dynamic Shared Object,动态共享库python
MPM:Multipath Processing Modules,多道处理模块正则表达式
同时支持如下功能:虚拟主机;CGI:Common Gateway Interface,通用网关接口;反向代理;负载均衡;路径别名;丰富的用户认证机制;basic;digest;支持第三方模块。shell
配置文件参数格式特色: apache
配置指令不区分字符大小写浏览器
值可能区分大小写安全
有些指令能够重复出现屡次 bash
配置文件格式包含三部分:服务器
全局配置
主机配置:适用于主机只提供一个站点
虚拟主机:用于提供多个站点
经常使用配置:
一、ServerRoot
用于指定Apache的运行目录,服务启动以后自动将目录改变为当前目录,在后面使用到的全部相对路径都是想对这个目录下。
二、Listen 80
(1) IP省略时表示监听本机上全部可用的IP地址;
(2) Listen指令能够出现屡次,用于指明多个不一样的监听端口或套接字
三、LoadModule:加载特定的DSO模块
Apache默认将已编译的DSO模块存放于目录结构小节中所示的动态加载模块目录中。
语法:LoadModule module filename
如:LoadModule rewrite_module modules/mod_rewrite.so
若是filename使用相对路径,则路径是相对于ServerRoot所指示的相对路径。
四、User,Group
设置实际提供服务的子进程的用户。为了使用这个指令,服务器必须以root身份启动和初始化。若是你以非root身份启动服务器,子进程将不可以切换至非特权用户,并继续以启动服务器的原始用户身份运行。若是确实以root用户启动了服务器,那么父进程将仍然以root身份运行。用于运行子进程的用户必须是一个没有特权的用户,这样才能保证子进程无权访问那些不想为外界所知的文件,一样的,该用户亦需没有执行那些不该当被外界执行的程序的权限
。强烈建议专门为Apache子进程创建一个单独的用户和组。一些管理员使用nobody用户,可是这并不能老是符合要求,由于可能有其余程序也在使用这个用户。
五、ServerAdmin
设置在全部返回给客户端的错误信息中包含的管理员邮件地址。通常较少设置。
六、ServerName
设置服务器用于辨识本身的主机名和端口号。
七、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>配置段中的指令仅当测试结果为真的时候才进行处理,不然全部其间的指令都将被忽略。
十一、
<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:拒绝访问的来源地址
十二、DirectoryIndex index.html index.php
当客户端请求一个目录时寻找的资源列表。Local-url(%已解码的)是一个相对于被请求目录的文档的URL(一般是那个目录中的一个文件)。能够指定多个URL,服务器将返回最早找到的那一个。
1三、ErrorLog "logs/error_log"
指定当服务器遇到错误时记录错误日志的文件。若是file-path不是一个以斜杠(/)开头的绝对路径,那么将被认为是一个相对于ServerRoot的相对路径
1四、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
1五、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 -
1六、CustomLog
设定日志的文件名和格式。
1七、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
1八、Alias
路径别名
Alias /alias/ "/path/to/somewhere/" ##前面加“/”后面也要加,不然都不加。
意味着访问http://Server_IP/alias/时,其页面文件来自于/path/to/somewhere这个位置。
1九、#EnableMMAP off
是否容许内存映射:若是httpd在传送过程当中须要读取一个文件的内容,它是否可使用内存映射。若是为on表示若是操做系统支持的话,将使用内存映射。在一些多核处理器的系统上,这可能会下降性能,若是在挂载了NFS的DocumentRoot上,若是开启此项功能,可能形成由于分段而形成httpd崩溃。
20、#EnableSendfile off
这个指令控制httpd是否可使用操做系统内核的sendfile支持来将文件发送到客户端。默认状况下,当处理一个请求并不须要访问文件内部的数据时(好比发送一个静态的文件内容),若是操做系统支持,Apache将使用sendfile将文件内容直接发送到客户端而并不读取文件。
2一、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 # 实现模块装卸
2二、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, 的到以下结果,说明测试成功。
extra部分配置
httpd-default.conf
一、ServerSignature Off
取消apache的版本返回显示签名
二、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
三、KeepAlive On
会话保持是否保持
四、Timeout 60
会话保持时间,建议修改成 Timeout 100
五、MaxKeepAliveRequests
请求容许持久性链接时的最大数量,设置为0,容许数量不限,根据实际状况调节。
六、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设置默认字符集。