一、Apache服务器简介

1、Apache简介
1.1Apache是目前世界上最流行的,也是最好的Web服务器之一,本来它只用于小型或试验的因特网,后来逐步扩充到各种UNIX系统中,尤其对Linux的支持相当完美。目前Web服务器软件软件特别多,但是Apache占主导地位,在所有的Web服务器中Apache占据了绝对优势,远远领先与微软的IIS目前,绝大多数的高科技实验室及众多的大公司都采用了ApacheApache的特点是简单、速度快、性能稳定,可做代理服务器来使用。它可以支持SSL技术,并支持对个虚拟机。经过多次修改,它已成为世界上最主流的Web服务器软件之一。
2、THHP协议
2.1HTTPHyperText Transfer Protocol 超文本传输协议,传输文本的,而这种文本是特殊的文本,是一种带超链接的文本,超链接文本就是能够在文档间跳转的文本。web:实现能够在多个不同的部门之间共享文档,而且可以快速定位文档的协议,而早期的web只是能够实现在文档间跳转而已。早期http协议是0.9的版本,此版本仅支持纯文本(ASCII),也支持超链接(HTML)。HTML是编写超文本的语言。TTMLHyperText Mark Language,超文本标记语言,就是用来开发超文本的开发语言,这种语言已经事先规定好了,将我们的文本通过标签的形式加上独特的标记,而这些文本再被浏览的时候能够将这些标记解析为字体格式。http协议是基于tcp的,每个TCP的建立需要三次握手,拿到资源后需要断开即四次断开,这样做使原来的资源也需要再次加载,浏览速度很慢,影响了系统的启动速度,这时http协议又升级到了1.1,1.1的版本好处:增强了缓存的功能;引入了长连接:三次握手后不会断开,可以使同一个用户在发送第二次请求时,尽可能缩短了时间,降低了服务器端资源占用率,但是也有缺点,当服务器并发量很大的时候,后来的客户端就很难建立连接了。因此设定了时间限制,当超出这个时间限制时会超时断开
Browser(浏览器),作为客户端来讲可以访问服务端通过HTTP协议提供给我们的超文本,Browser将这些字体解析为字体格式显示出来,随着浏览器的流传开来,每一台服务器上会有各种各样的文本,甚至是两台服务器上的文本有可能是一样的,因此紧靠文件名来区分是不合适的,因此出现了URIUniform Resource Indentifier统一资源标识符),统一资源标识符就是用来定义这些全局范围内可以唯一引用某一个独立资源的命名方式。而统一是路径格式上的统一。URI并不是为web诞生的,但URI却可以很好的能够让客户端去识别在互联网上的不同文档的一种机制。标识符有一个子对象-->UILUniform Resource Location 统一资源定位符,用于描述在互联网上互联网资源的统一表示格式----->protocol://HOST:port/path/to/file-->http://www.magedu.com.downnload/linux.tar.gzweb资源(对象):多个资源很可能被整合为一个html文档,html就是将这些分散在多台服务器上资源整合在一个html页面上,并能够让浏览器显示。这些对象可以来自不同的服务器
2.2、获取服务器资源的方法也叫HTTP方法:
我们访问服务器不但可以获取资源将远程服务器上的资源获取到本地,还可以将自己的资源提交给服务器,早期0.9版本的http只有一种方法:GET即仅能获取资源;http升级到1.0后有了PUTDELETEPOST等方法,目前http协议最常用的方法有八种:GETHEADPOSTPUTDELETETRACEOPPTIONSCONNECTION,而最常用的是前三个。SMTP: Simple Mail Transmission Protocol,简单邮件传输协议,早期只能传输纯文本MIME: Multipurpose Internet Mail Extension, 多用途互联网邮件扩展将非文本数据在传输前重新编码为文本格式,接收方能够用相反的方式将其重新还原为原来的格式,还能够调用相应的程序来打开此文件浏览器中都有flush插件,正是因为这些插件,随之又出现了动态网页:服务器端存储的文档非HTML格式,而是编程语言开发的脚本,脚本接受参数之后在服务器运行一次,运行完成之后会生成HTML格式的文档,把生成的文档发给客户端,而web在调用额外的工具来实现脚本的运行。例如在web服务器上放了一个index.php格式的脚本,当客户端去申请获取访问这个脚本的时候我们的服务器会根据它的扩展名去判断它不是一个文档而是一个脚本,这时web服务器会通过某种机制或协议去调用一个额外的的运行程序,比如调用php的解释器,让这个解释器去运行这个脚本,这个结果就是一个html格式的文档,这时再发给web服务器,web服务器再把结果返回给客户端,因此执行脚本的过程根web没有关系,web只是一个http服务器,并不执行动态内容。
假如在我们的主机上运行了一个web进程,当有客户端来访问时,web发现这个资源如果是纯文档,则直接取出来(放在了硬盘上)web服务器是一个软件,在用户空间上,而用户所能访问的文档都在磁盘上,因此当客户端向服务器发起请求的时候,请求先到达内核空间,经过一系列的转换最后传送给用户空间,而我们的服务器在用户空间上,即最后由web服务器来完成显示。一个超链接可以引用N个资源(web对象),而每个资源都有自己的URL,可以是静态的也可以是动态的,每打开一次页面,都需要发送 N次请求,因为一个为页面中有多个资源,而每个资源都需要单独发送一次请求。为了让客户端打开页面的速度尽可能快一些,我们的浏览器多数都是多线程的,因此引入浏览器的缓存是加速系统访问速度的,是一种加速手段。
二、HTTP协议知识点
1、报文类型
Ip报文首部:Source Ip --》Destination Ip
TCP报文首部:Source Port--》Destination Port
Http首部:GET /2.html   #定义获取哪个资源
          Host www.baidu.com #获取哪个主机的资源,为虚拟主机做准备的
2、Http报文有两种,请求报文、响应报文
1)、请求报文语法:
<method> <request-URL> <version> #方法  资源是什么  资源版本号
<headers>                  #http首部,有多个首部,其中Host就是它的首部
                                   #这个空白行是必须要留的
<entity-body>           #报文主体(即报文是什么,获取方法不同,主体不同)
2)、响应报文语法:
<version> <status> <reason-phrase> #版本号 状态代码
<headers>                                            #响应报文首部格式类型
 
<entity-body>                                     #若请求报文存在则有主体,否则没有 
3)、状态代码:判断用户返回的信息是否正确
1xx: 纯信息
2xx: “成功”类的信息 (200, 201, 202)
3xx:重定向类的信息 (301永久, 302临时, 304)
4xx: 客户端错误类的信息 (404)
5xx:服务器端错误类的信息     
4)、例题       
请求报文:
GET / HTTP/1.1              #获得资源的方法 指定”/"的意思是访问根的默认页面 版本号
Host: www.magedu.com #报文首部
Connection: keep-alive
                                      #这是一个简单地下载过程,因此不需要主体
响应报文:
HTTP/1.1 200 OK                  #200:成功的信息
X-Powered-By: PHP/5.2.17   #报文首部,是个动态的
Vary: Accept-Encoding,Cookie,User-Agent   #一些额外的其他的信息
Cache-Control: max-age=3, must-revalidate   #控制缓存
Content-Encoding: gzip              #内容编码机制,先压缩在发送
Content-Length: 6931              #内容多长
补充:
上面两个报文的第一行通常称作报文“起始行(start line)”;后面的标签格式的内容称作首部域(Header field),每个首部域都由名称(name)和值(value)组成,中间用逗号分隔。另外,响应报文通常还有一个称作Body的信息主体,即响应给客户端的内容。
3、Web服务器的主要操作
1)、建立连接---->接受或拒绝客户端连接请求;
2)、接收请求---->通过网络读取HTTP请求报文;
3)、处理请求---->解析请求报文并做出相应的动作;
4)、访问资源---->访问请求报文中相关的资源;
5)、构建响应---->使用正确的首部生成HTTP响应报文;
6)、发送响应---->向客户端发送生成的响应报文;
7)、记录日志—--->—当已经完成的HTTP事务记录进日志文件;
实际上web服务器是一种c/s架构的模型,C-->Client Agent客户端代理(browser,spider)S-->Server服务器端,工作流程:Client-->request(报文请求)-->Server-->response(回应)-->Client
Web代理服务器工作于web客户端和web服务器之间,它负责接收来自于客户端的http请求,并将其转发至对应的服务;而后接收来自于服务端的响应,并将响应报文回送至客户端。
4、Web服务器处理并发连接请求的架构方式有四种
1)、单线程web服务器(Single-threaded web servers)
此种架构方式中,web服务器一次处理一个请求,结束后读取并处理下一个请求。在某请求处理过程中,其它所有的请求将被忽略,因此,在并发请求较多的场景中将会出现严重的必能问题。
2)、多进程/多线程web服务器
 此种架构方式中,web服务器生成多个进程或线程并行处理多个用户请求,进程或线程可以按需或事先生成。有的web服务器应用程序为每个用户请求生成一个单独的进程或线程来进行响应,不过,一旦并发请求数量达到成千上万时,多个同时运行的进程或线程将会消耗大量的系统资源。
3)、I/O多路复用web服务器
为了能够支持更多的并发用户请求,越来越多的web服务器正在采用多种复用的架构---->同步监控所有的连接请求的活动状态,当一个连接的状态发生改变时(如数据准备完毕或发生某错误),将为其执行一系列特定操作;在操作完成后,此连接将重新变回暂时的稳定态并返回至打开的连接列表中,直到下一次的状态改变。由于其多路复用的特性,进程或线程不会被空闲的连接所占用,因而可以提供高效的工作模式。
4)、多路复用多线程web服务器
 将多进程和多路复用的功能结合起来形成的web服务器架构,其避免了让一个进程服务于过多的用户请求,并能充分利用多CPU主机所提供的计算能力。
5、Http的特性:
事先创建进程
按需维持适当的进程
模块块设计,核心比较小,各种功能都是模块添加(包括php)支持运行配置,支持单独编译模块
支持多种方式的虚拟主机配置
      Socket套接字-->IP:Port
      虚拟主机的方式:
            基于IP的虚拟主机;
            基于端口的虚拟主机;
           基于域名的虚拟主机;
支持https协议 (mod_ssl)
支持用户认证
支持基于IP或主机名的ACL
支持每目录的访问控制
支持URL重写,/p_w_picpath/a.jpeg, /bbs/p_w_picpaths/abc.jpeg
※   虚拟主机:简单来说我们只有一台物理服务器,一个web服务器,而web可以根据不同的请求,建立多个不同的站点(可以服务多个不同的站点)
三、详解Apache服务器的配置文件
 Httpd.conf是最核心的配置文件,位于/etc/httpd/conf/httpd.conf,几乎绝大部分设置都需要通过修改该配置文件来完成,httpd.conf文件内容非常之多,但大部分内容都被注释掉了。安装完成之后它的进程在/usr/sbin/httpd,它的进程也叫httpd,而在红帽5.8的版本上,httpd的工作模式是:多道处理模块(MPM:prefork),需要事先启动好几个空闲进程,事先创建新进程,并接受用户请求一旦httpd运行起来后你会发现有好多的httpd进程,其中有一个httpd进程的属主属组是root,这个是“主导进程”(master process),除了它之外,其它httpd的属主属组都是apache,这些进程叫“工作进程”(worker process)而它的服务脚本在/etc/rc.d/init.d/httpd ,此服务启动之后所占据的端口是80/tcp
ssl:443/tcp。/etc/httpd/conf.d/*.conf也是主配置文件的一部分,/etc/httpd/modules #模块目录
/etc/httpd/logs -->/var/log/httpd   #日志目录
日志文件有两类:访问日志access_log,错误日志err_log
/var/www/html     #静态内容路径
/var/www/cgi-bin   #提供动态内容路径
1、配置文件分为三部分:
全局环境配置Global Environment、主服务配置'Main' server configuration、虚拟主机配置Virtual Hosts
2、全局环境配置解析
directive :指令不区分字符大小写
value:  则根据需要有可能要区分
ServerRoot "/etc/httpd"       #工作的根目录,一般不要改
KeepAlive Off                 #不使用长连接
KeepAlive On                   #使用长连接,一般我们的服务器访问量不大,应该打开长连接
MaxKeepAliveRequests 100     #最大请求次数
KeepAliveTimeout 15          #长连接的使用时长
MPM: Multi Path Modules      #linux有三种模式
 prefork:预先生成进程 ,一个请求用一个进程响应,稳定可靠,任何一个进程崩溃了不会影响其他进程,但性能比较差,尤其是在并发量比较大的情况下,消耗量比较多,涉及到大量的进程切换(默认使用的)
 worker:基于线程工作的,一个请求用一个线程响应, web服务器启动多个进程,每个进程生成多个线程。
 event: 基于事件处理模型的驱动,一个进程处理多个请求,是最强大的
<IfModule prefork.c>
StartServers       8     #服务启动时启动的服务个数
MinSpareServers    5     #最小空闲进程数
MaxSpareServers   20     #最大空闲进程数
ServerLimit      256     #MaxClients的上限,若想调MaxClients必须先调这个选项
MaxClients       256      #最大客户端数,最多同时允许多少服务器链接
MaxRequestsPerChild 4000 #最多响应次数,若超过这个值,则直接kill掉
<IfModule worker.c>
StartServers         2      #服务启动时启动的服务个数,默认情况下启动两个服务器
MaxClients         150      #最大客户端数,最多同时允许多少服务器链接
MinSpareThreads     25      #最小空闲线程数,总体的,而不是单个线程数
MaxSpareThreads     75      #最大空闲线程数 ,总体的,而不是单个线程数
ThreadsPerChild     25      #一个进程生成多少个线程
MaxRequestsPerChild 0      #每个进程最多显示多少个请求,这里是不做限定的
</IfModule>
Listen 80      #监听端口和IP,一般IP省略,若只写端口号则是监听所有IP地址的80端口,还可以同时监听多个端口
Listen 8080
Listen 172.16.50.5:8080
Include conf.d/*.conf     #此目录下所有.conf结尾的文件都是主配置文件的组成部分
User apache    #apacheworker模式下的进程都要使用普通用户运行
Group apache
3、主服务配置解析
ServerAdmin root@localhost      #服务器管理员
ServerName www.example.com:80   #在虚拟主机名中是必须的,不然会报错的
UseCanonicalName Off            #正式名称
DocumentRoot "/var/www/html"    #文档根目录,URL路径跟本地文件系统路径不是一回事,一般而言URL是相对于DocumentRoot的路径
<Directory "/var/www/html">
Options Indexes FollowSymLinks    #定义/var/www/html下的所有网页文档或者是网页文件在能够被访问时候的访问属性的。Options 后有多个选项-->Indexes:允许索引目录,把我们整个网页根目录下的每一个文件都列给你看,这是一个非常不安全的做法,一定不要使用Indexes,把它关掉,但如果是作为下载站使用时应该打开,切记啊
 ---->none不支持任何选项
 ---->FollowSynLinks: 允许访问符号链接指向的原文件,降低了服务器运行的性能,应该关了
 ---->Includes: 允许执行服务端包含(SSI)
 ---->ExecCGI: 允许运行CGI脚本
 ---->All: 支持所有选项
AllowOverride None     #允许覆盖,可以覆盖这两项
Order allow,deny ;Allow from all
AllowOverride AuthConfig   #基于一个文件中的账号密码,需要认证以后才能够访问的功能,如果使用AuthType,后面还需要添加内容,内容如下:
AuthType Basic                #基本认证
AuthName "Restricted Files"   #认证时显示的名字
AuthUserFile /usr/local/apache/passwd/passwords     #认证用户账号密码文件
Require user marion      #只有它marion才能登陆
Group File Syntax:       
GroupName: rbowen dpitts sungo rshersey
 
AuthType Basic
AuthName "By Invitation Only"
# Optional line:
AuthBasicProvider file
AuthUserFile /usr/local/apache/passwd/passwords   #基于组认证
AuthGroupFile /usr/local/apache/passwd/groups     #基于用户认证
Require group GroupName      #允许哪个用户的组来登陆
Require valid-user    #只要出现上面的用户密码文件的用户都能登陆        
Order allow,deny       #order用于定义基于主机的访问功能的,主机IP,网络地址或主机定义访问控制机制(下面有详解)
 <IfModule mod_userdir.c>      #是否支持用户在自己的家目录下创建网页,默认是不允许的
UserDir disable               #不允许用户在自己的家目录下创建网页
#UserDir public_html          #明确指定在家目录哪一个网页可以当做个人的网站使用的
DirectoryIndex index.html index.html.var   #访问页面的格式,自左而右,若都没有,则不允许访问
AccessFileName .htaccess       #每目录的访问控制列表,允许时效率极低,尤其是在子目录过多的时候,一般要注释掉
<Files ~ "^\.ht">      #匹配以.ht开头的文件,不允许任何人访问
    Order allow,deny
    Deny from all
</Files>
TypesConfig /etc/mime.types     #定义http协议支持非二进制文档的类型
DefaultType text/plain               #默认是纯文本信息
HostnameLookups Off              #记录日志时每个用户访问都会记录在日志里
ErrorLog logs/error_log            #定义错误日志
LogLevel warn                          #日志级别
访问日志格式:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h       #客户端地址
%l        #远端主机上的登陆名称
%t       #日志产生的时间
%u      #登陆网站时的用户名称
\"%r\" #请求报文的第一行
%>s     #最后一次请求页面时对应的状态码
%b      #响应报文的大小(内容大小)
\"%{Referer}i\"   #报文首部,访问的网站来自于什么地方
\"%{User-Agent}i\"   #客户端浏览器
combined    #混合模式
LogFormat "%h %l %u %t \"%r\" %>s %b" common #通用模式
LogFormat "%{Referer}i -> %U" referer #只记录客户端来源模式
LogFormat "%{User-agent}i" agent       #只记录浏览器类型
CustomLog logs/access_log combined     #访问日志 模式是混合模式
页面访问量-->PV:Page View,每天的页面访问量
用户访问量-->UV:User View,每天的独立IP访问来统计的
Alias /icons/ "/var/www/icons/"    #定义路径别名
Alias /luntan “/bbs/form”        #定义别名(注意看和上面有什么不同,如果写成”/luntan/”这样,那后面的路径也要改成“/bbs/form/”,切记哦! 
<Directory "/var/www/icons">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
Options常用设置:

 令
  
FollowSymlinks
允许在目录中使用符号链接
Indexes
允许目录浏览,如果客户端没有指定访问目录下哪个具体的文件,而且该目录下也没有首页文件时,则显示该目录的结构,包括该目录下的子目录和文件
MultiViews
允许内容协商的多重视图
ExexCGI
允许在该目录下执行CGI脚本
Includes
允许服务器端包含的功能
IncludesNoexec
允许服务器端包含的功能,但不能执行CGI脚本
All
包含除MultiView之外的所有特性(如果没有options字段,则默认为ALL)

常用的访问控制有两种形式
1)Order allow,deny
表示默认情况下禁止所有客户端访问,且allow字段在deny字段之前被匹配。如果既匹配allow字段又匹配deny字段,则deny字段最终生效,也就是说deny会覆盖allow。
2)Order deny,allow
表示默认情况允许所有客户端访问,且deny字段在allow字段之前被匹配。如果既匹配allow字段又匹配deny字段,则allow字段最终生效,也就是说allow会覆盖deny。
3)例题:
1、允许所有客户端访问
Order allowdeny
Allow from all
2、拒绝IP地址为192.168.10.1和来自.magedu.com域的客户端访问,其他客户端都可以正常访问。
 Order denyallow
 Deny from 192.168.10.1
 Deny from .magedu.com
3、仅允许192.168.1.0/24网段的客户端访问,但其中192.168.1.200不能访问。
Order allowdeny
Allow from 192.168.1.0/24
Deny from 192.168.1.200
补充:对某个文件设置权限,可以使用“<File 文件名><File>“来实现,方法和<Directroy></Directory>一样。如
<File “/var/www/html/jll.txt”>
Order allowdeny
Allow from all
</File>
4、虚拟主机配置
Apache服务器配置虚拟主机有有两种方式:一种是基于Ip地址的虚拟主机;一种是基于域名的虚拟主机。虚拟主机:如果希望三台服务器上实现多个域名和主机名的服务,可以设置<VirtualHost>来实现,大部分的设置还有基于名称的虚拟机,这样服务器就不用操心IP地址了。
例题:
1、基于IP地址的虚拟主机
<Virtual Host 172.16.50.5:80> 
 DocumentRoot /var/www/html/bbs    #可在/var/www/html目录下创建bbsbbs下建index.html的主页
 ServerName www.magedu.com
</VirtualHost>
2、 基于域名的虚拟主机
<VirtualHost *:80>
   DocumentRoot /var/www/html
    ServerName  bbs.magedu.com
</VirtualHost>