一、讲在Apache之前
### --- 讲在Apache之前
### --- HTML:#超文本标记语言,
~~~ 使用html语言编写的文本叫超文本,
~~~ “超文本”就是指页面内可以包含#图片/连接/甚至音乐/程序等非文字元素。
### --- HTTP协议:
~~~ 超文本传输协议;HTTP使用同一资源标识符(URL)来建立连接和传输数据,
~~~ 是一个基于TCP/IP通信协议来传递数据的协议,属于应用层协议。
### --- URL:统一资源定位符:
~~~ 统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示。
~~~ 是互联网上标准资源的地址。
~~~ http://www.atyanqi.com:80/image/a.jpg
### --- 知识拓展:
### --- URI:
~~~ 统一资源标志符,URI与URL都定位资源位置的,
~~~ 就是表示这个资源的位置信息,就像经纬度一样可以表示你在世界的那个角落。
~~~ URI是一种宽泛的含义更广的定义。而URI的一个子集,就是URI是URL的一部分。
二、Apache详解
### --- 概述
~~~ Apache是世界使用排名第一的Web服务器软件。
~~~ 它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,
~~~ 是最流行的web服务器端软件之一,因此,在一个Apache web站点扩容时,
~~~ 通常是增加服务器或扩充群集节点而不是增加处理器,
~~~ 到目前为止Apache仍然是世界上用的最多的web服务器,市场占有率60%左右。
~~~ Apache有多种产品,可以支持SSL技术,支持多个虚拟机,Apache是以进程为基础的结构,
~~~ 进程要比线程消耗更多的系统开支,不太适合于多个处理器环境,
~~~ 因此,在一个Apache web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器,
~~~ 到目前为止Apache仍然是世界上用的最多的web服务器,市场占有率达60%左右。
三、工作模式
![](https://i-blog.csdnimg.cn/blog_migrate/5ae245af4fc668e9e83aff3c97d1454b.png)
### --- Apache进程启动的流程
~~~ 系统启动起来之后会启动一个init的进程,
~~~ 系统再去启动其他进程的时候是由init这个进程启动的,
~~~ 比如说使用service或者apachectl都是使用init进程去启动的,
~~~ Apache也分为两种进程,一种是Apache的守护进程root来运行,
~~~ 而其它的都是Apache的子进程,默认是Deamion用户,若是更改了,可以是你指定的
~~~ 启动的时候使用init的进程去调用Apache的守护进程,
~~~ Apache的守护进程在调用Apache的工作进程 ,Apache的工作进程再去处理一个一个的用户请求。
~~~ 守护进程还加载了一个一个的模块
~~~ 工作进程会对用户的请求进行一定的处理来判断是什么静态还是动态,
~~~ 若是静态的是HTML的直接返回给用户,用户的浏览器自己可以解决的;
~~~ 若是动态的页面的时候:动态页面需要解析器来处理的,
~~~ Apache会通过modules模块处理,交给PHP,PHP才会处理,
~~~ PHP把要处理的页面处理之后,交给Apache,Apache在交给用户。
~~~ 区分动态静态页面:#动态需要连接数据库,不连接数据库就是静态页面
~~~ Apache一共有3中稳定的MPM模式(MPM:多进程处理模块),
~~~ 他们分别是prefork/worker/event/prefork工作模式
~~~ Apache在启动之初,就预先fork一些子进程,然后等待请求进来,之所以这样做,
~~~ 是为了减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,
~~~ 只能处理一个请求。
~~~ #优点:成熟稳定,兼容所有新老模块,同时,不需要担心线程安全的问题
~~~ #缺点:一个进程相对占用更多的系统资源,消耗更多的内存,而且,它并不擅长处理高并发请求。
![](https://i-blog.csdnimg.cn/blog_migrate/f2f2b7865dcf3827c1a345fc2d276e61.png)
### --- worker工作模式:
~~~ 使用了多进程和多线程的混合模式,它也预先fork了几个子进程(数量比较少),
~~~ 然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来,
~~~ 会被分配到1个线程来服务,线程比起进程会更轻量,
~~~ 因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些,
~~~ 在高并发的场景下,因此比起prefork有更多的可用线程,表现会更优秀一些。
~~~ #优点:占据更少单位的内存,高并发下表现更优秀
~~~ #缺点:必须考虑线程安全的问题。
### --- event工作模式:
~~~ 它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,
~~~ 长期被占用的资源浪费问题,event MRM中,
~~~ 会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,
~~~ 将请求传递给服务线程,执行完毕后,又允许释放,这样增强了高并发场景下的请求处理能力。
~~~ HTTP采用Keepalived方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,
~~~ 导致一个频繁忙的服务器会消耗完所有的线程,event MPM是解决这个问题的一种新模型,
~~~ 它把服务进程从连接中分离处理,在服务器处理速度很快,同时具有非常高的点击率时,
~~~ 可用的线程就是关键的资源限制。此时Event MPM方式是最有效的,但不能再HTTPS访问下工作。
![](https://i-blog.csdnimg.cn/blog_migrate/ad6be5d6bd716af49c76bcbc04ea9ca8.png)
### --- Keep-alive
~~~ 在http早期,每个http请求都要求打开tcp socket连接,
~~~ 并且使用一次之后就断开这个TCP连接
~~~ 当httpd守护进程发送完一个响应后,理应马上主动关闭相应的tcp连接,设置keepalive_timeout后,
~~~ httpd守护进程会想说:“再等等把,看看浏览器还有没有请求过来”,
~~~ 这一等,便是keepalive_timeout时间。如果守护进程在这个等待的时间里,
~~~ 一直没有收到浏览器发过来http请求,则关闭这个http连接。
~~~ 使用keep-alive可以改善这种状态;
~~~ 即在一次tcp连接中可以持续发送多份数据而不会断开连接,通过使用keep-alive机制,
~~~ 可以减少tcp连接建立次数,也意味着可以减少time_wait转态连接,
~~~ 以此提高性能和提高httpd服务器的吞吐率(更少的tcp连接意味着更少的系统内核调用)
~~~ 但是,长时间的tcp连接容易导致系统资源无效占用,配置不当的keep-alive,
~~~ 有时比重复利用连接的损失还更大,所以,正确的设置keep-alive timeout时间非常重要。
![](https://i-blog.csdnimg.cn/blog_migrate/bd39162e4f5ae1ab99898e4514f2f3fb.png)