总结之:CentOS 6.5 HTTPD服务的全面解读及配置详解(1)-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

总结之:CentOS 6.5 HTTPD服务的全面解读及配置详解(1)

简介:

前言:
   Apache是一种开源的HTTP服务器软件,可以在大多数主流的计算机操作系统中运行(包括UNIX、Linux及Windows),再加上其支持多平台且具有良好的安全性被广泛使用,随着网络技术的普及和不断发展,以及Web技术的不断完善,Web服务已经成为互联网上最重要的服务形式之一。

正文
   httpd:俗称apache
   httpd其实是一种高度模块化设计的、通常由核心和各种模块所组成
   DSO:(Dynamic Shared Object)动态模块对象或动态共享对象、用得着模块就装载模块、用不着也可以不让模块被装载。

httpd原理详解
   http:hypertext transport protocol 超文本传输协议
   超文本:所谓的文本就是纯ASCII码的、遵循html(hypertext mark language 超文本标记语言)所研发的文本
   httpr报文有两种:请求报文和响应报文
   http请求报文格式:
   <method> <request-URL> <version>
   <headers>
   空白行
   <entity-body>

   http响应报文格式:
   <version> <status> <reason-phrase>
   <headers>
   空白行
   <entity-body>

   <method>: 请求方法, 希望服务器端执行的动作,如GET、HEAD、POST等
   <request-url>: 请求的资源,可以是相对路径,也是完整的URL
   <version>:协议版本,格式HTTP/<major>.<minor>,如http/1.0、表明用1.0的版本
   <headers>:HTTP首部、首部又可以分为三类、分别是为通用首部、请求首部和响应首部
   <status>: 状态码,1xx,2xx,3xx,4xx,5xx这种就是状态码
   <reason-phrase>:原因短语,数字状态码易读信息
   <entity-body>: 主体部分、包含我们请求的内容

   http是无状态的、什么是无状态的呢、就是服务器端并不知道两次请求是同一台主机、他并不会记录下来请求者的身份等相关信息、一次请求的事务结束后即行断开。

IP报文的传送:    
   在网络上传送数据、数据全在本地被切割成IP报文、当以过路由设备时还会再次切片成更小的IP报文、而在本地上分割成的是16位的长度、因此他的最大范围在65535字节、但是报文有首部长度、65535减去IP首部就是报文的有效载荷、所以要小于65535。

   真正的报文在在网络上传输时要经过路由设备、路由或交换机、而这些路由设备有物理层传输数据时有个一叫MTU的概念、即最大传输单元、而这个最大传输单元比较通行的是1500个字节、还有更小的、当报文经过这些路由设备时、65535的报文又被切片成N个1500字节的分片报文、在没有到达目标主机之前他们不会合并。

报文传送协议
   在传输层能够控制报文的格式的有两个协议、TCP和UDP两种、其中TCP是面向连接的协议、其中这个要在传输方和接收方建立一个虚连接、而UDP是无连接的协议。
   而基于TCP连接有要三次握手四次断开:

wKiom1MuokyD0xWTAAP3LrkFN2Q330.jpg
httpd模块化工作方式
   httpd的常用模块化工作类型、即MPM:
   MPM 是什么呢: Multipath processing Module  是多进程模块、他的种类大致有:prefork MPM、worker MPM、BeOS MPM、NetWare MPM、OS/2 MPM、WinNT MPM
   MPM机制:(Multipath Processing Module)多道处理模块、是httpd的一个特性、他不是一个模块、是一种特性统称、常用的模块有prefork、worker、event。

prefork:

    prefork表现为一个进程处理一个请求、他是基于select()这种事件分离器来工作的、而select()他的工作描述符最大不能超出1024个、那也就意味着perfork最大只能同时接收1024个请求、而这个已经是理论上限了,web服务器在工作时、他不是由web服务器这个主进程直接响应用户请求的、而是当用户请求进来、主进程就会生成子进程进行响应、就是所谓的进程复制。

   那什么是进程复制:
   内核为了追踪每个进程、在内核空间中有一个叫tack_struct的任务结构、为了追踪进程把任务结构放在一个叫双向链表中、而后给生成的子进程划分内存、分配内存。


   在功能上就是使用Apache的运行方式,一个父进程,然后根据设置以及连接情况生成相应的子进程数。这种模式可靠性和健壮性都是最好的。但是在性能上,开销过大。达不到我们这些“吸血鬼”的要求了,如果连接数过多的话,会导致我们无法远程登陆,一定要等到连接数下降后才能连接,这也是最让我头痛的事情。

  特性:快,因为它每个子进程没有管理多个子线程的负担、稳定,因为某个请求出问题,不会影响到其他进程,因为他们拥有独立的地址空间,变量和内存、可用于非线程安全的第三方模块,比如可以使用非线程安全的mod_php模块,但在大量并发的情况下,会迅速大量消耗资源。


worker:
   混合线程/进程的MPM。一个父进程,后面是带有线程的子进程。每个子进程的线程数是固定且相同的。这是最“平庸”的一个模式,但也是使用人最多的一种模式。因为它性能等各方面比较均衡。性能上要比prefork好一些,只是牺牲了一点点的健壮性和可靠性而已。一般推荐使用这个选项。 
   worker表现为一个进程生成多个线程、一个线程响应一个请求

event:
   真正意义上的一个线程响应多个请求、而且要基于事件驱动(event-driven)事件驱动、主要目的在于实现单线程响应多个请求、event 在进程和线程的模式上和worker一样,区别在于线程只负责处理请求本身,当请求处理完该线程立即可以回收,http的连接管理交给父进程。worker模式的时候,如果该http连接的keepalive设置的比较长的话,即使该请求已经处理完,也不能回收,因为http连接没中断,这样就需要维持更多的线程。


httpd的常用的功能特性:
   支持路径别名:alias
   支持用户认证:基本认证和摘要认证authentication
   支持虚拟主机:virtual host 在一个物理主机上提供多个站点的
   支持负载均衡:是反向代理的一个子特性
   支持用户站点:当前用户都可以在自己的家目录下创建自己的站点
   支持CGI:Common Gateway Interface、通用网官接口

编译安装HTTPD 2.4.9版本
   服务脚本:/etc/rc.d/init.d/httpd
   脚本配置文件路径:/etc/sysconfig/httpd
   运行目录:/etc/httpd
   配置文件:
       主配置:/etc/httpd/conf/httpd.conf
       扩展配置:/etc/httpd/conf.d/*.conf
   监听的Socket: tcp的80, 443是https/tcp的监听端口
   在内核中使用小于1023的端口的只有管理员
   文档根目录:/var/www/html
   CGI目录:/var/www/cgi-bin/

   依赖于更高版本的apr和apr-util。apr全称为apache portable runtime(apache运行时移植工具)、是让apache跨平台的工具、是个底层库。
   这里的安装不做过多的详细解释了、可以参考之前写过的文章、安装都是大同小异:总结之:CentOS 6.4源码编译安装httpd并启动测试

wKiom1MungKDlWBbAAEtNSILUU0710.jpg

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
(1) 解决依赖关系
    prel兼容的正则表达式库
    # yum -y install pcre-devel
    # yum -y groupinstall "Server Platform Development"
    # yum -y groupinstall "Development tools"
(2) 编译安装apr-1.5.0
    # tar xf apr-1.5.0.tar.bz2
    # cd apr-1.5.0
    # ./configure --prefix=/usr/local/apr
    # make && make install
(3) 编译安装apr-util-1.5.3
    # tar xf apr-util-1.5.3.tar.bz2
    # cd apr-util-1.5.3
    # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
    # make && make install
(4) httpd编译安装
    # tar xf httpd-2.4.9.tar.bz2
    # cd httpd-2.4.9
    # ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=event
    # make && make install
--prefix=/usr/local/apache:指定安装路径、不使用默认路径
--sysconfdir=/etc/httpd24:指定配置文件的路径、24表示版本、为了不跟我本机上的2.2的重复
--enable-so:表示基于DSO动态加载模块的
--enable-ssl:这项是支持https协议的
--enable-cgi:支持CGI机制的
--enable-rewrite:支持URL重写的
--with-zlib:zlib是一个网络上发送数据报文时的一个通用压缩库的API
--with-pcre:通常支持Perl所用到的一个库
--with-apr=/usr/local/apr:指定新的apr的路径
--with-apr-util=/usr/local/apr-util/:指定新的apr-util的路径
--enable-modules=most:most表示启用大多数常用的模块
--enable-mpms-shared=all:所有的MPM模块都编译
--with-mpm=event:明确指定启用event模块



   后续的配置:
       1) 导出头文件
       # ln -sv /usr/local/apache/include  /usr/include/httpd
       2) 导出库文件
           没生成就不用导出了
       3) 导出man手册
           # vim /etc/man.config
           MANPATH /usr/local/apache/man

       4) 输出二进制程序
           # vim /etc/profile.d/httpd.sh
           export PATH=/usr/local/apache/bin:$PATH


   安装配置好之后我们查看一下刚安装好的HTTPD版本:

   # httpd -v

wKiom1MunhjxQaQ4AACgdp-sLKc392.jpg


   最后可以启动了、再查看一下端口是否在监听状态了、当然你还可以给他提供一个服务脚本:

   # apachectl start

   # ss -tnl

   # httpd -v     wKiom1Muro7Q1eJyAAKklnfqsus853.jpg


====================================分隔线==============================================


I/O中的几个基本概念:


   阻塞:当一个进程发起I/O调用时、如果被调用的那个I/O没有完成、意味着当前进程要转为睡眠状态、或者说被挂起、不能执行其他指令

   非阻塞:当进程发起I/O调用时,如果被调用的I/O没有完成,他不会阻塞当前进程、而是立即返回一个未完成的结果给客户端、叫忙等待。

   同步:进程发起一个过程(或者功能、函数)调用后、在没得到结果之前、该调用不会返回。

   异步:进程发起一个过程调用后、即使调用者不能立即得到结果、但调用却会返回,返回是未完成的状态、当调用完成后、内核会自行通知调用者、告诉结果已经OK了。

I/O模型有五种
   1、同步阻塞:一次I/O大概分两个阶段:一是等待数据从磁盘到内核内存、二是等待数据从内核内存中复制数据到进程内存、当我们的调用者(进程)发起调用请求之后、我们的数据在返回之前调用者不能去干别的事、只能在等着、进程一旦发起调用、数据从磁盘到内核内存这段时间、进程是在等着、被阻塞了、同样的、数据从内核内存到进程内存还得等着、所以这两个阶段都在阻塞状态。所以一个进程只能接收一个请求、因为他被阻塞了。

   2、同步非阻塞:当一个用户请求进来时、他请求一个web资源、这个资源在磁盘上、同样的要发起内核调用、所以第一在数据没有返回之前、内核不会返回进程的调用请求、而进程一次一次的过来问好了没、内核就是没有返回、当内核数据准备好了后把数据复制到进程内存时、其实这步也是阻塞。

   3、I/O复用:在内核中提供一个独特的I/O模块、他可以跟内核打交道、同时他能帮助进程监测内核中某一调用是否完成了、而不用进程自己去问内核了、因此、在某个I/O结束之前、这个独特的I/O模块是不会返回的、而我们的进程只跟这个独特的I/O模块打交道就可以了、调用时直接向这个独特I/O模块调用就可以了、而不用向内核发起调用了、这个I/O模块可以同时监测多个I/O完成情况、而不是一次只能监控一个了

   4、异步:当一个进程发起I/O调用时、进程不会在等待、而内核接收到I/O调用时、就会去磁盘加载数据、当数据加载到内核内存时、内核会自己把数据复制到进程内存、当这两步都完成了之后内核就会发一个信号给进程、告诉进程说请求的数据已经放到进程内存中了、你自己想怎么用就怎么用吧。这才是真正的异步。

   5、什么叫信号驱动:当一个进程发起I/O调用时、数据要从磁盘到内核、此为第一阶段、当数据到内核时、内核要把数据复制到进程内核、此为第二阶段、而当数据从磁盘到内核内存时、内核发向进程发出一个信号、告诉进程说数据已经准备好了、这种发信号的机制叫信号驱动、但是数据还没有到进程内存、这时进程一样是在阻塞、等待数据从内核内存中复制到进程内存。

   如果只通知一次的叫边缘触发
   如果第一次发信号进程没有响应、第二次信号发进程还是没有响应....这种叫水平触发

   如果说当数据加载到内核内存时、不把数据复制到进程内存了、叫进程直接去内核内存去拿数据、这是不是省了复制数据到进程内存这步了、那这种机制叫内存映射(mmap)。


结束:

   归纳总结了一些HTTPD的常用的概念以及一些特性、好像有点乱、但感觉还是总结得比较详细的、希望大神不要吐槽哦、多多指点、这里还没完、下篇将介绍对httpd配置文件的详细.....感谢关注!










本文转自 wei0164 51CTO博客,原文链接:http://blog.51cto.com/tanxw/1381806,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章