http协议--Apache-Httpd服务基本配置-rpm安装-编译安装(HTTP2.2,HTTP2.4)

socket:
    OSI七层:
        上三层:用户空间
        下四层:通信子网,内核空间

        ip:主机到主机通信
        MAC:设备到设备

        传输层:提供进程地址
            POrt number
                tcp:传输协议,面向连接的协议,通信前需要建立虚拟链路,结束后拆除链路
                    数据流同信
                udp:非面向连接的协议
                    数据报文通信
    
    Socket:IPC的一种实现(共享内存等都是IPC实现),位与同一主机或不同主机,不同进程之间通信,从而完成数据交换
        Socket API:库调用接口

        TCP:端口0-65535
        UDP:端口0-65535

        socket 有三种类型:
            使用TCP:SCOK_SEREAM
            使用UDP:SOCK_DGRAM
            IP报文直接通信:SOCK_RAW

        TCP层功能:提供端口(向内核申请)
            0-1023:只有root使用,永久的分配给固定的程序
            1024-41951:注册端口,分配给程序注册为某应用使用
            41951-65535:客户端随机使用的端口,动态端口。

            双方通信 是建立了 一对套接字,客户端使用 41952以上的随机端口,服务器 是固定使用端口

            [root@node1 ~]# cat /proc/sys/net/ipv4/ip_local_port_range 
            32768    60999


        TCP特性:
            半关闭:你可以理我,我可以不理你
            工作在传输层
            面向连接协议
           错误检查
           将数据打包成段,排序
           确认机制
           数据恢复:重传
           流量控制:滑动窗口(自己能接收报文的空闲有多大,也就是接收方的缓存有多大)
           拥塞控制:慢启动和拥塞避免算法    (可能数据量大,但是此时的带宽很小)
    
        Socket Domain:根据使用的地址
            AF_INET:基于ipv4的
            AF_INET6:基于ipv6
            AF_UNIX:同一主机上的(应用程序,绕过TCP/IP协议栈,不往下再走,直接返回)

            每类套接字都至少提供了两种socket,流,数据报
                流:
                    可靠的传递,面向连接,无报文边界,只要建立连接,就一直可以传数据

                数据报:
                    不可靠的传递,有边界,非面向连接(因为面向非连接,所以必须有开始,有结束,即边界)

            套接字相关的系统调用:
                socket():创建套接字
                bind():绑定套接字
                listen():j监听
                accept():接受请求
                connect():请求连接建立
                write():发送数据
                reead();从缓存接受数据
                    send(),recv(), sendto(),recvfrom()
10Mbps=10*1024Kbps=10*1024*1024bps=10*1024*1024/8 Byte/s=10/8 MB/s=1.25 MB/s
            
http协议:超文本传输协议
    html:编程语言,超文本标记语言

    <html>
        <head>
            <h1></h1>
                <p>.....<a href="www.baidu.com">‘’‘’</a></p>
        </head>
    </html>

    CSS:
    javascript

    MIME:通过文本协议发送非文本协议

    工作机制:
        http请求
        http相应

    web资源:web resource
        静态文件:jpg,gif,txt,js,css,mp3,avi
        动态文件:php,jsp

        媒体:
            媒体类型:(MIME是对其分别编码的),major/minor --主类型/次类型
                text/html
                image/jpeg

    URI:同一资源标识符
        URL:统一资源定位符,用于描述某服务器特定资源的位置
            <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
            scheme:方案,访问服务器以获取资源时要使用哪种协议
            user:用户,某些方案访问资源时需要的用户名
            password:密码,用户对应的密码,中间用:分隔
            Host:主机,资源宿主服务器的主机名或IP地址
            port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
            path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔

            params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔

            query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔

            frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
                定位到某个位置

            相对URL:同一个站点内的
            绝对URL:夸站

        URN:统一资源命名

    http协议版本:
        HTTP/0.9:源版本
        HTTP/1.1:增强了缓存
        HTTP/2.0:

    无状态的:
        不会记录谁访问的服务器


        引入cookie追踪同一个用户
            客服端第一次访问服务器端,服务器端会发一个随机数据,唯一标识用户信息,
            客户端会将其保存到本地磁盘。之后在访问,将相应的服务器的cookie信息带上。

            服务器端利用seeion保存会话信息

    http事物:
        请求:request
        响应:reaponse

        报文语法格式:
            request报文:
                <nethod> <url> <version>
                <headers>:很多请求首部
                换行
                <entity-body>


            response报文:
                <version> <status> <响应短语>
                <headers>

                <emtity-body>

            method:请求方法,客户端希望服务器端希望对资源执行的动作
                GET,HEAD, POST

            URL:
            version:HTTP/主版本号.次版本号
            status:
            响应短语:状态码的简要描述
            headers:标记请求或响应的属性的。
                每个请求或响应报文可包含任意个首部0,1或多个
                每个首部有名称,后面跟一个冒号,再跟一个可选空格,接着是一个值
            entity-body:
                有用的数据块,请求的报文可能为空

        method:
            GET:从服务器获取一个资源
            HEAD:只从服务器获取响应首部(<version> <status> <响应短语>  <headers>这两行)
            POST:向服务器发行要处理的数据
            PUT:将请求的主体部分存储在服务器上(危险)
            DELETE:删除服务器上指定的文档
            TRACE:追踪请求到达服务器中间经过的代理服务器
            OPTIONS:请求服务器返回对指定资源支持的使用方法

        status:
            1xx:100-101,信息提示
            2xx:200-206,成功类的信息
            3xx:300-305,重定向类的状态码,301 永久重定向,302 临时重定向
            4xx:400-415:客户端错误
            5xx:500-505,服务器错误

            常用的状态码:
                200:成功响应 -- ok
                301:永久重定向 -- Moved Permanently
                302:临时重定向 -- Moved Temporarily
                304:本地有缓存,问服务器端,资源是否发生变化,服务器端资源未发生改变 -- Not Modified
                401:需要输入账号密码访问 Unauthorized
                403:请求别禁止Forbidden
                404:服务器无法找到客户端请求的资源, Not Found
                500:服务器内部错误 Intrenal Server Error
                502:代理服务器从后端服务器收到了一条伪响应,如无法连接到网关:Bad Gateway
                503:服务器不可用,临时服务器维护或过载,服务器无法处理请求
                504:网关超时

            首部的分类:
                通用首部:即可用在响应也可用在请求

                请求首部
                响应首部

                实体首部
                扩展首部

                    通用首部:
                        Date:报文的创建时间
                        Connecion:连接方式
                        Via:显示报文经过的中间节点
                        Cache-Control:控制缓存
                        Pragma:也是缓存相关
                    请求首部:
                        Accept:通过服务器自己可接受的媒体类型
                        Accept—Charset
                        Accept-Ecoding:接受的编码格式,如gip
                        Accept-Language

                        Client-IP
                        Host:请求的服务器名称和端口号
                        Referer:包含当前正在请求的资源的上一级资源
                        User-Agent:客户端代理(浏览器类型等)

                        条件式请求首部:
                            Expect
                            IF-Modified-Since:自从指定的时候之后,请求的资源是否修改
                            IF-Unmodified-Since
                            IF-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配
                            IF-Match
                        安全请求的首部:
                            Authorization:向服务器发送认证信息,如账号密码
                            Cookie:向服务器端发送cookie
                            Cookie2
                        代理请求首部:
                            Proxy-Authorization:向待服务器认证
                    响应首部:
                        信息性:
                            Age:有效期限,响应持续时长
                            Server:服务器类型 ,软件名称和版本
                        协商首部:某资源有多种昂表示方法时使用
                            Accept-Range:服务器可接受的请求范围类型
                            Vary:服务器查看的其他首部列表
                        安全响应首部:
                            Set-Cookie:向客户端设置cookie
                            www.Authenticate:来自副武器的对客户端的质询认证表单
                    实体首部:
                        Allow:列出对此实体可使用的请求方法
                        Location:告诉客户端真正实体位与何处

                        Content-Encoding:内容编码模式
                        Content-Language
                        Content-Length:主体的长度
                        Content-Location:实体真正所处的位置
                        COntent-Type:主体的对象类型

                        缓存相关的:
                            ETag:实体的扩展标签
                            Expires:实体的过期时间
                            Last-Modified:最后一次修改的时间


    一次完整的http请求过程:
        1、建立或处理连接的过程 --- 接受请求或s拒绝请求
        2、接受请求,客户端http请求报文是什么 
            --- 接受来自于网络的请求报文中对某一资源的一次请求的过程

            并发访问响应模型(web IO)
                单进程IO结构:启动一个进程处理用户请求,而且一次只能处理一个,多个请求被串行响应
                多进程IO结构:并行启动多个进程,每个进程响应一个请求
                IO 复用:一个进程响应N 个请求
                    --- 多线程模型,一个进程生成n 个线程,一个线程响应一个用户请求
                    --- 事件驱动:event-driven
                复用的多进程IO结构:启动多个进程,每个进程响应n个请求

        3、处理请求--- 对请求报文进行解析,并获取请求的资源及请求方法等相关信息
            元数据:请求报文首部
                <method> <url> <version>
                Host:www.baidu.com 请求的主机名称
                connection:

        4、访问资源 --- 获取报文中指定请求的资源 

                web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放在某路径下,此路径称为 DocRoot

                web服务器资源路劲映射方式:
                    docroot
                    alias
                    虚拟主机映射
                    用户家目录docroot

        5、构建响应报文 --- MIME类型

                显示分类
                魔法分类
                协商分类

            URL重定向:

        6、发送响应报文

        7、记录日志

http服务器程序:
    httpd(apache)
    nginx
    lighttpd(类似nginx)

    应用程序服务器:
        IIS:解析.net
        tomcat,jetty,jboss,resin
        重量级:webshpere,weblogic,oc4j


    httpd的安装和配置
        httpd:apache

        httpd的特性:
            高度模块化设计(动态)core + modules
            DSO:动态共享对象
            MPM:多路处理模块
                prefork:多进程模型,每个进程响应一个请求
                    一个主进程:负责生产N 个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即便没有用户请求,也会生产多个空闲进程,随时等待请求到达。
                        最大不会超过1024个
                    被用后的子进程,还会回到空闲进程,以便下次用


                worker:多进程多线程模型,每个线程处理一个用户请求
                    一个主进程:负责生产子进程,负责创建套接字,赋值接受请求,并将其派发给某子进程进行处理,
                    多个子进程:每个子进程负责生产多个线程
                    每个线程:负责响应用户请求
                    并发响应数量:m*n
                        m:子进程
                        n:每个子进程的最大线程数
                event:事件驱动,多进程模型,每个进程响应多个请求
                    一个主进程:f负责生产子进程,
                    子进程:基于事件驱动机制直接响应多个请求

                    http-2.4:event可以用于生产环境

            httpd的功能特性:
                    虚拟主机
                        IP、Port、FQDN
                    CGI:Common Gateway Interface,通用网关接口;
                    反向代理
                    负载均衡
                    路径别名
                    丰富的用户认证机制
                        basic
                        digest
                    支持第三方模块

            

    安装:
        CentOS6 2.2
        CentOS7 2.4


        安装httpd: 
                rpm包
                源码编译安装

        CentOS 6:
            rpm安装
                rpm -qc httpd
            配置文件:
                /etc/httpd/conf/httpd.conf
                /etc/httpd/conf.d/*.conf

            服务脚本:
                /etc/rc.d/init.d/httpd
                -- 配置文件:/etc/syscongfig/httpd

            MPM:默认使用prefork
            主程序文件
                /usr/sbin/httpd
                /usr/sbin/httpd.event
                /usr/sbin/httpd.worker
            日志文件:
                /var/log/httpd
                    access_log:访问日志
                    error_log:错误日志
                        web启动停止信息,运行中的错误信息
            站点文档目录:
                /var/www/html
            模块文件路径:
                /usr/lib64/httpd/mpdules

            配置文件的组成:
                [root@node1 ~]# grep 'Section' /etc/httpd/conf/httpd.conf 
                ### Section 1: Global Environment
                ### Section 2: 'Main' server configuration
                ### Section 3: Virtual Hosts

                配置格式:direcctive value
                    directive:不区分大小写
                    value:为路径时,取决于文件系统是否区分大小写

                任何文本信息服务,都可以使用telnet连接

            PV,UV:
                PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量

                UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的

            常用配置:
                1、修改监听port和IP:可以出现多条
                    Listen 80
                    Listen ip:port
                2、持久连接:
                    长连接:持久连接,每个资源获取成功后,不会断开连接,继续等待其他请求的完成
                        如何断开:
                            数量限制:默认获取100个资源,之后就断开
                            时间限制:可配置,不建议太长,有可能空闲的时间太长
                        副作用:对并发访问量较大的服务器,持久连接,会使得有些请求得不到相应。
                        折中的方案:使用较短的链接时间,5s
                            httpd2.4 支持毫秒级的
                            httpd 1.0 默认持久连接

                    短连接:每次(每个资源)都要三次握手
                    KeepAlive Off
                    MaxKeepAliveRequests 100
                    KeepAliveTimeout 15

                    测试:
                        telnet host port
                        Get /url HTTP/1.1
                        Host: ip or hostname

                3、MPM:
                    多道处理模块

                    httpd-2.2 不支持同时编译多个模块,所以只能编译时选定一个,rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持,确认方法:
                        ps aux | grep httpd

                    默认为/usr/sbin/httpd ,其使用prefork
                        查看模块列表的方式:
                            httpd -l:查看静态编译的模块
                                [root@node1 conf]# httpd -l
                                Compiled in modules:
                                  core.c
                                  prefork.c
                                  http_core.c
                                  mod_so.c
                            如果程序是work:
                            httpd.work -l
                            如果是event
                            httpd.event -l

                            httpd -M:当前httpd加载的所有模块

                    更换使用的httpd程序;
                        /etc/sysconfig/httpd

                        重启服务才能生效

                    prefork的配置:    
                        <IfModule prefork.c>
                        StartServers       8   --- 服务启动时启动的进程数,与cpu相关
                        MinSpareServers    5   --- 最小空闲进程数
                        MaxSpareServers   20   --- 最大空闲进程数
                        ServerLimit      256   --- 为下面一条所准备的在其服务器生命周期的最大值
                        MaxClients       256   --- 最多只允许这么多同时访问
                        MaxRequestsPerChild  4000  --- 一个服务器进程最多响应多少次的服务请求,之后kill掉,再重新建立连接
                        </IfModule>
                    worker的配置
                        <IfModule worker.c>
                        StartServers         4  --- 启动的进程数,不包含默认主控的root
                        MaxClients         300  --- 最大请求
                        MinSpareThreads     25
                        MaxSpareThreads     75
                        ThreadsPerChild     25 --- 所以刚开始启动4个,一会就变成3个,因为最多 75个线程
                        MaxRequestsPerChild  0
                        </IfModule>
                        300 * 86400 

                4、DSO:模块的动态装卸载
                    LoadModule <mod_name> <mod_path>

                    模块路径可以使用相对地址,但是相对于 ServerRoot(/etc/httpd)指向的路径而言。
                        /etc/httpd/modules/

                5、定义'Main' server 的文档页面路径
                    DocumentRoot --- 文档路径映射

                    文档路径映射:
                        DocumentRoot指向的路径为URL路径的起始位置

                            把selinux,IPtables关掉
                6、站点访问控制:
                    可基于两种类型的路径指明对那些资源进行访问控制
                        文件系统路径:
                            <Directory ''></Directory> 目录
                            <File ''></File> 单个文件
                            <FileMatch ''></FileMatch> 模式匹配
                        URL:路径控制:
                            <Location ''></Location>

                    访问控制机制:
                        基于来源地址:
                        基于用户账号:
                7、Directory中 基于来源地址 实现访问控制
                    options:
                        所有可用选项: Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
                        常用:
                            ALL:
                            None:
                            Indexes:默认返回(默认是打开的,显示文件,例如下载站点那样)
                                apache的httpd是提供了欢迎页面的,在conf.d下
                            FollowSymLinks:某文件连接到DocumentRoot下是否允许访问

                            SymLinksifOwnerMatch:属主匹配才可以访问
                    AllowOverride:
                        None:不用太多关注

                    基于原地址的访问控制机制
                        Order:检查次序(后面的是默认的)
                            order allow,deny
                            order dengy,allow
                        Allow from 。。。
                        Deny from 。。。
                            来源地址:
                                IP
                                网络地址:
                                    172.16
                                    172.16.0.0
                                    172.16.0.0/16
                                    172.16.0.0/255.255.0.0


                8、定义默认主页面:url没有指定主页面,就会从默认页面访问,从左往右依次,第一个没有,则访问第二个。如果都没有,则需要Directory 的 Indexes
                    DirectoryIndex index.html denx.html

                9、日志定义
                    错误日志:
                        ErrorLog logs/error_log
                        LogLevel:
                            debug, info, notice, warn, error, crit,alert, emerg.
                            默认:warn

                        访问日志:
                            CustomLog logs/access_log

                        日志格式:
                            LogFormat "%h %l %u %t \"%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

                            %h:客户端IP地址
                            %l:logname, - 表示为空,是一个模块功能
                            %u:远程 user
                            %t:服务器收到请求时的时间
                            \:转义
                            %r:请求报文的首行信息(method,url,version)
                            %>s:响应状态码
                            %b:响应报文主体大小,不包括响应报文首部大小
                            %{Referer}i:请求报文当中 ‘referer’首部的值
                                到达当前页面的入口,即来自原哪个页面请求跳转过来的超链接
                            %{User-Agent}i:请求报文当中User-agent首部的值,即发出请求用到的应用程序
                10、路径别名:
                    DocumentRoot '/www/htdocs'
                        http://www.jerry.com/download/bash-4.x86.rpm
                            ---/www/htdocs/download

                    Alias /URL/ '/path/to/somedir/' ---- RUL后的 / 和 后面对应,要不全有,要不全没有

                        Alias /bbs/ '/forum/'
                            http://www.jerry.com/bbs/index.html
                                --- /forum/index.html


                11、设定默认字符集
                    AddDefaultCharset UTF-8

                12、基于用户做访问控制;
                    认证质询:输入框(同时给一个错误响应)
                        www.Authentitacate: 401,先拒绝请求,要提供账号密码

                    认证:
                        Authoriazation:客户端用户提供账号密码,再次请求。

                        认证类型:
                            basic:明文认证(base64)
                            digest:消息摘要

                        安全域:需要用户认证后才能访问的路径
                            应该通过名称对其进行标识,并用于告知用户认证的原因。

                            用户的账号和密码存储何处:
                                虚拟账号:仅用于访问某服务时用到的认证标识

                            存储:
                                文本文件
                                sql数据量
                                ldap
                                NIS
                        basic认证:
                            定义安全域
                                <Directory ''>
                                    Option None
                                    AllowOveride None
                                    AuthType Basic
                                    AuthName 'string;'
                                    AuthUserFile '.htpasswd'
                                    Require User username1,username2...
                                </Directiory>

                                    允许招行文件中的所有用户登录访问:

                                        Require valid-user
                            提供账号和密码存储(文本文件)
                                使用htpasswd命令生成
                                    htpasswd [options] username
                                        -c:自动创建file,第一次创建用户使用
                                        -m:md5
                                        -s:ssha1加密
                                        -D:删除指定用户
                            基于组账号认证:
                                <Directory ''>
                                    Option None
                                    AllowOveride None
                                    AuthType Basic
                                    AuthName 'string;'
                                    AuthUserFile '.htpasswd'
                                    AuthGroupFile '.htgroup'
                                    Require group group_name...
                                </Directiory>

                                要提供:用户账号文件和组文件
                                    组文件:每一行一个组
                                            GROUP_NAME: user1,user2....


                13、虚拟主机
                    hostname 服务器端是可以看见的,通信报文会在应用层加上,并不是为了通信,因为通信之前都会根据dns解析出IP地址

                    三种实现:
                        基于IP:
                            每个虚拟主机准备至少要一个IP地址 -- 很少用,变化的,而且外网还得租用
                        基于端口:
                            每个虚拟主机准备至少一个专用port--很少用,改了端口,别人就不知道了
                            配置的时候,这个端口一定要监听:Listen 8080
                        基于主机名:
                            2.2版本,要启动 NameVirtualHost *:80这一项
                                如果这里使用*:80 虚拟机也使用,否则同一使用ip:80
                            为每个虚拟主机提供专用的hostname

                        可以混合使用上述三种方式

                    虚拟主机不要跟中心主机混用,所以要使用虚拟主机,先禁用中心主机
                        ---注释DocumentRoot

                    每个虚拟主机都有专用的配置
                        <VirtualHost 'IP:PORT'>
                            ServerName
                            DocumentRoot
                        </VirtualHsot>
                            中心主机的基本都可以使用
                            ServerAlias:虚拟主机的别名
                            ErrorLog
                            CustomLog
                            <Directory ''>
                            </Directory>

                    service httpd configtest(-t)测试配置文件是否正常

                    测试:
                        网卡上配置两个ip
                        写一个virtual.conf
                        本地测试:/etc/reslov.conf
                        使用curl 测试

                        否则修改win的hosts文件


                14、内置的status页面:
                    <Location /server-status>
                        SetHandler server-status
                        Order deny,allow
                        Deny from all
                        Allow from .example.com
                    </Location>


                15、curl的使用:
                        -A/--user-agent <string> 设置用户代理发送给服务器
                        -basic 使用HTTP基本认证
                        --tcp-nodelay 使用TCP_NODELAY选项
                        -e/--referer <URL> 来源网址
                        --cacert <file> CA证书 (SSL)
                        --compressed 要求返回是压缩的格式
                        -H/--header <line>自定义首部信息传递给服务器
                        -I/--head 只显示响应报文首部信息
                        --limit-rate <rate> 设置传输速度
                        -u/--user <user[:password]>设置服务器的用户和密码
                        -0/--http1.0 使用HTTP 1.0    
                    elinks:
                    links:

                16、使用mod_deflate模块压缩页面优化传输速率

                    适用场景:
                (1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
                (2) 压缩适于压缩的资源,例如文件文件;


                            SetOutputFilter DEFLATE

                            # mod_deflate configuration
                        
                         
                            # Restrict compression to these MIME types
                            AddOutputFilterByType DEFLATE text/plain 
                            AddOutputFilterByType DEFLATE text/html
                            AddOutputFilterByType DEFLATE application/xhtml+xml
                            AddOutputFilterByType DEFLATE text/xml
                            AddOutputFilterByType DEFLATE application/xml
                            AddOutputFilterByType DEFLATE application/x-javascript
                            AddOutputFilterByType DEFLATE text/javascript
                            AddOutputFilterByType DEFLATE text/css
                         
                            # Level of compression (Highest 9 - Lowest 1)
                            DeflateCompressionLevel 9
                             
                            # Netscape 4.x has some problems.
                            BrowserMatch ^Mozilla/4 gzip-only-text/html
                             
                            # Netscape 4.06-4.08 have some more problems
                            BrowserMatch ^Mozilla/4\.0[678] no-gzip
                             
                            # MSIE masquerades as Netscape, but it is fine
                            BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

                    17、https
                        基于服务器端口443的连接;
                        ssl连接;

                        http over ssl = https 443/tcp
                            ssl: v3
                            tls: v1

                            https://

                        SSL会话的简化过程
                            (1) 客户端发送可供选择的加密方式,并向服务器请求证书;
                            (2) 服务器端发送证书以及选定的加密方式给客户端;
                            (3) 客户端取得证书并进行证书验正:
                                如果信任给其发证书的CA:
                                    (a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
                                    (b) 验正证书的内容的合法性:完整性验正
                                    (c) 检查证书的有效期限;
                                    (d) 检查证书是否被吊销;
                                    (e) 证书中拥有者的名字,与访问的目标主机要一致;
                            (4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
                            (5) 服务用此密钥加密用户请求的资源,响应给客户端;

                            注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;

                        回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)

                    配置httpd支持https:
                            (1) 为服务器申请数字证书;
                                测试:通过私建CA发证书
                                    (a) 创建私有CA
                                    (b) 在服务器创建证书签署请求
                                    (c) CA签证
                            (2) 配置httpd支持使用ssl,及使用的证书;
                                # yum -y install mod_ssl

                                配置文件:/etc/httpd/conf.d/ssl.conf
                                    DocumentRoot
                                    ServerName
                                    SSLCertificateFile
                                    SSLCertificateKeyFile
                            (3) 测试基于https访问相应的主机;
                                # openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

                    18、httpd自带的工具程序

                            htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具;

                            apachectl:httpd自带的服务控制脚本,支持start, stop;

                            apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具;

                            rotatelogs:日志滚动工具;
                                access.log -->
                                access.log, access.1.log
                                access.log, access.1.log, access.2.log
                            suexec:
                                访问某些有特殊权限配置的资源时,临时切换至指定用户运行;

                            ab: apache benchmark

                    19、http压力测试工具
                        简易:
                            ab
                            webbench
                            http_load
                        强大的:
                            jmeter
                            loadrunner
                        网易:
                            tcpcopy

                            ab [OPTIONS] URL
                                -n: 总的请求数
                                -c:模拟的并发数
                                -k: 以持久连接模式测试

                            ulimit -n #: 调整当前用户所同时打开的文件数;


    http-2.4


        新特性:
            (1) MPM支持运行DSO机制;以模块形式按需加载;
            (2) 支持event MPM;
            (3) 支持异步读写;
            (4) 支持每模块及每个目录分别使用各自的日志级别;
            (5) 每请求配置;<If>
            (6) 增强版的表达式分析器;
            (7) 支持毫秒级的keepalive timeout;
            (8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令;
            (9) 支持用户自定义变量;

        新模块:
            (1) mod_proxy_fcgi:可以是httpd和php服务器连接
            (2) mod_ratelimit
            (3) mod_remoteip

        修改了一些配置机制:
            不再支持使用Order, Deny, Allow来做基于IP的访问控制;


    安装httpd-2.4
                     
        httpd依赖于apr-1.4+, apr-util-1.4+, [apr-icon]
            apr: apache portable runtime运行时环境

        CentOS 6:推荐编译安装,不建议升级apr,会影响别的程序
                默认:apr-1.3.9, apr-util-1.3.9 

                编译安装步骤:

                    1.4+版的apr和apr-util

                    前提:
                        安装开发环境,相关的开发包租,安装pcre-devel(支持正则)

                    (1) apr
                        # ./configure --prefix=/usr/local/apr
                        # make && make install

                    (2) apr-util
                        # ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
                        # make && make install

                    # groupadd -r apache
                    # useradd -r -g apache apahce
                    # ./configure --prefix=/usr/local/apache --sysconf=/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=prefork
                    # make && make install

                    启动服务:
                        apachectl 

        CentOS 7:

            配置文件:httpd -l 下 就没有mpm 模块了,因为动态共享了
                主配置文件:/etc/httpd/conf/httpd.conf
                模块配置文件:/etc/httpd/conf.modules.d/*.conf
                辅助配置文件:/etc/httpd/conf.d/*.conf

            MPM:以DSO机制提供,配置文件00-mpm.conf

            服务控制:systemctl {start|stop|restart|status|reload} httpd.service


        配置:
                (1) 切换使用MPM
                    LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
                        NAME: prefork, event, worker

                (2) 修改'Main' server的DocumentRoot

                (3) 基于IP的访问控制法则:每个路径默认都是无法访问的,必须提供控制
                    允许所有主机访问:Require all granted
                    拒绝所有主机访问:Require all deny

                    控制特定IP访问:
                        Require ip IPADDR:授权指定来源地址的主机访问
                        Require not ip IPADDR:拒绝指定来源地址的主机访问

                        IPADDR:
                            IP: 172.16.100.2
                            Network/mask: 172.16.0.0/255.255.0.0
                            Network/Length: 172.16.0.0/16
                            Net: 172.16

                    控制特定主机(HOSTNAME)访问
                        Require host HOSTNAME
                        Require not host HOSTNAME

                        HOSTNAME:
                            FQDN: 特定主机
                            DOMAIN:指定域内的所有主机


                    <RequireAll> #单独的主机能否访问,要放在这个容器中
                        Require all granted
                        Require not ip 10.252.46.165
                    </RequireAll>


                (4) 虚拟主机
                    基于IP、Port和FQDN都支持;
                    基于FQDN的不再需要NameVirtualHost指令;

                (5) ssl
                    启用模块:
                        LoadModule ssl_module modules/mod_ssl.so

                (6) 服务脚本(centos6编译安装,所以需要 一个服务脚本,否则手动到安装目录下启动apachectl
                    只需要将centos6 上默认安装的HTTP2.2的服务脚本/etc/rc.d/init.d/下复制一份,并修改如下:
                        apachectl=/usr/local/apache/bin/apachectl
                        httpd=/usr/local/apache/bin/httpd
                        prog=httpd
                        pidfile=${PIDFILE-/var/run/httpd/httpd24.pid}
                        lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

                        在加到服务中
                        chkconfig --add httpd24

                        就可以直接使用 service httpd24 start



脚本路径别名(CGI接口):现在极少用
   URL-->FileSystem Directory
   CGI:Common Gateway Interface(通用网关接口)使WEB可以跟一个应用程序进行通信,从通信环境中获得结果。
        没有CGI:通过文件后缀识别,如果不能处理,就下载,没有后缀,直接读取
        但是后端程序支持CGI协议才可以,bash就是其中之一。
    CGI是不安全的,后端必须以root身份执行。
      请求的数据,在本地执行后,如果:
              在第一行写入
              echo “Content-Type:text/html:表示支持CGI的

   mod_alias,mod_cgi
   ScriptAlias /URL/ "/path/to/somewhere" somewhere下的文件可以被执行
   也可以在目录中实现

  格式一般为
   cat << EOF
    Content-Type:text/html
    <pre>
    The time is : `date`.
    </pre>
    EOF

 

 

 

posted @ 2018-10-22 11:20  JerryZao  阅读(910)  评论(0编辑  收藏  举报