HTTP



        http:伯纳斯·李

        http/0.9:Method:GET,PUT;原型版本


        http/1.0:

        MIME:Multipurpose Internet Mail Extensions,多用途互联网邮件扩展;

        Cache:缓存;CDN

        Method:GET,PUT,POST,DELETE,HEAD,TRACE,CONNECT,OPTIONS;

        GET:请求获取指定的资源;

        PUT:向指定的位置上传资源的最新版本;

        POST:用于实现表单认证,在资源之后附加相关数据;

        DELETE:请求服务器删除被明确标识的资源;

        HEAD:与GET方法相同,都是向服务器申请获取资源,但HEAD方法仅向服务器请求响应消息的首部元信息;

        TRACE:请求服务器回送收到的请求信息;用于测试或者故障诊断;

        CONNECT:保留,留待将来使用;

        OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项以及请求资源可以使用的方法;


       http/1.1:

       强化了缓存功能;

       持续连接机制:keepalive,也称持久连接,长连接;

 


       http/2.0--IETF(2015年5月)



       http协议的特点:

            应用层协议

            80/TCP


      TCP协议的特性:

            面向连接:

            建立连接(三次握手),维持连接稳定,拆除连接(四次挥手)

            数据序列化传输;

            将数据分段打包,并为每段提供CRC校验和;

            确认机制;

            流量控制:滑动窗口;

            拥塞控制:慢启动算法+拥塞避免算法;快重传算法+快恢复算法;


     http协议:

      Hyper-Text Transfer Protocol,超文本传输协议;


      HTML:Hyper-Text Marked Language,超文本标记语言;


       主要的标记框架:

                 <html>

                 <head>

                 <title>qhdlink web site</title>

                <meta >

                </head>

                <body>

                <a> ... </a>

                <p> ... </p>

                <br>

                <hr>

                <form> ... </form>

                <table>

                <th> ... </th>

                <tr> ... </tr>

                <td> ... </td>

                </table>

                </body>

                </html>




           http协议的工作模式:request/response模式;

           一次完整的http事务:请求<-->响应;

            一次完整的http通信,包括一次请求及对应于此次请求的响应;


          web资源:

              一个html文档;

              一张图片(jpg/jpeg,gif,png)

              一个MP3片段

              一个mpeg/mp4片段

              一个PHP脚本

              一个js脚本

              一个css样式表

               ...

      

         一次http请求,只能请求一个web资源;


       并发响应模型:

              单进程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:Uniform Resource Indentifier,统一资源标识符;

        Web上可以的各种资源,如:HTML文档,图片,视频或音频片段,应用程序,压缩包,脚本等,都可以使用URI进行统一的唯一的标识;

        URI一般包含三个部分:

            1.资源的命名机制;

            2.存放资源的主机名称;

            3.资源自身名称;


         URL:Uniform Resource Locator,统一资源定位符;

         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]


         web资源的分类:

            静态资源:

            服务器会根据客户端的请求直接将资源原封不动的响应给客户端的资源;

            html文档

            图片

            视频片段,音频片段

            纯文本

            css

            ...


         动态资源:

          通常是由某种编程语言编写的程序文件,在服务器上经过某种特定方式执行之后生成相应的html页面,服务器将程序运行生成的html页面响应给客户端的资源;


              服务器端动态资源:

                 php脚本

                 jsp程序

                .NET程序

                 python脚本

                 ruby脚本

                 C/C++程序


             客户端动态资源:

                javascript脚本

                Servlet

                ActiveX


        资源的路径映射:

        chroot机制:


                如:

                 /var/www/html/a.html (根文件系统上的路径)


                 /var/www/html/ ----> / (web服务的路径)


                 DocumentRoot /var/www/html/ (映射web根目录的指令)


                 http://server/a.html


         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

                                 Websphere

                                 Jboss

                                 Glassfish

                                 PHP:

                                    php

                                    php-fpm

                                 Python:

                                     python

                                 .NET:

                                 IIS



          A Patchy Server,一个充满了补丁的服务器;Apache


            ASF:Apache Software Foundation,Apache软件基金会;‘


            httpd的官方服务站点:httpd.apache.org


            httpd应用程序的版本:

               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:Multipath Processing Modules,多道处理模块;用来设定httpd进程的并发响应模型;

              prefork:多进程IO模型;

                  1.一个主进程,多个子进程;

                  2.主进程用于管理子进程,创建套接字,接收客户端请求,并将客户端请求派发给子进程处理;

                  3.子进程负责处理客户端请求及构建和发送响应报文;

                  4.一个子进程仅能处理和响应一个客户端的请求;

                  5.httpd默认的MPM模块;


             worker:复用的多进程IO模型(多进程多线程)

                  1.一个主进程,多个子进程;

                  2.主进程用于管理子进程,创建套接字,接收客户端请求,并将客户端请求派发给子进程处理;

                  3.子进程负责管理其内部的各线程;

                  4.线程负责处理客户端请求及构建和发送响应报文;

                  5.一个线程仅能处理和响应一个客户端的请求;


              event:复用的IO模型(事件驱动的多进程模型)

                  1.一个主进程,多个子进程;

                  2.主进程用于管理子进程,创建套接字,接收客户端请求,并将客户端请求派发给子进程处理;

                  3.子进程负责处理客户端请求及构建和发送响应报文;

                  4.一个子进程可以处理和响应多个客户端的请求;


             注意:event模型在httpd-2.0之前不支持;在httpd-2.2版本中仅用作测试;只有在httpd-2.4中才被定义为建议使用的模型;


                   在CentOS 6中,通过rpm包仅能安装httpd-2.2版本,event模型是测试模型,不支持DSO动态装载和卸载;

                   在CentOS 7中,通过rpm包能安装httpd-2.4版本,event模式为"production ready",并且支持DSO动态装载和卸载;


         httpd的功能:

                  支持CGI(Common Gateway Interface);

                  虚拟主机:Virtual Host

                  虚拟主机的标识方式:

                  IP + PORT + FQDN

                  反向代理:Reverse Proxy

                  负载均衡集群:

                   基于流量,bytraffic

                   基于业务,bybusiness

                   基于请求,byrequest

                 路径名称的别名的设置

                 身份验证:

                       basic

                      digest

                 支持丰富的第三方模块;


            安装httpd:

             rpm包:本地光盘yum源;

             编译源代码:

             定制新功能;

             为了安全去除带有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模型;

       /usr/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服务

     5.监测服务启动是否正常:

      ss -tnl | grep httpd

      ps aux | grep httpd

      service httpd status (CentOS 6)

      systemctl status httpd.service (CentOS 7)


      例:

      blob.png


     测试:

      blob.png