http协议:Hyper-Text Transfer Protocol,超文本传输协议; //HTML:Hyper-Text Marked Language,超文本标记语言;----静态网页 超文本:带有超链接的文本
http发展史:伯纳斯·李{1994年,伯纳斯李在MIT网络中心成立万维网中心,代表互联网诞生,伯纳斯李被称为万维网之父;}
http/0.9:只有get或put方法;http的原型版本;
http/1.0(1998年);
引入邮件中的MIME机制:Mutipurpose Internet Mail Extension,多用途互联网邮件扩展; //http有了下载功能
Cache(缓存):提高数据传输的速率;{CDN:内容分发网络}
Method:GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,OPTIONS
GET:请求获取指定的资源;
PUT:向指定的位置上传资源的最新版本;
POST:用于表单认证,在资源之后附加相关数据;
DELETE:请求服务器删除被明确标识的资源;
HEAD:与GET方法相同,都是向服务器申请获取资源,但HEAD方法仅向服务器请求响应信息的首部元信息;
TRACE:请求服务器回送所收到的请求信息;用于测试或者故障诊断;
CONNECT:保留,留待将来使用;
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项以及请求资源可以使用的方法;
http/1.1(本世纪初):
强化了缓存功能;
持续连接机制:keeplive,也称持久连接,长连接;
http/2.0(2015年5月)
IETF(互联网工程任务组)结合谷歌公司开发的SPDY(speedy)插件(用来加速http传输速度和处理高并发)发布http/2.0

http协议的特点:
    1.典型的应用层协议;
    2.在传输层是TCP来承载的,端口号是80/TCP;
        TCP协议的特性:
            1.面向连接:
                建立连接(三次握手),维持连接稳定,拆除连接(四次挥手)
                数据序列化传输;
            2.将数据分段打包,并为每段提供CRC校验和(循环冗余校验),从而保证数据的完整性;
            3.确认机制:
            4.通过流量控制来最大利用网络资源:(利用滑动窗口来控制流量) 
            5.拥塞机制:慢启动算法+拥塞避免算法;快重传算法+快恢复算法;

http协议的工作模式:request/response模式(请求/响应 模式);
    一次完整的http事务:请求<-->响应;
    一次完整的http通信,包括一次请求及对应于此次请求的响应;
    通信的目的是获得服务器上的web资源,一次http请求,只能获得一次web资源;
        web资源:html文档;图片(jpg/jpeg(压缩,成像不清晰,占用空间小),gif,png(没有经过压缩处理的图片,占用空间大,但是成像质量比较高));MP3/4;PHP脚本/js脚本/css样式表;...
            web资源的分类:
                静态资源:服务器会根据客户端的请求直接将资源原封不动的响应传输给客户端的资源;{资源包括:html文档;图片(;MP3/4;PHP脚本/js脚本/css样式表;...}
                动态资源:通常是有某种编程语言编写的程序文件,在服务器上经过某种特定方式执行之后生成相应的html页面,服务器将程序运行生成的html页面响应给客户端的资源;
                    服务器端动态资源:PHP脚本,JSP脚本,.NET程序(Linux上不支持编译),python脚本,ruby脚本,C/C++程序
                    客户端动态资源(存储在服务器端,原封不动的传递到客户端,在客户端运行一遍生成一个页面);JavaScript脚本,Servlet,ActiveX
    并发响应模型: 
        单进程IO模型:仅有一个进程用于处理和响应客户端请求,每次只能处理和响应一个客户端,串行响应模型;
        多进程IO模型:同时启动多个进程,每个进程只能处理和响应一个客户端请求;
        复用的IO模型;每个进程可以同时处理并响应多个客户端的请求;
        多线程的IO模型;每个进程可以生成多个线程,每个线程可以响应一个客户端请求;
        事件驱动的IO模型:每个进程直接处理并响应多个客户端的请求;其中采用事件通知机制;
        复用的多线程的IO模型;启动m个进程,每个进程可以生成n个线程,每个线程可以处理并响应一个客户端的请求;可以响应m*n个客户端;
        复用的事件驱动的IO模型:启动m个进程,每个进程都是基于事件驱动的方式直接处理并响应多个客户端的请求;

    web服务器的一次完整的http请求的处理过程:
        1.建立TCP连接;
        2.接受请求:将客户端发送来的报文经过通信子网的解封之后,将其放置于用户空间中相应的应用程序所在的内存空间中;
        3.分析处理请求:通过读取报文的http协议首部和body部分,获取客户端请求的资源的具体信息;
        4.访问资源:通过特定的IO方式从磁盘等IO设备上加载客户端请求的资源;
        5.构建响应报文;将加载的资源使用特定的协议予以封装;
        6.发送响应报文:将应用程序空间中的资源发给内核,加载到内存当中,转化为流式化数据,再经由硬件设备发送出去;
        7.记录日志信息;

{URI:统一资源标识符;
    web上的各种资源都可以使用URI进行统一的唯一的标识;定位资源存在的位置;
    URI包括三个部分:
        1.资源的命名机制;
        2.存放资源的主机名称;
        3.资源自身的名称;
 URL:统一资源定位符;   
    URL是互联网上用来描述web资源的定位方式的一组具有特定格式的字符串;
    URL一般有三个部分:
        1.协议:资源的提供方式和访问方式;
            可用的协议:https,http,ftp,ssh,mailto,gopher,...
        2.主机标识:可使用主机的FQDN,也可以使用IP地址;
        3.资源存放的路径:相对于主机的存放路径;使用某种特定的方式实现的映射路径,一般用于标识资源的具体位置;此路径是从根开始并标识的路径,根是web服务的根,而不是文件系统的根;
    URL通用标准格式;
        [scheme://][Username:Password@]Server[:port][/PATH/TO/RESOURCE][?PARAMETERS=VALUE&&...][#FLAG]
 资源的路径映射:
    chroot机制:
        如:将真正根文件系统上的路径伪装成根文件系统,这个伪装的根文件系统叫做web服务的路径
            映射web根目录的指令为:DocumentRoot /var/www/html(此路径为真正根文件系统的路径)--->web服务的资源路径(用户在客户端访问的路径)

        web服务器的资源路径的映射方式:
            1.DocumentRoot
            2.Alias
            3.VirtualHost DocumentRoot
            4.用户的docroot
            ...
}

http协议请求处理的连接方式:
    非持续连接:短连接
        在建立好的一个TCP连接上,仅能传送一个http请求报文以及一个与之匹配的响应报文;
        适用场合;用于请求单个大资源的响应报文的传送;
    持续连接;长连接(keepalive)
        可以允许客户端在一个TCP连接上发送不止一次的http请求报文,每一个资源响应报文都可以基于同一个TCP连接响应给客户端;
        适用场合:用于多个小资源请求或从反向代理服务器向后端服务器请求的场景;可以避免后端服务器使用过多的进程来处理和响应客户端请求,在很大程度上可以节省服务器的资源开销;
    注意;由提供资源的服务器来决定选择哪种连接方式

http协议的开源实现:
    实现静态资源请求的处理和响应:;
        httpd(Apache)
        Nginx(Engine X)
            Tengine(淘宝,开源)
        lighttpd
    实现动态资源请求的处理和响应:应用程序服务器;
        JSP:Tomcat,Weblogic(Oracle),Websphere(IBM),Jboss,Glassfish
        PHP:php,php-fpm
        Python:python
        Ruby:ruby

httpd:http daemon(http守护者)
由ASF(Apache软件基金会)维护,官方站点:httpd.apache.org
应用程序版本:
httpd-1.3:超级稳定,官方已经停止该版本的维护;
httpd-2:
httpd-2.2:CentOS 5/6中默认使用
httpd-2.4:CentOS 7中默认使用
httpd特性:
高度模块化:Core+Modules
DSO:Dynamic Shared Object,动态共享对象;可以实现模块的动态装载和卸载;

        模块分为两类:
            静态模块:static module,编译源代码时,直接编译至核心中的模块中;如果想要更换静态模块,则必须更换核心文件;只有在重启服务进程之后,才能生效;
            动态模块:可以基于DSO方式动态装载和卸载,改变配置操作后,仅需要重载配置文件即可生效;
                MPM:多道处理模块;用来设定httpd进程的并发响应模型;
                    prefork:多进程IO模型;
                        1.一个主进程,多个子进程;
                        2.主进程用于管理子进程,创建套接字,接受客户端请求并将客户端请求派发给子进程处理;
                        3.子进程处理客户端请求及构建和发送响应报文;
                        4.一个子进程仅能处理和响应一个客户端的请求;
                        5.httpd默认的MPM模块;
                    worker:复用的多进程IO模型(多进程多线程)
                        1.一个主进程,多个子进程;
                        2.主进程用于管理子进程,创建套接字,接受客户端请求并将客户端请求派发给子进程处理;
                        3.子进程负责管理其内部的各线程;
                        4.线程负责处理客户端请求及构建和发送响应报文;
                        5.一个线程仅能处理和响应一个客户端的请求;
                    event:复用的IO模型(事件驱动的多进程模型)
                        1.一个主进程,多个子进程;
                        2.主进程用于管理子进程,创建套接字,接受客户端请求并将客户端请求派发给子进程处理;
                        3.子进程处理客户端请求及构建和发送响应报文;
                        4.一个子进程能处理和响应多个客户端的请求;
                    注意:event模型在httpd2.0版之前不支持;在httpd-2.2版本中仅用作测试;只有在httpd2.4中才被定义为建议使用的模型;在CentOS 6中,通过rpm包仅能安装httpd-2.2版本,event模型是测试模型,不支持DSO动态装载和卸载;在CentOS 7中通过rpm包能安装httpd-2.4版本,event模式为“production ready”,并且支持DSO动态装载和卸载;
httpd的功能:
    1.支持CGI(Common Gateway Interface):支持客户端向执行在Web服务器上的程序请求数据
    2.虚拟主机(virtual host):
        虚拟主机的标识方式:IP + PORT + FQDN (在IP和端口号相同的情况下,只要FQDN不同就是不同的客户端)
    3.反向代理:Reverse Proxy (服务器接受客户端请求,自身将客户端请求修改为自己的IP地址标识后发送给后台服务器并将后台服务器返回的数据资源返回给客户端)
    4.负载均衡集群:基于流量;基于业务;基于请求
    5.路径名称的别名的设置
    6.身份验证:basic,digest
    7.支持丰富的第三方模块;

安装httpd:
    rpm包:本地光盘yum源;
    编译源代码(大规模部署安装时不推荐采用编译源代码的方式安装httpd):
        在需要定制新功能时;
        在为了安全去除带有bug或者明显漏洞的模块时;   

    CentOS 6:
        程序构成:
            httpd:主程序包
            httpd-tools:工具包
            httpd-manual:离线帮助文档
        程序环境:
            /etc/httpd/conf/httpd.conf:httpd主配置文件;
            /etc/httpd/conf.d/*.conf:片段配置文件;
            /etc/rc.d/init.d/httpd:httpd服务的启动脚本;
                /etc/rc.d/init.d/httpd start|stop|reload|restart
                servcie httpd start|stop|reload|restart 
            /etc/sysconfig/httpd:/etc/rc.d/init.d/httpd的配置文件;
            /usr/lib64/httpd/modules:动态模块的存放路径;
                /etc/httpd/modules --> /usr/lib64/httpd/modules
            /etc/httpd/conf/magic:实现MIME功能的配置文件;
            /var/log/httpd:httpd存放日志文件的路径;包括访问日志和错误日志;
                /etc/httpd/logs --> /var/log/httpd
            /var/run/httpd:存放httpd主进程PID的文件;
                /etc/httpd/run --> /var/run/httpd
            /var/www/html:默认的web站点的文档根目录的映射路径;
        可执行程序文件:
            /usr/sbin/httpd:启动MPM的prefork模型的核心程序文件;
            /usr/sbin/httpd.event:启动event模型;
            /u sr/sbin/httpd.worker:启动worker模型;
            /usr/sbin/apachectl:服务控制命令,用于启动或停止服务的命令;

    CentOS 7:
        httpd-2.4
        程序构成:
            httpd:主程序包
            httpd-tools:工具包
            httpd-manual:离线帮助文档
        程序环境:
            /etc/httpd/conf/httpd.conf:httpd主配置文件;
            /etc/httpd/conf.d/*.conf:片段配置文件;
            /usr/lib/systemd/system/httpd.service:启动服务时使用的Unit File;
                systemctl start|stop|restart|reload httpd.service
            /etc/sysconfig/httpd:/etc/rc.d/init.d/httpd的配置文件;
            /usr/lib64/httpd/modules:动态模块的存放路径;
                /etc/httpd/modules --> /usr/lib64/httpd/modules
            /etc/httpd/conf/magic:实现MIME功能的配置文件;
            /var/log/httpd:httpd存放日志文件的路径;包括访问日志和错误日志;
                /etc/httpd/logs --> /var/log/httpd
            /var/run/httpd:存放httpd主进程PID的文件;
                /etc/httpd/run --> /var/run/httpd
            /var/www/html:默认的web站点的文档根目录的映射路径;
        可执行程序文件:
            /usr/sbin/httpd:
                在httpd-2.4版本中,MPM支持DSO机制,每个MPM模型都有一个对应的模块;
                    /usr/lib64/httpd/modules/mod_mpm_prefork.so
                    /usr/lib64/httpd/modules/mod_mpm_worker.so
                    /usr/lib64/httpd/modules/mod_mpm_event.so
            /usr/sbin/apachectl:服务控制命令,用于启动或停止服务的命令;

        设置httpd服务开机自动启动:
            CentOS 6:
                ~]# chkconfig httpd on

            CentOS 7:
                ~]# systemctl enable httpd.service

        一个简单的web站点的配置实例:
            1.安装httpd:
                yum install -y httpd httpd-manual
            2.确保SElinux和iptables防火墙不会干扰httpd服务的提供:
                SElinux配置:
                    ~]# getenforce
                    Enforcing
                    ~]# setenforce 0
                防火墙:
                    ~]# iptables -vnL
                        其执行结果中如果有防火墙规则,需要进行如下处理:
                    CentOS 6:
                        ~]# service iptables stop
                        ~]# chkconfig iptables off
                        ~]# iptables -F
                    CentOS 7:
                        ~]# systemctl disable firewalld.service
                        ~]# systemctl stop firewalld.service
                        ~]# iptables -F
                3.添加一个html文档:/var/www/html/index.html
                4.启动httpd服务
                    service httpd start (CentOS 6)
                    systemctl start httpd (CentOS 7)
                5.监测服务启动是否正常:
                    ss -tnl | grep httpd
                    ps aux | grep httpd
                    service httpd status (CentOS 6)
                    systemctl status httpd.service (CentOS 7)