1、何为httpd
php
httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会创建一个处理请求的子进程或线程的池。html
Apache是世界使用排名第一的Web服务器软件。它能够运行在几乎全部普遍使用的计算机平台上,因为其跨平台和安全性被普遍使用,是最流行的Web服务器端软件之一。它快速、可靠而且可经过简单的API扩充,将Perl/Python等解释器编译到服务器中。web
2、httpd-2.2的基本功能特征数据库
①、高度模块化设计,而且支持模块的动态装载(DSO机制),因此httpd基本上能够理解为cord(核心)+各类模块组成。apache
②、支持插入式并行处理模块,称为多路处理模块(MPM)。在编译apache时必须选择也只能选择一个MPM,对类UNIX系统,有几个不一样的MPM可供选择,它们会影响到apache的速度和可伸缩性。vim
Prefork MPM :多进程模型,每一个进程响应一个请求。当httpd服务启动时,启动一个主进程,主进程不负责响应客户请求,此主进程负责生成N个子进程。每个子进程也称为工做进程,每一个子进程处理一个用户请求。即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达。浏览器
这个多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器,它的工做方式相似于Apache 1.3。它适合于没有线程安全库,须要避免线程兼容性问题的系统。它是要求将每一个请求相互独立的状况下最好的MPM,这样若一个请求出现问题就不会影响到其余请求。安全
Worker MPM :多线程模型,每一个线程响应一个请求。一个主进程:生成多个子进程,每一个子进程负责生个多个线程,每一个线程响应一个请求。因为Linux线程并不比进程轻量级多少,并且内部调度线程跟进程也是同样的,因此,Worker MPM比起Prefork MPM性能并无多大的提高。bash
此多路处理模块(MPM)使网络服务器支持混合的多线程多进程。因为使用线程来处理请求,因此能够处理海量请求,而系统资源的开销小于基于进程的MPM。可是,它也使用了多进程,每一个进程又有多个线程,以得到基于进程的MPM的稳定性。服务器
每一个进程能够拥有的线程数每一个子进程能够创建ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
不论是Worker模式或是Prefork 模式,Apache老是试图保持一些备用的(spare)或者是空闲的子进程(空闲的服务线程池)用于迎接即将到来的请求。这样客户端就不须要在获得服务前等候子进程的产生。
Event MPM:基于事件驱动:event-driven。复用的多进程I/O结构:一个主进程,启动多个(m)进程,每一个进程响应n个请求。
Prefork MPM和Worker MPM在很是繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减小TCP链接数量和网络负载,可是 Keepalive须要和服务进程或者线程绑定,这就致使一个繁忙的服务器会耗光全部的线程。 Event MPM是解决这个问题的一种新模型,它把服务进程从链接中分离出来。在服务器处理速度很快,同时具备很是高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的。一个以Worker MPM方式工做的繁忙服务器可以承受每秒好几万次的访问量(例如在大型新闻服务站点的高峰时),而Event MPM能够用来处理更高负载。值得注意的是,Event MPM不能在安全HTTP(HTTPS)访问下工做。
注意事项:httpd-2.2:Event MPM为测试使用。httpd-2.4:Event MPM可生产使用。
3、httpd-2.2的配置文件
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/httpd(修改MPM)
主程序文件:
/usr/sbin/httpd(Prefork MPM)
/usr/sbin/httpd.event(Event MPM)
/usr/sbin/httpd.worker(Worker MPM)
日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log:错误日志
站点文档目录(默认,可自行修改配置文件):
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
配置文件的组成:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment(全局环境)
### Section 2: 'Main' server configuration('主'服务器配置)
### Section 3: Virtual Hosts(虚拟主机)
4、httpd-2.2的经常使用配置
httpd的配置文件为:/etc/httpd/conf/httpd.conf
①、修改监听的IP和Port
#Listen 12.34.56.78:80 Listen 80 #监听的IP为可选,若是不填写的为本机全部IP监听在此端口上。能够添加多条Listen。端口默认为80,不建议修改, #由于修改后须要添加端口才能访问。通常内部的某个功能网站可使用其余端口来供内部使用。修改完此项须要重启httpd服务
②、持久链接或非持久链接的配置(持久链接:链接创建,每一个资源获取完成后不会断开链接,而是继续等待其它的请求完成;通常配置为最大数量限制的时候断开或最大空闲时间断开。持久链接的反作用,对并发访问量较大的服务器,持久链接功能会使用有些请求得不到响应;折衷的方法使用较短的持久链接时间。httpd-2.4 支持毫秒级持久时间)
KeepAlive { On | Off } #设置是否容许持久链接,On为容许,Off为不容许 MaxKeepAliveRequests 100 #设置持久链接容许请求的最大资源数量。设置为0,表示容许无限量。 KeepAliveTimeout 15 #持久连接超时时间,这里单位为秒。
这里咱们能够是用一下方法来测试:
telnet IP/HOST PORT(telnet 192.168.0.105 80)回车后输入一下命令:
GET /URL HTTP/1.1(使用GET方法请求/URL的资源,使用HTTP1.1协议)
Host: HOSTNAME or IP(请求/URL资源的主机或IP)
[root@localhost ~]# telnet 192.168.0.105 80 Trying 192.168.0.105... Connected to 192.168.0.105. Escape character is '^]'. GET / HTTP/1.1 Host: 192.168.0.105 HTTP/1.1 403 Forbidden Date: Tue, 15 Sep 2015 03:06:47 GMT Server: Apache/2.2.15 (CentOS) Accept-Ranges: bytes Content-Length: 4954 Content-Type: text/html; charset=UTF-8 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <head> <title>Apache HTTP Server Test Page powered by CentOS</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> .......... </div> </div> </body> </html> Connection closed by foreign host. #这里我开启了持久连接,而后KeepAliveTimeout 15,能够看到,当我请求完一个页面后15s不作请求会给服务断开
③、Multipath Process Module:多路处理模块
httpd-2.2不支持同时编译多个模块,因此只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不一样MPM机制的支持。确认当前使用的MPM的方法:
[root@localhost ~]# ps aux | grep httpd root 8558 5.2 0.3 184324 3868 ? Ss 10:56 0:00 /usr/sbin/httpd apache 8561 0.0 0.2 184324 2456 ? S 10:56 0:00 /usr/sbin/httpd .......... apache 8562 0.0 0.2 184324 2456 ? S 10:56 0:00 /usr/sbin/httpd #默认为/usr/sbin/httpd, 使用的是Prefork MPM
[root@localhost ~]# httpd -l Compiled in modules: core.c prefork.c http_core.c mod_so.c #查看静态编译的模块
root@localhost ~]# httpd -M Loaded Modules: core_module (static) .......... dnssd_module (shared) Syntax OK #查看静态编译及动态装载的模块
当咱们须要切换到不一样MPM模式运行时,能够修改/etc/sysconfig/httpd更换使用的httpd程序。
HTTPD=/usr/sbin/httpd.worker #在代码中找到HTTPD此项目。而后更换为对应的MPM模式便可,修改完须要重启服务。
下面介绍httpd-2.2中参见的两种MPM配置介绍
Prefork MPM
<IfModule prefork.c> StartServers 8 #服务启动后默认开启的进程数 MinSpareServers 5 #最小数量的服务器进程,保存备用 MaxSpareServers 20 #最大数量的服务器进程,保存备用 ServerLimit 256 #最大活动进程数,通常此项会大于最大并发数 MaxClients 256 #最大并发数,最大数量的工做线程 MaxRequestsPerChild 4000 #每一个子进程在生命周期内所可以服务的最大请求个数 </IfModule>
Worker MPM
<IfModule worker.c> StartServers 4 #服务启动后默认开启的进程数 MaxClients 300 #最大并发数,最大数量的工做线程 MinSpareThreads 25 #最小数量空闲线程,保存备用 MaxSpareThreads 75 #最大数量空闲线程,保存备用 ThreadsPerChild 25 #每一个进程可生产的线程数 MaxRequestsPerChild 0 #每一个子进程在生命周期内所可以服务的最大请求个数,0表明不限制 </IfModule> #这里有一个奇怪的特性,就是当咱们重启完服务后当即查看能够看到服务启动了4个进程数没有错。为咱们配置的默认开启进 #程数,可是,若是过了几秒再重启查看服务进程时,会发现只剩下3个进程数,这是由于默认ThreadsPerChild(每一个服务 #器进程生成的线程数量)为25,而MaxSpareThreads(最大数量的工做线程)为75,因此就只剩下3个进程。
④、配置指令实现模块加载(DSO)
LoadModule <mod_name> <mod_path>
LoadModule version_module modules/mod_version.so #LoadModule asis_module modules/mod_asis.so #须要开启某个模块只须要把注释的#号去掉而后从新加载配置文件便可。这里咱们能够看到,模块路径使用的是相对路径, #相对于ServerRoot(/etc/httpd)指向的路径而言。
⑤、定义'Main' server的文档页面路径
DocumentRoot "/var/www/html"
文档路径映射:DocumentRoot指向的路径为URL路径的起始位置
例如:DocumentRoot "/var/www/html"
/var/www/html/test/index.html --> http://HOST:PORT/test/index.html
⑥、站点访问控制,可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory ""> </Direcotry>
<File ""> </File>
<FileMatch ""> </FileMatch>
URL路径:
<Location ""> </Location>
...
访问控制机制:基于来源地址,基于帐号(如下作详细说明)
⑦、Directory中“基于来源地址”实现访问控制
(1) Options
全部可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews:
Indexes: 索引;
FollowSymlinks:容许跟踪符号连接文件;
AllowOverride:在 AllowOverride 设置为 None 时, .htaccess 文件将被彻底忽略。当此指令设置为 All 时,全部具备 “.htaccess” 做用域的指令都容许出如今 .htaccess 文件中。
<Directory /> Options FollowSymLinks AllowOverride None </Directory> #这是比较经常使用的三个Options
(2) 基于来源地址的访问控制机制
Order:检查次序
Order allow,deny(设置白名单)
Order deny,allow(设置黑名单)
这里的检查机制是这样的,以Order allow,deny说明。先把定义的全部Allow整合为一个,而后把全部定义的Deny整合为一个。而后先检查Order次序的allow有没有匹配的,若是仅有allow匹配则直接经过,若是allow没有,deny有则直接deny,若是allow,deny都有则以Order默认的deny掉,若是两个都没有匹配则以默认的deny为准。
<Directory "/var/www/icons"> Order allow,deny Allow from all </Directory> #Allow from all:全部人能够访问 #Deny from 192.168.0.123:禁用一个IP访问 #Allow from 192.168.1.0/24:容许一个网段访问
Order Allow,Deny Allow from 192.168.1.0/24 (Deny from all) #只容许192.168.1.0/24这个网段访问
Order Deny,Allow Deny from 192.168.1.123 #不容许192.168.1.123这个IP访问。其它都容许
⑧、定义默认主页面
DirectoryIndex index.html index.php
⑨、日志设定
错误日志:
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg
访问日志:
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客户端IP地址;
%l: Remote logname (from identd, if supplied). -表示为空;
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);
%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
金步国翻译文档 :http://www.jinbuguo.com/apache/menu22/logs.html
⑩、路径别名
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /bbs/ "/forum/htdocs"
http://www.wlw.com/bbs/index.html --> /forum/htdocs/
Alias /wlw/icons/ '/var/www/icons/'
11、设定默认字符集
AddDefaultCharset UTF-8
12、基于用户的访问控制
认证质询:WWW-Authenticate,响应码为401,拒绝客户端请求,并说明要求客户提供帐号和密码;
认证:Authorization,客户端用户填入帐号和密码后再次发送请求报文;认证经过,则服务器发送响应的资源;
认证类型:basic:明文。digest:消息摘要。
安全域:须要用户认证后方能访问的路径;应该经过名称对其进行标识,并用于告知用户认证的缘由;
用户的帐号和密码存储于何处?
虚拟帐号:仅用于访问某服务时用到的认证标识;
存储:文本文件,SQL数据库,ldap,nis
basic认证:
(1)提供帐号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动建立passwordfile,所以,仅应该在添加第一个用户时使用;
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户
[root@localhost admin]# htpasswd -c -m /var/www/html/.htpasswd wlw New password: Re-type new password: Adding password for user wlw [root@localhost admin]# htpasswd -m /var/www/html/.htpasswd wlw1 New password: Re-type new password: Adding password for user wlw1 #这里咱们添加了两个用户供后面作测试使用,第一次由于文件不存在使用-c选项生成,后面添加用户只须要指定-m,用md5加密便可
(2) 定义安全域
<Directory "/var/www/html/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin private" AuthUserFile "/var/www/html/.htpasswd" Require user wlw </Directory> #这里咱们AuthType认证方式为Basic,AuthName认证名为Admin private,AuthUserFile认证的用户名密码文本为, #Require user指定容许生效的用户,若是须要文件中的全部用户都生效,能够是用Require valid-user。
当咱们对某个目录定义了安全区域后,当咱们打开页面后能够看到如下信息
若是咱们不输入帐号密码按取消的话这会,响应码为401,拒绝客户端请求,并说明要求客户提供帐号和密码
只有当咱们输入容许登陆的帐号密码的时候才能查访问到admin的文件
(3) 实现基于组进行认证
<Directory "/var/www/html/admin"> Options None AllowOverride None AuthType Basic AuthName "Admin private" AuthUserFile "/var/www/html/.htpasswd" AuthGroupFile "/etc/httpd/conf.d/.htgroup" equire group wlwadmin </Directory> #这里须要提供:用户帐号文件和组文件;帐号文件:使用htpasswd命令生成。组文件:使用touch生成一个文件, #而后在文件中每一行定义一个组:GRP_NAME:user1 user2 user3 ...
十3、虚拟主机
有三种实现方案:
基于ip:为每一个虚拟主机准备至少一个ip地址;
基于port:为每一个虚拟主机准备至少一个专用port;实践中不多使用;
基于hostname:为每一个虚拟主机准备至少一个专用hostname(互联网上最为经常使用的实现虚拟主机方法)
可混合使用上述三种方式中任意方式;
注意:通常虚拟主机不要与中心主机混用,因此,要使用虚拟主机,先禁用中心主机,禁用中心主机:注释DocumentRoot。
每一个虚拟主机都有专用配置:
<VirtualHost "IP:PORT"> SeverName:虚拟主机的别名 DocumentRoot "":虚拟主机根目录 ErrorLog:错误日志 CustomLog:访问日志 <Directory "">:虚拟主机站点访问控制 Options FollowSymLinks AllowOverride None </Directory> </VirtualHost>
示例1:基于ip
<VirtualHost 192.168.0.105:80> ServerName web1.wlw.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 192.168.0.105:80> ServerName web2.wlw.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost>
示例2:基于port
<VirtualHost 192.168.0.105:80> ServerName web2.wlw.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> <VirtualHost 192.168.0.105:8080> ServerName web3.wlw.com DocumentRoot "/vhosts/web3/htdocs" </VirtualHost>
示例3:基于hostname
<VirtualHost 192.168.0.105:80> ServerName web1.wlw.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 192.168.0.105:80> ServerName web3.wlw.com DocumentRoot "/vhosts/web3/htdocs" </VirtualHost>
十4、内置的status页面
<Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 192.168.0.0/24 </Location> #此status页面能看到httpd的各信息,建议只开放内网,若是须要外网链接建议基于帐号实现访问控制,添加完此配置后从新 #加载配置文件。这里咱们可使用http: //192.168.0.109/server-status?refresh=3 给页面传递每三秒刷新一次的需求。
十5、MIME类型文件和指定缺省MIME类型
TypesConfig /etc/mime.types #TypeConfig用于设置保存有不一样的MIME类型数据的文件名 [root@wlw3 wlw]vim /etc/mime.types text/plain asc txt text pm el c h cc hh cxx hxx f90 ........ application/octet-stream bin lha lzh exe class so dll img iso DefaultType text/plain #若是Web服务器不能决定一个文档的缺省类型,这一般表示文档使用了非标准的后缀,那么服务器就使用 DefaultType定义的MIME类型将文档发送给客户浏览器。这里的设置为text/plain,若是服务器不能判断出文档的MIME,那么大部分状况下这个文档为一个二进制文档,但使用 text/plain格式发送回去,浏览器将在内部打开它而不会提示保存。所以建议将这个设置更改成 application/octet-stream,这样浏览器将提示用户进行保存。
十6、为特定后缀的文件指定MIME类型
AddType application/x-httpd-php3 .phtml #AddType参数能够为特定后缀的文件指定MIME类型,这里的设置将覆盖mime.types中的设置
十7、错误页是否输出服务器操做系统名称
ServerTokens OS #在出现错误页的时候是否显示服务器操做系统的名称,ServerTokens Prod为不显示