# yum install httpd
CentOS6上httpd程序安装完成后的主要文件分布:
主配置文件:/etc/httpd/conf/httpd.conf
辅助配置文件:/etc/httpd/conf.d/*.conf 其作用是为httpd.conf提供片段
服务脚本:/etc/rc.d/init.d/httpd
服务脚本配置文件:/etc/sysconfig/httpd
主程序文件:
prefork模型程序文件:/usr/sbin/httpd
worker模型程序文件:/usr/sbin/httpd.worker
event模型程序文件:/usr/sbin/httpd.event
访问日志文件目录:/var/log/httpd/access_log
错误日志文件目录:/var/log/httpd/error_log
站点文档目录:/var/www/html(可以理解为网页文件存放目录)
模块文件路径:/usr/lib64/httpd/modules/
CentOS6上httpd服务常用配置(以下配置均在httpd.conf中)
配置文件的组成:
分为三部分组成
第一部分
### Section 1:Global Environment
配置全局环境,程序工作特性
### Section 2:'Main' server configuration
主服务器配置
### Section 3:Virtual Hosts
虚拟主机配置
### Section 1 Global Environment
1、修改监听的IP和端口
Listen [IP:]PORT
例:Listen 172.16.20.242:8080
省略IP表示监听本机所有IP地址;且Listen可重复多次;
例:
则表示即监听本机所有IP地址的80端口,也监听IP172.16.20.246的8080端口。
2、持久连接,Persistent Connection
连接建立,每个资源获取完成后不会立即断开连接,而是继续等待其它的请求完成;
KeepAlive On|Off
是否开启KeepAlive
MaxKeepAliveRequests #
持久连接允许的发起的的最大请求次数,默认为100,
KeepAliveTimeout #
超时时长,即连接建立之后,第一次请求和第二次请求之间的最大时间,默认为15秒,超过这个时间,连接就会断开,再次请求就必须重新建立连接
测试KeepAlive配置效果
使用telnet HOST PORT指令
输入GET /URL HTTP/1.1(HTTP/1.1为协议版本)
Host: HOSTNAME or IP
敲两次回车
如果开启了KeepAlive,那么连接不会断开,等待用户继续发起请求,知道超过超时时间
如果未开启KeepAlive,那么连接会立即断开
3、MPM配置
MPM即Multipath Process Module是;多道处理模块,模型分别为prefork,worker,event,httpd-2.2不支持同时编译多个模块,所以只能在编译安装时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现不同MPM机制的支持;
prefork:多进程模型,每个进程响应一个请求;
一个主进程,负责生成n个子进程,子进程也成为工作进程,每个子进程处理一个用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过2014个;
prefork配置如下
StartServers:服务启动时启动的服务器进程数。
MinSpareServers:最小空闲进程数,当httpd启动时,会先启动StartServers个子进程,然后再启动MinSpareServers个子进程。
MaxSpareServers:最大空闲进程数,如果空闲子进程数大于MaxSpareServers个,那么httpd会自动kill掉超出的子进程。
MaxClients:并发请求的最大数,即可以同时处理的请求数。
ServerLimit:最大活动进程数,为MaxClient所准备的在其服务生命周期内所允许的最大值,在线的服务器进程数量最大值。最大值为200000,当MaxClients不够用时,可以增大ServerLimit,然后增大MaxClients,一般这两个值相等。
MaxRequestPerChild:每个子进程在生命周期内所能够响应的最大请求数;一旦某进程超过了这个数量则会自动释放所有内存后自杀。这个值可以设置为0,0即永不结束,但这样做的弊端是进程占用内存过大而且容易内存溢出。不过对于KeepAlive链接,只有第一个请求会被算作一个请求,KeepAlive有效期内的其它请求不算。
worker:多线程模型,每个线程响应一个请求;
一个主进程,生成多个子进程,每个子进程生成固定个数的线程,每个线程独立响应一个请求。
worker配置如下
StartServers:当httpd程序启动时,伴随启动StartServers个子进程。
MaxClients:并发请求的最大数,即所有子进程中的线程总数限制。
MinSpareThreads:最小空闲线程数。
MaxSpareThreads:最大空闲线程数。
ThreadsPerChild:每个子进程可以生成的线程数。
MaxRequestsPerChild:每个线程在生命周期内可以相应的最大请求数,0表示不限制。
event模型
事件驱动模型
一个主进程,生产多个子进程,每个子进程直接响应n个请求。
在httpd-2.2中,event为测试使用
在httpd-2.4中,event可在生产使用
确认当前使用的模块的方法:
# ps aux | grep httpd
这里可以查看到运行的是httpd.worker程序,其默认为/usr/sbin/httpd,即prefork
查看当前使用的静态编译的模块:
更换使用的httpd程序:
通过修改/etc/sysconfig/httpd实现,这是服务脚本/etc/rcd/init.d/httpd的配制文件
如果需要切换为其它程序文件,直接将HTTPD=/usr/sbin/httpd.worker中的httpd.worker更改为httpd(prefork模型)或httpd.event(event模型)。需要注意的是,修改配置后,需要重新启动httpd服务才能使配置生效。
4、DSO
Dynamic Shared Object,动态共享对象,即动态装卸载模块
查看所有模块包括静态编译和动态加载的
# httpd -M
使用配置指令实现模块加载
LoadModule <mod_name> <mod_path>
模块路径mod_path可使用相对路径,即相对于ServerROOT(/etc/httpd)指向的路径而言,而在/etc/httpd/modules是一个指向/usr/lib64/httpd/modules/的软链接。因为真实的模块存放路径是/usr/lib64/httpd/modules/
# ll /etc/httpd/modules
# ls /usr/lib64/httpd/modules/
启用和禁用模块:
直接在/etc/httpd/conf/httpd.conf中修改
# vim /etc/httpd/conf/httpd.conf
如上图所示,如果需要禁用某模块,直接在该模块指令前加上"#"号,使该指令注释掉即可,如果需要启用模块,删掉指令前的"#"号和空白字符。注意:修改后需要重启服务才能生效。
### Section 2:'Main' server configuration
5、定义'Main' Server的文档页面路径,即DocmentRoot,也就是网页文件存放目录
默认路径为/var/www/html/,直接修改路径即可,且路径要真实存在。
DocumentRoot指向的路径为URL路径的起始位置:
DocumentRoot "/var/www/html"
如果在/var/www/html/test/index.html,那么访问该网页时,应该输入路径:http://x.x.x.x/test/index.html
6、站点访问控制
即可基于两种类型的路径指明对哪些资源进行访问控制
基于文件系统路径:
<Directory ""></Directory>
<File ""></File> 针对单个文件做访问控制
<FileMatch ""></FileMatch>基于匹配机制进行文件访问控制
基于URL路径:
<Location ""></Location>
...
访问控制机制:
基于来源地址(IP)
基于用户账号密码
7、Directory中基于来源地址实现访问控制
<Directory "/www/htdocs"> Options None AllowOverride None Order allow,deny Allow from all </Directroy>
如果所示,当需要对资源文件进行访问控制的时候,需要修改Directory指令所指定的路径,并且在其中修改访问控制指令,访问控制指令如下:
(1)Options
定义用户对此目录下资源进行访问时所支持的访问选项
所有可用特性:Indexes Includes FollowSysmLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
在指定的选项前加"-"号,意为使此选项失效
例:Options -Indexes Inclues
Indexes:索引
当没有定义主页面时,如果允许Indexes,那么会列出指定的文档根路径下的所有目录及文件,具有非常大的安全风险,CentOS默认设置有默认页面,会在没有定义主页面,而又允许Indexes时,用户就会访问到默认设置的页面,这个网页文件定义在/etc/htpd/conf.d/welcome.conf中
Includes:允许使用mod_include提供的服务器端包含
FollowSymLinks:允许跟踪符号链接文件;如果在资源目录中有符号链接,那么访问符号链接时,会自动追溯访问符号链接指向的文件。
SymLinksifOwnerMatch:只有当前源文件和符号链接文件属主相同,才允许跟踪符号链接文件。
ExecCGI:是否允许执行CGI脚本。
MultiViews:是否允许多视图
AllowOverride:是否允许在此处配置的目录访问控制覆盖每个目录自身的目录访问控制(每目录访问控制)。
(2)基于来源地址的访问控制机制
Order:
Order allow,deny 只有allow的才allow,其他的都为deny,白名单
Order deny,allow 只有deny的才deny,其他的都为allow,黑名单
Allow from ...
Deny from ...
来源地址:
IP
NetAddr:支持多种格式,如下
172.16 == 172.16.0.0 == 172.16.0.0/16 == 172.16.0.0/255/255.0.0
例:
Order allow,deny Allow from 172.16.20.242
意为只放行172.16.20.242,其他的全部都拒绝。
Order deny,allow Allow from 172.16.20.242
意为只拒绝172.16.20.242,其他的全部允许。
8、定义默认主页面
DirectoryIndex index.html index.html.var
可以同时定义多个。
9、日志设定
当客户端访问http资源时会产生日志,日志有两类,错误日志和访问日志。
错误日志:
ErrorLog logs/error_log
此路径是相对应/etc/httpd/而言,而不是根路径,即/etc/httpd/logs/error_log
LogLevel warn 日志级别
级别从高到低一次排列顺序为:
emerg,alert,crit,error,warn,notice,info,debug
emerg:紧急情况,系统无法使用
alert:必须立即采取措施
crit:致命情况
error:错误情况
warn:警告情况
notice:一般重要情况
info:普通信息
debug:出错级别信息
如果定义错误日志记录级别为某一级时,则表示会记录比这个级别更高的的错误日志,包括这个级别
例:LogLevel warn定义记录级别为warn,那么按照排序,warn以上级别的日志都会记录,包括emerg,alert,crit,error,包括warn。
访问日志:
CustomLog logs/access_log combined
日志存储位置 日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
% 表示在记录日志时,根据用户请求将这些宏替换成对应的相关信息。如下:
%h:客户端IP地址;
%l:Remote logname(form identd,if supplied);-表示为空;并非表单登录名,而是使用mod_ident登陆
%u:Remote user,(from auth;may be bogus if return status (%s)is 401);即基于httpbasic或digist登陆认证的用户名;
%t:Time the request was received(standard english format),服务器收到请求的时间;
%r:First line of request,请求报文的首行信息(method url version);
%>s:响应状态码;响应状态中最后一段数值格式的响应状态码信息,而不包括原因短语;
%b:响应报文的大小,单位是字节,不包含响应报文首部;
%{Referer}i:请求报文当中“referer”首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的程序;
详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路径别名
Alias /URL/ "/PATH/TO/SOMEDIR/"
示例:
Alias /bbs/ "/forum/htdocs"
http://www.xxx.com/bbs/index.html
默认index.html存放在/www/htdocs/bbs/
通过别名机制使得路径变成了/forum/htdocs/bbs/
这时候如果访问http://www.xxx.com/bbs/index.html,就不是访问的/www/htdocs/bbs/index.html,而是/forum/htdocs/bbs/index.html
11、设定默认字符集
AddDefaultCharset XXX
常见的中文字符集:GBK,GB2312,GB18030
12、基于用户的访问控制
即使用用户名密码的机制对资源的访问进行控制。
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器端发送响应的资源;
认证方法:
basic:明文
digest:消息摘要,即经过md5加密,很多老版本的浏览器不支持digest认证;不过可以放置在https中使用,现在大多数都是通过表单认证(使用编写的认证程序进行认证,与http程序无关),很少通过这种认证。
安全域:需要用户认证后方能访问的路径(多为敏感资源或路径);应该通过名称对其进行标识,并用于告知用户认证的原因;
用户的账号和密码,一般使用虚拟账号;避免使用系统账号,产生安全隐患,仅用于访问某服务器时用到的认证标识;
存储:
文本文件
SQL数据库
ldap 轻量目录访问协议
nis ???
basic认证:
(1)定义安全域
<Directory ""> Options None AllowOverride None AuthType Basic //认证类型为明文认证 AuthName "STRING" //认证名为为STRING AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" //认证所用的用户文件存储位置 Require user username1 usename2 ... //可用的用户,即那些用户可以通过认证,取自用户文件 </Directory>
例:
首先在httpd.conf中做好相应配置,然后创建存储用户名和密码的用户文件
(2)提供账号和密码存储(文本文件)
用户文件需要使用htpasswd命令进行创建和管理等
htpasswd [options] PASSWORD_FILE USERNMAE
-c:自动创建password_file,因此,仅应该在添加第一个用户时使用;
-m:md5加密用户密码
-s:sha1加密用户名密码
-D:删除指定用户
例:
可以通过cat命令查看密码文件,可以看出用户的密码都是加密存放的。
(3)实现基于组进行认证
<Directory ""> Options None AllowOverride None AuthType Basic AuthName "STRING" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" Require group GROUP1 GROUP2 ... </Directory>
要提供用户文件和组文件
组文件中每一行定义一个组;与用户不就不同的是需要手动创建
GRP_NAME:user1 user2 user3 ...
[root@localhost htdocs]# vim /etc/httpd/conf.d/.htpgroup MyGroup1: tom jerry [root@localhost htdocs]#
示例:
13、虚拟主机,即可以在一个物理服务器上提供多个网页站点服务
有三种实现方案:
基于IP:为每个虚拟主机准备至少一个IP地址
基于PORT:为每个虚拟主机准备至少一个专用port;实践中很少使用
基于hostname:为每个虚拟主机准备至少一个专用hostname;实践中很多使用
可混合使用上述三种方式中任意方式:
注意:一般虚拟主机不能与中心主机混用,所以,要使用虚拟主机,线禁用中心主机;禁用中心主机需要注释DocumentRoot
每个虚拟主机都有自己的专用配置:
<VirtualHost "IP:PORT">
ServerName ""
DocumentRoot ""
ServerAlias
ErrorLog
CustomLog
</VirtualHost>
例1:基于ip
需要有多个IP地址,httpd.conf中配置好后,还需要创建好网页文件,否则会报错。日志文件制定好路径和文件名后,系统会自动生成的。
例2:基于port
需要用到除80以外的端口时,需要额外修改Listen指令
例3:基于hostname
首先需要将NameVirtualHost *:80启用,2.2需要,2.4不需要启用,并且将*号改为监听的IP地址
配置如下
14、内置的status页面
可以通过此页面查看关于服务器的相关信息
在Order指令中,可以配置允许那些IP用户访问此页面,这是非常有必要的
配置完毕后,需要重载配置文件才能生效,访问地址为: http://x.x.x.x/server-status
如果需要查看更详细的信息,需要启用ExtendedStatus On
实现:基于账号实现访问控制,在location中实现
写的比较潦草,如有遗漏错误和争议之处,欢迎大家的批评指正和讨论,谢谢。
原文地址:http://blog.51cto.com/11367661/2048006