前两篇博文简单的描述了web服务的基本原理,已并且编译安装了httpd2.4。今天以httpd的配置文件为蓝本,详细讲解下httpd的配置。由于2.2与2.4版本配置文件并不完全一致,这里兼顾了2.2与2.4的配置文件的主要内容。
本文主要内容框架
httpd文件概览
配置文件的格式
主要设置
一、httpd文件概览
httpd编译安装完成后生成了一些重要的文件。主要是配置文件和应用程序文件。在上一篇中,我们将程序安装在/usr/local/apache目录下,配置文件存放在/etc/httpd24目录下。
这里列出我们可能会使用到的主要文件、目录。更多详细信息可参考apache官方文档
二、配置文件的格式
配置文件中大致分为全局配置、主机配置、虚拟主机配置。全局配置对整个配置文件都有下效,主机配置仅用于配置一个站点,虚拟主机配置用于提供多个站点时候使用。要注意:主机配置和虚拟主机配置不可能存在生效。
配置内容的主要格式是:
配置参数 值
eg:Listen 80
其中:配置参数指令不区分大小写,但约定俗成,首字母大写了;值大小写敏感;有的参数可能会出现多次。
这里简单给出了配置文件的轮廓。需要说明的是,2.2与2.4的配置文件还是有一定的区别。尤其是虚拟主机的配置,2.4将其配置文件放到了ext ra目录下。具体描述到各个功能的时候再详细介绍其不同
三、主要设置
配置文件是httpd的重要控制文件,几乎所有的功能模块都需要在配置文件中设置。下面,将经常使用到的配置进行分析。
在具体解析配置文件之前,先确认下httpd的工作机制。httpd是一个高度模块化的程序,它由core+module组成,可以通过DSO模块来增加或者取消相应的功能。为了适应这个机制,将功能化,实现“热插拔”的功能,aapache提供了MPM机制。这里我们介绍下MPM:多处理模块。在httpd下有三种,prefork、worker、event。
prefork | 多进程运行,一个进程响应一个请求。 | 简单高效,稳定,连接数大时消耗内存过大 | 预先建立进程 |
worker | 多线程运行,一个进程多个线程相应请求。每个进程线程数固定 | 处理请求量大,不稳定,一个线程崩溃,整个进程就崩溃 | 预先建立进程 |
event | 基于事件驱动。主进程生成多个子线程,子线程相应多个请求 | 处理大量数据 | 对https支持不好 |
prefork:多进程运行,在web服务器中,root用户生成一个主进程,主进程管理控制生成多个子进程,每个进程处理一个请求。在用户请求到达之前,主进程预生成多个子进程,作为备用和空闲进程,以应对即将到来的请求。但是,在请求数量急剧增大情况下,对系统内存资源的消耗十分严重。
<IfModule mpm_prefork_module> StartServers 5 //默认启动进程数 MinSpareServers 5 //最小空闲进程数 MaxSpareServers 10 //最大空闲进程数 MaxRequestWorkers 250 //最大启动进程数 MaxConnectionsPerChild 0 </IfModule>
worker:多进程运行,每个进程又生成多个线程,每个进程的线程数是固定的,每个线程相应一个请求。同prefork类似,它也事先生成空闲进程备用。主进程会根据访问情况动态增加或者减少进程数量,每个子进程可建立多个服务线程和一个监听线程,监听线程接收请求,并将相关信息传入服务线程。同prefork相比,它能相应更多的请求,消耗更少的系统资源,但是由于采用线程响应,如果一个线程出现崩溃,整个进程就会崩溃,造成不稳定;
<IfModule mpm_worker_module> StartServers 3 //默认启动进程数 MinSpareThreads 75 //最小空闲线程数 MaxSpareThreads 250 //最大空闲线程数 ThreadsPerChild 25 //每子进程生成线程数 MaxRequestWorkers 400 //最大的工作线程数 MaxConnectionsPerChild 0 //线程生命周期结束前最大服务的请求数,0为不限制 </IfModule>
event:基于事件的模型。由主进程生成多个进程,子进程生成多个线程,每个线程响应多个请求。这点worker模式一样。但是,event模式下,负责连接的工作统一由主进程实现,线程只负责里事务,处理完成后立即释放。
在编译安装时可以指定默认使用的是哪种模式,
# ./configure --prefix=/usr/local/apache --enable-so --with-mpm=worker
在编译完成如果需要切换,在2.4的版本中,可以通过取消、加载模块的方式实现。
这里我们以httpd2.4为蓝本介绍主要配置信息。
1、Listen 80
控***务器注册到内核的监听端口,可以修改成其他端口,但是一般情况下,使用默认80端口。
2、LoadModule authn_file_module modules/mod_authn_file.so
#LoadModule authn_dbm_module modules/mod_authn_dbm.so
加载模块,这里只列举了两个,在配置文件中,可以使用到的模块都可以通过上述形式加载进来。
3、DocumentRoot
这里Option定义了页面访问的属性。主要的值有
Indexes | 缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给用户;危险,不建议使用 |
FollowSymLinks | 允许跟随符号链接所指向的原始文件,与首部文件中的reference类似 |
None | 所有都不启用 |
All | 所有都启用 |
ExecCGI | 允许使用mod_cgi模块执行CGI脚本 |
Includes | 允许使用mod_include模块实现服务器端包含(SSI) |
MultiViews | 允许使用mod_negotiation实现内容协商 |
SymLinksIfOwnerMatch | 在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件 |
AllowOverride 指明它下面定义的控制是否生效,一般情况下值有none(不禁用)和authconfig、all
在2.4中,授权统一使用requrie.
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
允许某个IP地址访问 Require IP-address等
4、虚拟主机
虚拟主机是一个重要的概念,在2.4中,虚拟主机的配置文件在extra目录中。要实现虚拟机主机。需要现在主配置文件中先做设置,同时禁用主机,主机和虚拟主机是不能同时存在的。
4.1 在主配置文件中找到DocumentRoot,注释掉该行,取消主机配置
注释掉该行 #DocumentRoot "/usr/local/apache/htdocs"
4.2 找到Virtual hosts取消注释,将扩展配置文件包含到主配置文件中
# Virtual hosts #取消注释,包含扩展配置文件 Include /etc/httpd24/extra/httpd-vhosts.conf
4.3 在扩展配置文件中,设置虚拟机主机
编辑扩展配置文件
# vim httpd-vhosts.conf
设置相关信息
#设定虚拟主机监听的端口,这里要与主配置文件中监听的端口一致,或者自行添加新的监听端口 <VirtualHost *:80> ServerName www.a.com //虚拟主机名称 DocumentRoot "/usr/local/apache/htdocs/test" //虚拟主机文件所在目录 <Directory "/usr/local/apache/htdocs/test"> //定义页面访问属性,访问控制。2.4中,必须为页面设置访问控制,否知会出现拒绝访问的错误 Options None Require all granted </Directory> ErrorLog "logs/a.error_log" //定义错误日志 </VirtualHost>
4.4 保存设置,重新加载配置文件,测试配置页面
这里我仅仅设置了一个虚拟站点,可以根据需求设置多个不同的站点。设置完成之后必须重新加载配置文件,才能头生效。
先检查是否有语法错误
# httpd -t
重新加载配置文件
# servcie httpd24 reload
访问页面即可
5、服务器状态页
在2.4中,服务器状态页的配置也在extra目录中,编辑httpd-info.conf 配置文件,
显示服务器状态信息 <Location /server-status> SetHandler server-status Require host .example.com Require ip 127 </Location>
要能够使配置生效,必须在主配置文件中加载该扩展配置文件
# Real-time info on requests and configuration #取消该行注释 Include /etc/httpd24/extra/httpd-info.conf
在浏览器中查看相关信息即可http://IP地址/server-status
6、定义默认主页
<IfModule dir_module> DirectoryIndex index.html //主页 </IfModule>
以后我们如果部署php的网站,那就就需要在这里添加index.php。
7.路径别名
有时候我们在浏览器中输入的地址并不是我们在文件系统中的路径。这个是靠路径别名的功能来实现的。
首先要装载相关模块
LoadModule alias_module modules/mod_alias.so
然后在模块定义中添加配置
Alias /test /usr/local/a
在浏览器中输入http://IP地址/test显示的就是a目录下的内容,而不再是主机目录或者虚拟主机目录下的内容
8、基于用户的访问控制
基于用户的访问控制主要有两种,一直是表单控制,一种是基于http协议的认证。基于http协议的认证一般不在正式的上线网站中使用,使用较多的是在对管理页面的单独控制。比如对某监控页面,要求只有特定用户才能访问。
8.1 编辑配置文件,为需要认证的目录配置认证机制
DocumentRoot "/usr/local/apache/htdocs" <Directory "/usr/local/apache/htdocs"> Options Indexes FollowSymLinks AllowOverride AuthConfig AuthType Basic AuthName "test" AuthUserFile /etc/httpd24/.htpasswd //验证文件 Require valid-user </Directory>
8.2 生成验证文件
[root@simon apache]# htpasswd -c /etc/httpd24/.htpasswd test New password: Re-type new password: Adding password for user test [root@simon apache]#
8.3 重新加载配置文件,验证是否成功
9、小结
httpd2.4的配置文件内容众多,并且将2.2主配置文件中的许多配置扩展成了补充配置文件放置在extra目录下,启用的时候需要取消对默写功能包含的注释。
由于内容过多,有的特性没有写进去。稍后会陆续再更新。
Version 1.0 2014-3-23