http:hyper text transfer protocol 超文本传输协议;80/tcp
    html:超文本标记语言;
        格式:
            #<html>
            #    <head>
            #        <tital> </tital>
            #    </head>
            #    <body>
            #        <h1> </h1>
            #         ...
            #    </body>
            #</html>

CSS:级联样式表;
            可以丰富HTML页面的内容;喜欢可以网上搜索一些相关的书籍;

http早期只能传输HTML所标记的文本,后来因为引入了MIME,才可承载现在我们看见的丰富多彩的页面(视频,图片,音乐等);
        MIME:可以将非文本数据编码成文本数据,然后到客户端再反向翻译回去;最早是为了smtp而设计的;
    工作机制:
        http请求报文:用于客户端请求服务器中的资源;
        http响应报文:用于服务器返回客户端要求的资源;
            工作过程:
                客户端再浏览器输入URL地址,浏览器根据URL信息封装HTTP请求报文;此步需要DNS介入;
                    URL标识了使用的协议、服务器主机名、端口号、资源在服务器端的路径等;
                客户端建立与服务器端的TCP连接;
                    服务器端的HTTP通常是监听在tcp的80端口;
                客户端发送请求报文给服务器;
                    请求格式为:URL、协议版本号、MIME、自身信息等内容;
                服务器相应客户端;
                    格式为:协议版本号、成功与否的代码、MIME、自身信息等内容;
                服务器端根据自己的设置来决定是否立即关闭tcp连接;
                    服务器或客户端可以通过Keelalive来交流传输完成是否断开连接;
                借鉴网址:https://www.cnblogs.com/chyg/p/5212008.html 
        web资源:
            静态文件:直接发给客户端的文件,无需做过多处理;
                例如:.jpg,.gif,.html,.txt,.js,.css,mp3,.avi等
            动态文件:需要在服务器端执行后再发送给客户端的文件,因为在服务器端可能需要与数据库交互一些数据,然后执行程序而形成文件再发送给客户端显示;
                例如:.php,.jsp等
            我们平时通过浏览器访问页面可以看到许多视频或者图片,让我们以为是浏览器的功劳,其实这些内容的显示一般都是通过文件的后缀名来确定文件的类型,然后通过加载浏览器之外的插件来打开嵌入在页面中显示的;
            资源也可称为媒体:
                资源|媒体类型(MIME类型):major/minor      主要类型(大类)/次要类型(小类|子类)
                    text/html:首先是文本类型,然后是超文本类型;
                    text/plain:首先是文本类型,然后是纯文本类型
                    image/jpeg:jpeg格式的图片;
                    image/gif:fig格式的图片
                媒体类型决定了需要的时候浏览器使用什么外部插件(外部应用程序)来打开对应的资源;
            当我们打来一个网页页面时(比如:首页页面),表面上我们访问的是一个资源,其实背地里我们可能已经请求了很多个资源(比如:图片啊,视频啊,动图啊,链接至其他网址的超链接啊,因为现在的首页页面都是丰富多彩的啦,如果太单调哪有用户喜欢啊!
        URI:Uniform Resource Identifier
            URL,Uniform Resource Locator :用于描述某服务器某特定资源的位置;统一资源定位符;
                Scheme://server:port/path/to/resprce
                    例子:http://www.guowei.com/ISO/haha.jpg
            URN,Uniform Resource Naming:统一资源命名符;
        http协议版本:
            HTTP/0.9:原型版本;
            HTTP/1.0:曾经广泛使用但简陋的版本;
            HTTP/1.1:增强的版本,增强了缓存功能;
            HTTP/2.0:现在使用的版本;
        MPM:multi-processing module 多路处理模块;
            三种模式:
                prefork:多进程I/O模型,每个进程相应一个模型;默认模型;
                    一个主进程,多个子进程:主进程生成多个子进程、创建套接字、不响应请求;每个子进程用来响应一个请求,系统初始时预先生成多个空闲的进程用来等待请求;
                worker:复用的多进程I/O模型,多进程多线程;
                    一个主进程,多个子进程,多个线程:主进程生成N个子进程,子进程生成M个线程,每个线程响应一个请求;并发为响应数为:N*M;当一个线程受影响时,该子进程的所有线程都会受影响;
                event:事件驱动模型;
                    一个主进程,多个子进程,多个线程:主进程生成多个子进程,子进程生成固定的线程;其中线程分为监听线程和服务线程:监听线程负责监听请求,当请求到达时将请求交给服务线程来处理,然后继续监听;
                借鉴网址:https://www.aliyun.com/jiaocheng/120245.html    (深)推荐
                            http://blog.51cto.com/ghbsunny/1970523    (浅)
        并发服务器响应请求:
            单进程I/O模型:
            多进程I/O模型:
            复用的I/O模型:
                多线程模型:
                事件驱动模型:
            复用的多进程I/O模型:
                借鉴网址:https://blog.csdn.net/u011342224/article/details/80240604
        常用版本:
            Centos6:      2.2
            Centos7:  2.4
        使用Centos6的版本来讲解:
            程序环境:
                配置文件:
                    /etc/httpd/conf/httpd.conf
                    /etc/httpd/conf.d/*.conf
                服务脚本:
                    /etc/rc.d/init.d/httpd
                    此脚本的配置文件:
                        /etc/sysconfig/httpd
                主程序文件:三者只能选其一;可以使用上面的/etc/sysconfig/httpd这个文件来切换这模式;
                    /usr/sbin/httpd                  默认的
                    /usr/sbin/httpd.event
                    /usr/sbin/httpd.worker
                日志文件目录:
                    /var/log/httpd/
                        access_log:访问日志;
                        error_log:错误日志;
                站点文档目录:
                    /var/www/html/
                配置文件的组成:主要由三段组成;
                    ### Section 1: Global Environment                        
                    ### Section 2: 'Main' server configuration
                    ### Section 3: Virtual Hosts
                    配置格式:
                        directive value
                            directive:不区分大小写;
                            value:为路径时在Linux中严格区分大小写;
                模块文件路径:
                    /usr/lib64/httpd/modules
            常用配置:
                1.修改监听的IP和PORT;不指定IP则表示监听所有;
                    Listen [IP:] PORT
                        Listen 80
                        Listen 192.168.10.10:80
                        Listen指令可以使用多次;
                    可使用netstat -untlp ;来查看是否已处于监听状态;
                    修改监听端口一般需要重启服务,所以在生产环境中建议事先设定好,避免重启服务;
                2.持久连接;
                    有两种连接模式:短连接和长连接;其中短连接每个资源请求都需要建立三次握手和四次断开,比较消耗资源;长连接就是持久连接:当连接建立以后,可以用来传送多个资源而不用请求每个资源时都建立、拆除连接;但是也不能一直保持着这种连接,这会加剧服务器的负载,所以在传输完成后等待特定的时间后,如果超时还没有请求的话服务器就断开连接;或者通过设置资源请求的数量上限来指定断开连接的阀值;对并发访问量较大的服务器来说,持续连接可能会导致有些请求得不到响应服务,所以当并发很大时 建议关闭持久连接,或者使用较短的等待时间;
                    KeepAlive {off|on}
                    MaxKeepAliveRequests #  :单次连接能够传输的最大传输数量;0表示不限制;
                    KeepAliveTimeout      #  :该次连接在最后一次传输完成后等待延迟的时间数;
                    测试:
                        telnet HOST|IP PORT
                        GET /URL HTTP/VERSION
                        HOST HOSTNAME|IP
                3.MPM,Multipath Process Module:多路处理模块
                    prefore,worker,event
                    http-2.2:不支持同时编译多个模块,编译时只能选择一个;使用RPM安装时提供了三个二进制文件,分别用于实现不同MPM模式的支持;
                    http-2.4:支持同时编译;
                    可以通过ps aux | grep httpd来查看使用的是哪种模型;
                    默认为/usr/sbin/httpd  ==>  prefore
                    也可以通过httpd -h查看帮助来显示:
                        httpd -l;查看正在使用的是编译了哪个模块的httpd;
                        httpd -M:查看已经加载进httpd的静态编译和动态加载的模块;
                    更换httpd程序的模式:
                        编辑/etc/sysconfig/httpd  ==> 取消HTTPD=/usr/sbin/httpd.worker前面的#
                        重启服务即可生效;
                    httpd配置文件使用判断语句来识别加载的是哪种模块,从而启用不同的配置命令:
                        # prefork MPM
                        # StartServers: number of server processes to start
                            服务启动时就启动的服务进程数;此进程指的是能处理请求的主控进程的子进程;
                        # MinSpareServers: minimum number of server processes which are kept spare
                            服务启动后最小的空闲服务进程数;当进程被请求占用时,系统会通过这个设置值来生成新的进程;
                        # MaxSpareServers: maximum number of server processes which are kept spare
                            服务启动后最大的空间服务进程数;当很多的请求被响应完成后就会产生很多空闲进程,这时系统就会通过这个设置值来杀死多余的进程;
                        # ServerLimit: maximum value for MaxClients for the lifetime of the server
                            设置MacClients的最大值;一般二者是相同等的,或者大于MaxClients;最大进程数;
                        # MaxClients: maximum number of server processes allowed to start
                            最大允许多少个客户端来请求访问服务器;
                        # MaxRequestsPerChild: maximum number of requests a server process serves
                            一个服务进程可以响应请求的多大次数;
                        <IfModule prefork.c>
                        StartServers       8
                        MinSpareServers    5
                        MaxSpareServers   20
                        ServerLimit      256
                        MaxClients       256
                        MaxRequestsPerChild  4000
                        </IfModule>
                        
                        # worker MPM
                        # StartServers: initial number of server processes to start
                            服务启动时的初始进程数;
                        # MaxClients: maximum number of simultaneous client connections
                            服务器允许客户端同时连接的最大数;
                        # MinSpareThreads: minimum number of worker threads which are kept spare
                            最少空间线程数;
                        # MaxSpareThreads: maximum number of worker threads which are kept spare
                            最大空间线程数;
                        # ThreadsPerChild: constant number of worker threads in each server process
                            每个进程生成的线程数;
                        # MaxRequestsPerChild: maximum number of requests a server process serves
                            每个线程所能响应的最大请求数量;0表示不限制;
                        <IfModule worker.c>
                        StartServers         4
                        MaxClients         300
                        MinSpareThreads     25
                        MaxSpareThreads     75
                        ThreadsPerChild     25
                        MaxRequestsPerChild  0
                        </IfModule>
                    PV:Page View   
                    UV:User View 独立IP量;   
                        二者可以衡量网站的被访问量;一个PV可能包含多个资源请求,所以不能单纯的使用进程或者线程的响应数量来衡量,应该再除以每个PV中的资源请求数量;如果以天为单位其实服务器每天时是不会满负荷工作的,也就八九个小时;另外还需要考虑你的带宽等参数;
                4.DSO  动态共享对象
                    在配置文件中使用配置指令实现模块加载,配置完成以后可以通过reload来重新读取配置文件来加载模块;
                        LoadModule <mod_name> <mod_path>
                            模块路径可已使用相对路径,相对ServerRoot(/etc/httpd/)而言;
                                /etc/httpd/modules   ---->  /usr/lib64/httpd/modules/
                5.定义"Main Server" 的文档页面路径;我们可以使用虚拟主机功能在一台主机上架设多个网站主页,当我们只架设一个网站的时候我们就称之为"Main";
                    DocumentRoot指向的位置为URL的起始位置;
                    例如:DocumentRoot "/var/www/html/"  ,在/var/www/html/中有个名为hello.txt的文件,切此台主机的主机名为:www.guowei.com;则http://www.guowei.com/hello.txt就表示访问/var/www/html/hello.txt这个文件;
                6.站点访问控制;
                    可基于两种类型的路径指明对哪些资源进行访问控制;
                        文件系统路径:<Directory "DIR_path_name"> </Directory>
                                         <File "FILE_path_name"> </File>
                                         <FileMatch "正则表达式"> </FileMatch>:效率比较低,尽量不用;
                        URL路径:<Location ""> </Location>
                                    …
                    访问控制机制:
                        基于来源地址;
                        基于用户账号;
                7.Directory中基于来源地址实现访问控制
                    Options:用户对此目录中的资源作访问时可以使用的选项;
                        None,All,Indexes,Includes,FollowSymLinks,SymLinksifOwnerMatch,ExecCGI,MultiViews;
                        Indexes:索引,当默认主页面不存在时,就会将目录中的资源路径返回给请求客户端;一般不建议开启,不过在做下载站的时候这个设置就会很有用;虽然配置文件默认启用了这个选项,但是当我们访问时并没有显示DocumentRoot中指定的目录中的资源,而是显示了一个欢迎页面,我们只要将/etc/httpd/conf.d/welcome.conf这个文件重命名或者删除即可;
                        可以通过+|-或者删除来决定某个选项的启用与否;
                        FollowSymLinks:如果在DocumentRoot中指定的目录中有链接至此目录之外的链接文件时,使用这个选项来决定此链接文件是否有效;简单地说就是允许跟踪符号链接;
                    AllowOverride:是否允许配置文件被覆盖;
                        http-2.2支持每目录访问控制,可以通过每个子目录下的.htaccess文件来覆盖配置文件中的设置,来达成每个目录的单独控制;
                    Order:检查次序;
                        Order allow,deny    先allow,默认为deny,类似于白名单;
                        Allow from IP|NerAddr
                        Allow from 192.168.10.1
                        Allow from all
                        Order deny,allow    先deny,默认为allow,类似于黑名单;
                        Allow from IP|NerAddr
                        Deny from 192.168.20.1
                        Deny from all
                8.定义默认主页面;可以有多个,最左面的优先;
                    DirectoryIndex  index.html index1.html ...
                9.日志设定;
                    错误日志:
                        ErrorLog logs/error_log
                        LogLevel warn
                            debug, info, notice, warn, error, crit, alert, emerg.
                    访问日志:
                        CustomLog logs/access_log combined
                        自定义输出格式:有combined,common,referer,agent四种模式;
                            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:Remote logname (from identd, if supplied). -表示为空;
                                %u:用户验证时的用户名;
                                %t:服务器端收到请求的时间;开始提供服务的时间;
                                %r:请求报文的首行信息(method,url,version);
                                %>s:响应状态码信息;
                                %b:响应报文主体部分大小;单位是字节;不包含首部; 
                                %{Referer}i:请求报文中"referer"首部的值;到达此页面的访问入口则为referer;即从哪个页面的超链接跳转而来的;
                                %{User-Agent}i:请求报文中"user-agent"首部的值;即发出请求用到的应用程序;类似浏览器,elinks等;
                                    Note:特殊符号需要转移支付"\";
                            官方文档:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
                10.路径别名;
                    Alias /URL/   "/PATH/TO/SOMEDIR/"      实现的功能就类似于软链接;
                         /URL/:http://www.guowei.com/URL/
                        /PATH/TO/SOMEDIR/ :绝对路径;
                        这两个红色的"/"是共存的,有则全有,无则全无;
                        Alias /data/  "/file/ifconf/"
                            http://www.guowei.com/data/index.html   ==>  /file/ifconf/index.html
                11.设定默认字符集;
                    当我们编写网页时应该注意将网页的编码格式设置成于服务器相同的编码格式,否则会出现乱码,然后返回给客户端;其实客户端也是需要选择编码格式的,否则照样出现乱码;所以我们可以设置服务器支持多种编码格式,也可以让客户端浏览器自动识别编码格式;避免出现乱码;
                    AddDefaultCharset UTF-8
                    GBK GB2312 GB18030
                12.基于用户的访问控制;
                    认证质询:
                        WWW-Authenticate:响应码为401,拒绝客户请求,并说明要求客户端提供账号和密码;
                    认证:
                        Authenticate:客户端用户填入账号和后再次发送求情报文;认证通过,则服务器发送响应的资源;
                        认证类型:
                            basic:明文;这个太不安全了,如果一定要用的话可以使用https来传输;
                            digest:消息摘要,加密;安全,但是有的浏览器不支持,尤其是较老的版本;
                            现在认证一般都是使用表单来认证,不会使用basic;
                    安全域:需要用户认证通过后才能访问的路径;
                    应该通过名称对其进行标识,并用于告知用户需要认证的原因;
                    用户的账号和密码存储于何处;跟系统账号没有关系;
                        虚拟账号:仅用于访问某服务时用到的认证标识;
                        存储方式:
                            文本文件
                            SQL数据库
                            ldap
                        basic认证:
                            定义安全域;
                                <Directory "/PATH/TO/SOMEDIR/"> 
                                    Options None
                                    AllowOverride None
                                    AuthType Basic              认证类型
                                    AuthName "STRING"                 服务器端的提示信息
                                    AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"   认证文件位置
                                    Require user username1 username2 …              被允许的用户
                                </Directory>
                                允许认证文件中的所有用户:Require valid-user
                            提供账号和密码的存储方式;
                                使用htpasswd命令进行创建和管理账号与密码;
                                htpasswd OPTIONS passwdfile username
                                -c:创建密码文件,如果已经有此文件则会覆盖;所以一般只有第一次创建时使用;
                                -m:使用md5加密密码;
                                -s:使用sha1加密密码;
                                -D:删除指定用户;
                                例子:htpasswd -c -m /etc/httpd/conf.d/.htpasswd guowei
                            实现基于组进行认证
                                <Directory "">
                                    Options None
                                    AllowOverride None
                                    AuthType Basic
                                    AuthName "STRING"
                                    AuthUserFile "/PATH/TP/HTTPD_GROUP_PASSWD_FILE"
                                    AuthGroupFile "/PATH/TO/HTTPD_GROUP_PASSWD_FILE"
                                    Require group groupname1 groupname2 …
                                </Directory>
                            例子:
                                <Directory "/www/htdoc/aa/">
                                        Options None
                                        AllowOverride None
                                        AuthType Basic
                                        AuthName "Administator"
                                        AuthUserFile "/etc/httpd/conf.d/.htpasswd"
                                        Require user guowei 
                                </Directory>
                            提供用户账号和组文件;
                                组文件:每一行定义一个组
                                    GROUP_NAME:username1 username2 ...
                                        username#需要在用户文件中已存在;
                                    echo "webadmin:guowei tom" >> /etc/httpd/conf.d/.htgroup
                                例子:
                                    <Directory "/www/htdoc/aa/">
                                            Options None
                                            AllowOverride None
                                            AuthType Basic
                                            AuthName "Administator"
                                            AuthUserFile "/etc/httpd/conf.d/.htpasswd"
                                            AuthGroupFile "/etc/httpd/conf.d/.htgroup"
                                            Require group webadmin
                                    </Directory>
                13.虚拟主机
                    web可以实现一个主机提供一个站点,也可以实现一个主机提供多个站点;
                    通过虚拟主机,我们访问一个资源(http://www.guowei.com:80/data/index.html)时可以通过主机名|IP地址|端口号来区分不同的访问方式或者路径;
                    也就是可以通过一台主机的多个ip地址(每个虚拟主机一个IP地址)来访问;
                    也可以通过一个主机上的多个主机名(每个虚拟主机一个主机名)来访问;
                    还可以通过不同的端口号(每个虚拟主机一个PORT)来访问;(也可混合使用三种方式)
                    但是一般我们都会基于主机名来搭建多个站点,多个IP明显成本比较高,多个PORT就会发生有的端口号为私有端口,不利于别人访问;虽然我们多使用主机名来建立站点,但是我们要知道,当我们在网上真正的访问资源时,是无法通过主机名来访问的,而是经过DNS的转换进而通过IP地址来访问的;但是为什么它就可以访问那?服务器端怎么就可以通过不同的主机名来提供不同的资源那?其实我们在请求资源时已经在首部(首部中HOST这个字段用于标识主机名)附加了主机名在请求报文中了,所以服务器可以识别;
                        Note:一般虚拟主机不可与中心主机混用;注释掉默认的DocumentRoot即可;
                    每个虚拟主机都有专用配置:
                        <VirtualHost "IP:PORT">
                            ServerName                      主机名
                            DocumentRoot ""    设置文件主目录
                        </VirtualHost>
                        安装服务后自带的配置就是一台中心主机,当我们启用虚拟主机后,每一个虚拟主机中都可以看作是中心主机来配置,它们的大多数配置选项是相同的;
                            ServerAlias  虚拟主机别名
                            ErrorLog    错误日志
                            CustomLog     访问日志
                            <Directory ""> </Directory>    做访问控制
                    例子:
                    基于IP地址
                        <VirtualHost 192.168.10.6:80>
                                ServerName web1.guowei.com
                                DocumentRoot "/Virtual/web1/g1"
                        </VirtualHost>
                        <VirtualHost 192.168.80.128:80>
                                ServerName web2.guowei.com
                                DocumentRoot "/Virtual/web2/g2"
                        </VirtualHost>
                    基于PORT
                        <VirtualHost 192.168.10.6:80>
                                ServerName web1.guowei.com
                                DocumentRoot "/Virtual/web1/g1"
                        </VirtualHost>
                        <VirtualHost 192.168.10.6:8080>
                                ServerName web3.guowei.com
                                DocumentRoot "/Virtual/web3/g3"
                        </VirtualHost>
                    基于主机名:http-2.2中需要去掉#NameVirtualHost *:80前面的"#"
                        <VirtualHost 192.168.10.6:80>
                                ServerName web1.guowei.com
                                DocumentRoot "/Virtual/web1/g1"
                                CustomLog logs/web1_access  combined    相对于ServerRoot的路径
                        </VirtualHost>
                        <VirtualHost 192.168.10.6:80>
                                ServerName web3.guowei.com
                                DocumentRoot "/Virtual/web3/g3"
                                CustomLog logs/web3_access combined
                        </VirtualHost>
                14.内置的status页面,web的一个子功能;可以显示一些httpd的状态信息;
                    <Location /server-status>
                        SetHandler server-status
                        Order deny,allow
                        Deny from all
                        Allow from 192.168.10.6 
                    </Location>
                    浏览器端输入:http://web1.guowei.com/server-status
                        Server Version: Apache/2.2.15 (Unix) DAV/2           版本
                        Server Built: Jun 19 2018 15:45:13                             创建时间
                        Current Time: Thursday, 15-Nov-2018 16:42:13 CST   开启服务时间
                        Restart Time: Thursday, 15-Nov-2018 16:41:23 CST    重启时间
                        Parent Server Generation: 4
                        Server uptime: 49 seconds                                                服务已启动多少时间
                        1 requests currently being processed, 7 idle workers
                        
                        _W______........................................................
                        ................................................................
                        ................................................................
                        ................................................................
                        "."的总数为256,是通过MaxClients设置的;每个"."表示一个没有启用的进程;
                        Scoreboard Key:
                        "_" Waiting for Connection(空闲进程), "S" Starting up(启动中的进程), "R" Reading Request(正在接受用户请求),"W" Sending Reply(正在工作的进程), "K" Keepalive (read), "D" DNS Lookup,
                        "C" Closing connection(正在断开连接), "L" Logging(记录日志), "G" Gracefully finishing(优雅终止),"I" Idle cleanup of worker(清理空闲的进程), "." Open slot with no current process
                        
                        PID Key:(自左而右的显示上面的进程状态的进程号)
                           8081 in state: _ ,   8082 in state: W ,   8083 in state: _ 
                           8084 in state: _ ,   8085 in state: _ ,   8086 in state: _ 
                           8087 in state: _ ,   8088 in state: _ ,
                        To obtain a full report with current status information you need to use the ExtendedStatus On directive.(如果想要更详细的信息可以启动配置文件中的ExtendedStatus)
                        Note:这个页面的信息太多了,所以我们一般不建议公开出去,所以我们可以做基于用户账号的访问控制;
                            首先创建一个server-status目录:
                                mkdir /Virtual/web1/server-status/
                            在配置文件中添加:
                                <VirtualHost 192.168.10.6:80>
                                        ServerName web1.guowei.com
                                        DocumentRoot "/Virtual/web1/"
                                        CustomLog logs /web1_access  combined
                                        <Directory  "/Virtual/web1/server-status/">
                                                SetHandLer server-status
                                                Options None
                                                AllowOverride None
                                                Authtype Basic
                                                AuthName "status"
                                                AuthUserFile "/etc/httpd/conf.d/.htpasswd"     此步前面有过程;
                                                Require user guowei
                                        </Directory>
                                </VirtualHost>
                            在浏览器输入栏键入:http://web1.guowei.com/server-status
                            Note:默认的<Location /server-status>  </Location>无需启动;
                            借鉴文章:http://blog.51cto.com/9164364/1538240
                        
            URL:Uniform Resource Locator
                URL方案:scheme  例如:http:// https://
                服务器地址:IP:PORT 
                资源路径
                例子:http://www.guowei.com/data/index.html
                    有的时候我们不输入index.html也会返回给我们这个默认主页信息;不输入时我们称那个路径为基名;
                基本语法:
                    <scheme>://<user>:<passwd>@<host>:<port>/<paht>;<parmas>?<query>#<frag>
                        params:参数
                        例子:http://www.guowei.com/bbs/index.html;gender=f:即为一个参数
                        query:向数据库发起查询工作;
                        例子:http://www.guowei.com/data/play.hph?username=guowei&title=hello
                        frag:锚点
                        实现负载均衡时可以根据这三个选项来控制;
                相对URL:不完整的相对于当前路径来获取下一个资源;同站引用;
                绝对URL:完整的绝对地址;跨站引用;
    http:stateless,无状态的;
        服务器无法追踪客户端来源;也就是服务器无法识别某个客户端的连续的请求都是来源于同一个客户端;但是我们使用的时候是具有类似功能的,否则我们访问需要登录用户名和密码的网址时,每次刷新可能都会要求我们输入,这是很烦人的,所以我们通过cookie来解决这个问题;
        cookie:当客户端访问服务器时,服务器会返回给客户端一些数据,它可以唯一标识这个客户端,也就是cookie,然后客户端会保存它;当客户端再次访问服务器时,会将适用于这个服务器的cookie发送给服务器,类似于皇上给某个大臣特賜的令牌,以后大臣有事可以凭借这个令牌来面见这个皇上(见别的可就出事了!会被赐死的),比如在七国时期,这个大臣可能是个多面间谍,背地里给多个皇上效命(其实都是为了自己),每个皇上都会赐他金牌,当他要见某个皇上时(上报信息或者索要经费时)他就应该小心翼翼的准备好相对应的令牌,否则弄错了就玩完了;所以即使http协议是无状态的,服务器也知道这个客户端曾经登陆过;但是这也是伴随着风险的,比如,你登录的是一个银行站点,当你登陆以后做完操作退出走人了,但是有其他人也来登录这个银行站点,他就以你的信息再次登录,这回对你的财产造成损失的,暴露你的信息;所以一些安全性较高的站点,当你关闭浏览器的时候回自动删除关于它的cookie;
        类型:
            胖cookie:包含的信息较多;相对来说更容易泄露用户信息;
            瘦cookie:包含的信息较少;
        session:服务器为每一个客户端浏览器进程专门维护的一个卫校数据结构,记录了用户在服务器上的访问行为,session会与cookie相关联;用来追踪标识唯一的客户端;
    http事务:一次请求对应一个响应就叫做一个事务;
        请求:request
        响应:response
        报文语法格式:
            request报文:
                <method> <request-URL> <version>             起始行
                <heaaders>                                                         头
                
                
                <entity-body>                                                     主体
            response报文:
                <version> <status> <reason-phrase>             起始行
                <hearders>                                                          头
                
                
                <entity-body>                                                     主体
            
            method(方法):请求方法,客户端希望服务器对资源执行的动作;
                GET:从服务器获取资源;通常entity-body为空;
                POST;向服务器发送服务器要处理的数据;一般会包含附加数据,即entity-body不为空;
                    比如我们浏览某个网站注册或登录时,就需要提交用户名和密码等操作;
                DELETE:请求删除服务器上的指定文档;
                PUT:向服务器上传一些数据;即entity-body中的数据;
                HEAD:只从服务器获取文档的响应首部;
                TRACE:追踪请求到达服务器期间经过的代理服务器;
                OPTIONS:请求服务器返回对某个资源支持使用的请求方法(也就是上面的那几个方法:GET,POST等);像DELETE和PUT这种比较危险的方法一般服务器不会允许;
                协议查看或分析工具:tcpdump,tshark,wireshark等;
            version:HTTP/<major>,<minor>
            status(状态码):响应状态码;用来描述请求处理过程中所发生的的情况;也就是服务器端用来告诉客户端,你的请求是成功了还是失败了,还是有其他情况;三位数字组成;
                1xx:100-101,信息提示;
                2xx:200-206,成功类的信息;
                    200:成功,请求的所有数据已经通过响应报文的entity-body部分发送;OK
                3xx:300-305,重定向类的信息;
                    301:请求的URL所指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置,这属于永久重定向;Moved permanently
                    302:与301相似,但在响应报文中通过Location首部指明了资源现在所处的临时新位置;临时从定向;Found
                    304:客户端发出了条件式请求;其实我们客户端请求得到资源以会在本地缓存,然后客户端在请求服务端时会询问服务器在某个时间点之后某个资源是否发生变化,如果变化服务器会响应已发生变化并且返回新的资源;如未变化则告诉客户端未变化,不会再次发送此资源,可以使用本地缓存的资源;Not Modified
                    401:客户端请求访问的资源的存在,但是需要输入账号和密码,所以会先返回这个错误给客户端,让其输入账号和密码;Unauthorized
                    403:请求被禁止;Forbidden
                    404:服务器无法找到客户端请求的资源;Not Found
                    500:服务器内部错误;Internal Server Error
                    502:代理服务器从后端服务器收到了一条伪响应;Bad Gateway
                        我们再网上请求数据时,多数情况下可能请求的不是原始服务器,而是代理服务器,它有点类似DNS,当直接代理服务器没有请求的资源时,代理服务器会向其上级请求这个资源,直到找到资源或发生错误,TRACE方法就可以追踪这个过程;502就是上级代理给下级返回一个错误,代理再返回给客户端时,返回的错误就是Bad Gateway;
                4xx:400-415,客户端发生的错误类的信息;
                5xx:500-505,服务器端发生的错误类的信息;
                    Note:方法是客户端告诉服务器应该做什么,状态码是服务器告诉客户端发生了什么;
            reason-phrase:用来简要描述status所表示的信息;
            headers:用来表示请求或响应报文的属性的;可包含任意个首部;
                格式:有多个时,一般每行写一个;
                    Name: Value
                    …
                分类:
                    通用首部
                        Date:报文的创建时间;
                        Connection:连接状态;如keep-alive,close
                        Via:显示报文经过的中间节点;经过的代理节点;
                        Cache-Control:控制缓存;
                    请求首部
                        Accept:通知服务器自己可以接收的媒体类型;
                        Accept-Charset:允许接受的字符集;
                        Accept-Encoding:接受的编码格式,如gzip,sdch等
                        Accept-Language:接受语言;
                        Client-IP:客户端的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-Ranges:服务器可接受的请求范围类型;
                            Vary:服务器查看的其他首部列表;
                        安全响应首部:
                            Set-Cookie:向客户端设置cookie
                            Set-Cookie2:
                            WWW-Authenticate:来自服务器的对客户端的质询认证列表;当客户端请求某个资源时,但是需要认证,就会发送这个首部;
                    实体首部:用来表示主体的信息的;
                        Allow:列出对此实体可使用的请求方法;
                        Location:告诉客户端真正的实体位于何处;
                        Content-Encoding:内容的编码格式;
                        Content-Language:内容使用的语言;
                        Content-Length:主体的长度;
                        Content-Type:主体的对象类型;MIME类型;
                        缓存相关的首部:
                            ETag:实体的扩展标签;
                            Expires:实体过期时间;
                            Last-Modified:最后一次修改的时间;
                    扩展首部:非标准的;
            entity-body:数据的主体部分,也就是请求或响应时附加的数据;可以为空;
            
    http工具:
        1.curl命令:curl命令是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,HTTP,HTTPS,GOPHER,TLNET,DICT,FILE及LDAP等协议。curl支持https认证,并且支持http的POST,PUT等方法以及支持FTP上传,kerberos认证,HTTP上传,代理服务器,cookie,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道,(proxy tunneling),甚至他还基于ipv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能超级强大!
            用法:
                curl [options] [URL...]
            常用选项:
                -A|--user-agent <string> 设置用户代理发送给服务器,可以实现伪装成某个浏览器类型;
                    curl -A 'chrome' web3.guowei.com 
                -basic:使用HTTP基本认证;
                --tcp-nodelay:使用TCP-NODELAY选项;
                -e|--referer <URL> 来源网址;
                --cacert <file> CA证书(SSL);
                --compressed 要求返回的是压缩的格式;
                -H|--header <line> 自定义头信息传递给服务器;
                -I|--head 只显示响应报文首部信息;
                    curl -I web3.guowei.com
                        HTTP/1.1 200 OK
                        Date: Sun, 18 Nov 2018 08:34:06 GMT
                        Server: Apache/2.2.15 (CentOS)
                        Last-Modified: Thu, 15 Nov 2018 07:42:38 GMT
                        ETag: "7f448-b-57aaf31e7e5e6"
                        Accept-Ranges: bytes
                        Content-Length: 11
                        Connection: close
                        Content-Type: text/html; charset=UTF-8
                --limit-rate <rate> 设置传输速度;
                -u|--user <user[:password]> 设置服务器的用户和密码;
                -0|--http1.0 使用HTTP 1.0
        2.elinks
            格式:
                elinks [options] URL 
                    -dump Print formatted versions of given URLs to stdout
        3.使用mod_deflate模块压缩页面 优化传输速度;
            适用场景:
                节约带宽,额外消耗CPU时间,有些较老的浏览器不支持;
                压缩适于压缩的资源,例如文本文件;
            SetOutputFilter  DEFLATE
            输出过滤器     作为web服务器,读入客户端请求叫输入,响应给客户端叫输出;所以输出过滤器的作用是,对某些符合我们要求的类型的资源作输出过滤;
            #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 text/css
            ......
            通过DEFLATE这个过滤器,挑选出符合条件的MIME类型进行压缩,然后发送给客户端;
            #Level of compression (Highest 9 - Lowest 1)
            DeflateCompressionLevel 9          压缩级别为9
            #Netscape 4.x has some problems
            BrowserMatch ^Mozilla/4 gzip-only-text/html 
                匹配浏览器类型为Mozilla/4的进行gzip压缩,且仅压缩text/html这种类型;
            #Netscape 4.06-4.08 has some problems
            BrowserMatch ^Mozilla/4\.0[678] no-gzip   
                匹配浏览器类型为Mozilla/4.06-4.08的不进行gzip压缩;
            #MSIE masquerades as Netscape ,but it is fine
            BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
    https:http over ssl = https 443/tcp
                ssl: v3
                tls: v1  广泛使用的;
        格式:https://URL
        先建立tcp连接,再建立ssl连接;断开连接时先断开ssl连接,再断开tcp连接;
        ssl会话的简化过程:
            1.客户端发送可供选择的加密方式,并向服务器请求证书;
            2.服务器端发送证书以及选定的加密方式给客户端;
            3.客户端取得证书并进行证书验证;
                如果信任给其发证书的CA:
                    1)验证证书来源的合法性;用CA的公钥解密证书上的数字签名;
                    2)验证证书的内容完整性;完整性验证;
                    3)验证证书的有效期限;
                    4)验证证书是否被吊销;
                    5)证书中拥有者的名字,与访问的目标主机要一致;
            4.客户端生成临时会话秘钥(对称秘钥),并使用服务器端的公钥加密此数据(对称秘钥)发送给服务器,完成秘钥交换;
            5.服务器使用此秘钥加密客户端请求的资源并且响应给客户端;
                Note:SSL会话是基于IP地址创建的,所以单IP的主机上,仅可以使用一个https虚拟主机;
        配置httpd支持https:
            1.为服务器申请数字证书;
                测试:通过私建CA发证书;
                    1)创建私有CA;
                    2)在服务器创建证书签署请求;
                    3)CA签证;
            2.配置httpd支持ssl,以及使用的证书;
                yum install mod_ssl -y
                配置文件:/etc/httpd/conf.d/ssl.conf
                    DocumentRoot
                    ServerName
                    SSLCertificateFile
                    SSLCertificateKeyfile
            3.测试基于https访问相应主机;
                openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
        
    httpd自带的工具程序
        htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具;
        apachectl:httpd自带的服务控制脚本,支持start、stop、restart等;
        apxs:由httpd-devel包提供,扩展httpd使用第三方模块时使用的工具;
        rotatelogs:日志滚动工具;
            access.log -->
            access.log,access.log1
            access.log,access.log1,access.log2
                .log的内容给.log1,.log1的内容给.log2
        suexec:访问某些有特殊权限配置的资料时,临时切换到指定用户运行;一般只有管理员有权限这样做;
    httpd压力测试工具:
        ab,apache benchmark
            ab [OPTIONS] URL
                -n:总的请求数;
                -c:模拟的并发数;即同时有多少请求到来;
                -k:以持久连接模式测试;
        webbench
        http_load
        
        jmeter
        loadrunner
        
        tcpcopy
        
        命令:ulimit  -n # :调整当前用户可同时打开的文件数;一般操作系统都会对用户做限制,已达到让所有用户都可以使用计算机资源,当我们做测试时,一般都会超出这个数值,所以需要调整一下;
    httpd2-4(Centos7):
        新特性(相较于2.2):
            1.MPM支持运行DSO机制;
            2.支持event MPM;
            3.支持异步读写;
            4.支持每模块及每目录分别使用各自的日志级别;
            5.每请求配置;<If>
            6.增强版的表达式分析器;
            7.支持毫秒级的KeepAlive timeout;
            8.基于FQDN的虚拟主机不再需要NameVirtualHost指令;
            9.支持用户自定义变量;
        新模块:
            1.mod_proxy_fcgi
            2.mod_ratelimit
            3.mod_remoteip
        修改了一些配置机制:
            不再支持使用Order,Deny,Allow来做基于IP的访问控制;而是使用Require;
    编译安装httpd2-4:
        当使用Centos6时,已经使用2-2不建议直接升级为2-4,更建议编译安装2-4,以为系统可能有其他的程序依赖于httpd2-2;
        httpd依赖于apr-1.4+,apr-util-1.4+,[arp-icon]
            arp:apache portable runtime
        Centos6里面默认安装的是apr-1.3.9,apr-until-1.3.9;
        编译安装过程:
            1.首先安装开发环境以及pcre-devel
            2.安装1.4+的apr,apr-util:
                apr:
                    ./configure --prefix=/usr/local/apr
                    make & make install
                apr-util:
                    ./configure --prefix=/usr/local/apr-util --with=/usr/local/apr
                    make & make install
            3.编译前工作:
                groupadd -r apache
                useradd -r -g apache apache
                ./configure 
                --prefix=/usr/local/apache       指定安装路径,卸载时直接删除此目录即可;
                --sysconfig=/etc/httpd24         指定配置文件路径;
                --enable-so                      支持动态模块加载机制;
                --enable-ssl                     支持ssl;
                --enable-cgi                     支持cgi;
                --enable-rewrite                 支持URL重写;
                --with-zlib                      支持压缩算法;
                --with-pcre                      支持扩展正则表达式;
                --with-apr=/usr/local/apr        指明依赖的apr路径;
                --whit-apr-util=/usr/local/apr-util/    指明依赖的apr-util路径;
                --enable-modules=most            指定编译的模块;most:常用的模块;all:所有模块;
                --enable-mpms-shared=all         支持MPM的共享模块编译机制;
                --with-mpm=prefork               指定默认的MPM机制;
                更详细的信息请查看./configure -h
                make & make install
            Note:编译安装之后将二进制文件路径加入环境变量
                vim /etc/profile.d/httpd.sh      
                    键入:export PATH=/usr/local/apache/bin:$PATH
            4.启动服务:apathectl
        配置文件:
            主配置文件:/etc/httpd/conf/httpd.conf
            模块配置文件:/etc/httpd/conf.modules.d/*.conf
            辅助配置文件:/etc/httpd/conf.d/*.conf
            服务控制:systemctl {start|stop|restart} httpd.service
            MPM以DSO机制提供,通过修改配置文件:/etc/httpd/cong.modules.conf/00-mpm.conf
        基于IP的访问控制法则:
            允许所有主机访问:Require all granted
            禁止所有主机访问:Require all deny
            控制特定IP访问:
                Require ip IPADDR:授权指定来源地址的主机访问;
                Require not ip IPADDR:拒绝指定来源地址的主机访问;
                    IPADDR:
                        IP:192.168.10.6
                        Network/Mask:192.168.10.0/255.255.255.0
                        Network/Length:192.168.10.0/24
                        Net:192.168.10
            控制特定主机(HOSTNAME)访问:
                Require host HOSTNAME
                Require not host HOSTNAME
                    HOSTNAME:
                        FQDN:特定主机;
                        DOMAIN:指定域内的所有主机;
            使用方法:
                <RequireAll>
                    Require all granted
                    Require not ip 192.168.10.6
                    …
                </RequireAll>
        虚拟主机:
            基于IP、PORT及FQDN都支持;
            基于FQDN的不再需要NameVirtualHost指令;
        ssl
            启用模块:LoadModule ssl_module modules/mod_ssl.so
        
        Centos6 编译安装之后修改服务脚本:使用service启动服务;
            cd /etc/init.d/
            cp httpd httpf24
            vim http24
                apachectl=/usr/local/apache/bin/apachectl
                httpd=/usr/local/apache/bin/httpd
                prog=httpd
                pidfile=${PIDFILE-/var/run/httpd/httpd24.pid}
            chkconfig --add httpd24
            chkconfig --list httpd24
            chkconfig httpd24 on
            service httpd start

注:根据马哥视频做的学习笔记,如有错误欢迎指正;侵删;

转载于:https://www.cnblogs.com/guowei-Linux/p/11072881.html

Linux服务 httpd相关推荐

  1. Docker安装Apache与运行简单的web服务——httpd helloworld

    Docker运行简单的web服务--httpd helloworld目录[阅读时间:约5分钟] 一.Docker简介 二.Docker的安装与配置[CentOS环境] 三.Docker运行简单的web ...

  2. linux中安装httpd安装错误,linux安装httpd和nginx常见问题及解决办法

    1 httpd-2.4.23.tar.gz安装 安装httpd之前,需要安装:gcc.apr.apr-util.pcre.zlib. 文件参考:D:\01soft\02测试\02悬镜管家\web服务\ ...

  3. 设置linux服务,Linux服务的seLinux设置

    下面是一些 收集来的 Linux服务的seLinux设置 命令 ===ftp===//If you want to share files anonymously chcon -R -t public ...

  4. linux mrtg 命令,linux服务器之流量监控(MRTG)

    本系列文章原则:灰常详细,灰常简单,新手包学包会! 因其简单,故未涉及安全性方面的考虑呵! 本实验服务器为rhel-5-server-i386,客户端为windows xp.本实验所用软件包均在rhe ...

  5. Linux服务与chkconfig

    chkconfig使用说明 chkconfig是管理系统服务(service)的命令行工具.所谓系统服务(service),就是随系统启动而启动,随系统关闭而关闭的程序. chkconfig可以更新( ...

  6. Linux服务 Nginx(一)

    Linux服务 Nginx(一)     Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发 ...

  7. Linux 安装httpd(apache)超详细教程

    Linux 安装httpd(apache)超详细教程 1.什么是apache 2.apache的作用 3.实验所需要的环境 4.实验步骤 (yum安装,编译安装) 什么是apache: Apache是 ...

  8. linux 查看目录拓扑图,Linux服务篇之九:构建Cacti监控平台

    Linux服务篇之九:构建Cacti监控平台 作为一名Linux SA,日常最重要的就是保证网站正常稳定的运行,我们需要实时监控网站.服务器的运行状态,这时需要借助开源软件(cacti.nagios. ...

  9. linux服务关闭自启动

    众所周知,linux服务是由/lib/systemd/system/的service服务控制启动的 那便可以用脚本控制service服务,让他关闭了就再次启动 脚本如下 代码直接用直接脚本做简单修正 ...

最新文章

  1. java 导出文件,导出多个文件方案~
  2. [Xcode 实际操作]七、文件与数据-(2)创建文件夹
  3. 基于 RocketMQ 的基金数字化陪伴体系的架构实践
  4. Windows 10安装pip方法
  5. 浙江电信网上营业厅的一个BUG(有更新)
  6. DHCP配置实验(包括接口模式、全局模式和中继模式)
  7. USB (二)硬件概念 以 STM32F4为例
  8. 两个月攻克系统集成项目管理工程师
  9. 计算机总是提醒更新,联想电脑老提示更新怎么办啊
  10. 再放宽!这些应届生,可直接落户上海
  11. 心路历程 致正在为梦想奋斗的自己
  12. 学习记录583@IDEA导入子模块
  13. win10禁用全角,教你恢复win10系统屏蔽全角/半角快捷键的办法
  14. errorcode 微信分享_微信公众号网页授权code问题
  15. Bank相关1_数据移行
  16. html格式化整理输出JSON示例(测试)
  17. 工业机器人与计算机控制,不懂工业机器人控制技术?那你一定是没看过这篇文章...
  18. 计算机考研怎么给老师发邮件,考研复试前,手把手教你怎么给导师发邮件!4点要注意...
  19. python学习(14)—— 函数、模块和包
  20. 上海市高校计算机等级(一级)考试成绩查询,上海市高校计算机等级考试(一级).doc...

热门文章

  1. 美国南加大工程学院计算机,美国南加州大学工程学院排名是多少?
  2. 未来计算机游戏,未来可追 ROG光刃G15游戏电脑首发登场
  3. 英辞流——坚若金刚与穿行无碍:物质的三态
  4. 开源规模化算法生产平台YMIR的保姆级上手教程
  5. Java基础(以及面试常问问题)
  6. 关于文章撰写的要求和规范
  7. python spss,有没有一个Python模块打开SPSS文件?
  8. 写了那么多Android布局,你知道elevation属性吗
  9. Java五子棋Ai-权值法
  10. 心理专家浅谈舍弃不必要的虚荣!