漫谈HTTP(上)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了漫谈HTTP(上)相关的知识,希望对你有一定的参考价值。


HTTP协议:

  超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收html页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。


HTTP是一个应用层协议,有请求和响应构成,是一个标准的客户端服务器模型。具有以下特点:

  1. 支持客户/服务器模式

  2. 简单快速:

      客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型的不同。由于HTTP协议简单,是的HTTP服务器的程序规模小,因而通信速度很快

  3. 灵活:

      HTTP允许传输任意类型的数据对象。正在传输的类型有Content-Type加以标记。

  4. 无连接:

      无连接的含义是限制每次链接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。

  5. 无状态:

       HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前的信息时,它的应答就较快。


HTTP版本:

  http/0.9:作为HTTP协议的第一个版本。是非常弱的,只定义了最基本的简单请求和简单回答。

      http/1.0:新增了cache, MIME{MIME: multipurpose internet mail extensions(多用途的网际邮件扩充协议)}机制,用非持久连接,即在非持久连接下,一个tcp连接只传输一个Web对象       

      http/1.1:新增了缓存功能,条件式请求;

    speedy协议: SPDY是Google开发的基于TCP的应用层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。SPDY并不是一种用于替代HTTP的协议,而是对HTTP协议的增强。新协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。谷歌表示,引入SPDY协议后,在实验室测试中页面加载速度比原先快64%。

      http/2.0:在开放互联网上HTTP 2.0将只用于https://网址,而 http://网址将继续使用HTTP/1,目的是在开放互联网上增加使用加密技术,以提供强有力的保护去遏制主动攻击。DANE RFC6698允许域名管理员不通过第三方CA自行发行证书。


HTTP协议HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们现在常用的HTTPS,如下图所示:

技术分享


http协议的实现:

    开源实现:httpd(apache), nginx, lighttpd, ...


       C/S:

        C(客户端): browser(浏览器), user agent(用户代理),

            chrome, ie, firefox, safari, opera, ...

            elinks, curl, wget, ...

        S(服务器端):httpd(apache), nginx, lighttpd, ...

通信模型:

        请求/响应

技术分享


一次完整的Http请求处理过程:

一次HTTP操作称为一个事务,其工作过程可分为七步

    (1) 建立或处理连接请求 :接受或拒绝请求

    (2) 接收请求:接受来自于网络的请求报文中对某资源的一次请求的过程;接收请求的方式通常是并发访问响应模型(WEB I/O)

    (3) 解析请求,处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息

    (4) 加载用户请求的资源;

    (5) 构建响应报文,根据用户请求的资源MIME类型以及URL重定向进行报文响应;

    (6) 发送响应报文;

    (7) 记录访问于日志中;


web资源:

  URL:统一资源定位符(Uniform Resource Locator);是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

  URI:统一资源标识符(Uniform Resource Identifier);是一类更通用的资源标识符,URL 实际上是它的一个子集。URI 是一个通用的概念,由两个主要的子集URL 和URN(统一资源名称 (Uniform Resource Name, URN)) 构成,URL 是通过描述资源的位置来标识资源的,而URN则是通过名字来识别资源的,与它们当前所处位置无关。


URL格式:

比如说,你想要获取URL http://www.xxxx.com/index-fall.html。

URL 分以下三部分。

 URL 的第一部分(http)是 URL 方案(scheme)。方案可以告知 Web 客户端怎样访问资源。在这个例子中,URL 说明要使用HTTP 协议。

 URL 的第二部分(www.xxxx.com)指的是服务器的位置。这部分告知Web 客户端资源位于何处。

 URL 的第三部分(/index-fall.html)是资源路径。路径说明了请求的是服务器上哪个特定的本地资源。




HTTP请求(HTTP Request)

  所谓的HTTP请求,也就是Web客户端向Web服务器发送信息,这个信息由如下三部分组成:

    1.请求行

    2.HTTP头

    3.内容

 请求行写法是固定的,由三部分组成,第一部分是请求方法,第二部分是请求网址,第三部分是HTTP版本。 如: GET www.xxxx.com HTTP/1.1


请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:

    Method Request-URI HTTP-Version CRLF  

其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。


<method>(资源传递方法):GET,HEAD,POST, PUT, DELETE, OPTIONS, TRACE, ...

    GET:从服务器获取一个资源;

HEAD:只从服务器获取文档的响应首部;

POST:向服务器发送要处理的数据;

PUT:将请求的主体部分存储在服务器上;

DELETE:请求删除服务器上指定的文档;

TRACE:追踪请求到达服务器中间经过的代理服务器;

OPTIONS: 请求服务器返回对指定资源支持使用的请求方法;

访问资源:获取请求报文中请求的资源



HTTP响应(HTTP Response)

    当Web服务器收到HTTP请求后,会根据请求的信息做某些处理(这些处理可能仅仅是静态的返回页,或是包含Asp.net,php,Jsp等语言进行处理后返回),相应的返回一个HTTP响应。HTTP响应在结构上很类似于HTTP请求,也是由三部分组成,分别为:

    1.状态行

    2.HTTP头

    3.响应正文

 首先来看状态行,一个典型的HTTP状态如下:  HTTP/1.1 200 OK

   状态行格式如下:

    HTTP-Version Status-Code Reason-Phrase CRLF

  其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx: 信息提示

  •             2xx: 成功响应

        200:成功,请求的所有数据通过响应报文的entity-body部分发送;ok

  •             3xx: 重定向响应

        301:请求的URL执行的资源已经被删除,但在响应报文中通过首部location指明了资源现在所在的新位置:Moved Permanently

        302:与301相似,但在响应报文中通过location指明资源现在所在的临时新位置:Found

        304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应状态码通知客户端:Not Modified

  •             4xx: 客户端错误

        401: 需要输入账号和密码认证方能访问资源

        403:请求被禁止:Forbidden

        404: 服务器无法找到客户端请求的资源 : Not Found

  •             5xx: 服务端错误

         500:服务器内部错误 : Internal Server Error

         502:代理服务器从后端服务器收到一条伪响应 : Bad Gateway



事务:request/response

  request

        <method> <url> <version>

        HEADERS

    <body>

     reponse

     <version> <status> <reason-phrase>

     HEADERS

     </body>


    headers:

     Name: Value1, value2, ...

     Name: Value1, value2, ...

     ......


首部分类:

    通用首部、请求首部、响应首部、实体首部、扩展首部


  

  通用首部:

     Connection: {close|keep-alive}

     Date:报文创建的日期时间

     Via:经由,

     Cache-Control:缓存控制;

     Pragma:


  

  请求首部:

     Host:

     Referer:跳转至当前页面的上级资源;

     User-Agent:用户代理;

     Client-IP:


    Accept:可接收的MIME类型;

     Accept-Language:

     Accept-Encoding:gzip, defalte,

     Accept-Charset:

     ...


  响应首部:

     信息性首部:

          Server:

    

     协商类首部:

         Accept-Range:服务器端可接受的请求类型范围

         Vary:其它首部列表

    

     安全相关的首部:

         WWW-Authenticate:认证质询

         Set-Cookie:

         Set-Cookie2:

  实体首部

     Content-Encoding

     Content-Language

     Content-Lenth

     Content-Location

     Content-Type

     ...

    

     Allow:允许使用的请求方法;

     Location:

    

     缓存相关:

         Etag:扩展标签

         Last-Modified:

         Expires:


  扩展首部:

     X-Forwarded-For

     ……

    

     url:Uniform Resource Locator

     scheme://host:port/path

    

     完整格式:

     scheme://[<user>[:<password>]@<host>[:<port>]/<path>;<params>?<query>#frag

         params:参数, ;param1=value1&param2=value2

         query:查询字符串, ?field1=value1&field2=value2

         frag:页面锚定,#frag_id, 例如#ch1



httpd:

    httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。


httpd所具有的特性

 高度模块化设计:core  modules + standard modules  + 3rd party modules

 动态链接库DSO: Dynamic Shared Object(动态共享对象)

 多处理模块MPM: multipath process modules (多道处理模块

    prefork:process(进程)多进程模型

        每进程响应一个请求; 一个主进程负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个;

    worker: thread(线程)多线程模型

        每线程响应一个请求;一个主进程生成多个子进程,每个子进程负责生成多个线程,每个线程处理一个请求;如果有M个进程,每个进程有N个线程,则可处理的请求个数为:M*N

    event: thread(线程)时间驱动模型

        每进程响应N请求;一个主进程,生成M个子进程,每个进程直接负责N个请求;可处理的请求个数为:M*N   (注:在httpd-2.2版本中event为测试使用,在httpd-2.4中event可生产使用。)

  


http的功能特性:    

  1. CGI:Common Gateway Interface,通用网关接口;

  2. 虚拟主机:基于IP,PORT,FQDN的虚拟主机。

  3. 反向代理:http, fcgi, wsgi, ajp, ...

  4. 负载均衡;

  5. 路径别名;

  6. 丰富的用户认证机制:如basic和digest;

  7. 支持第三方模块;

 

httpd的安装:

    httpd的安装和其他软件安装的方式一样,我们可以通过rpm包或源码编译的方式进行安装,rpm包的方式可以通过便捷的yum命令进行安装,“yum -y install httpd”即可,通过rpm包安装的httpd其默认工作目录(根目录):/etc/httpd,其中:


程序环境:

  • 主程序文件:

    /usr/sbin/httpd

  •             模块文件:

    /usr/lib64/httpd/modules/*.so

  •             主配置文件:

    /etc/httpd/conf/httpd.conf

    /etc/httpd/conf.d/*.conf

    /etc/httpd/conf.modules.d/*.conf

  •             站点文档路径:

    /var/www/html

  • 日志文件路径:

/var/log/httpd/

    access_log:访问日志

    error_log:错误日志

    Unit File:

    usr/lib/systemd/system/httpd.service

  •             自带脚本:

        /usr/sbin/apachectl


配置文件当中的语法格式:

DIRECTIVE  VALUE

 指令    值

    DIRECTIVE: 不区分字符大小写;例如ServerRoot;

    VALUE:除了文件系统路径,大多数也不区分字符大小写;


配置修改完成后:

    (1) 测试语法;

    (2) 让服务程序重载配置文件:

    centos6 ~]# service httpd reload

    centos7 ~]# systemctl  reload  httpd.service


CentOS7相关命令:

启动服务(等同于service httpd start)

systemctl start httpd.service

停止服务(等同于service httpd stop)

systemctl stop httpd.service

重启服务(等同于service httpd restart)

systemctl restart httpd.service

查看服务是否运行(等同于service httpd status)

systemctl status httpd.service

开机自启动服务(等同于chkconfig httpd on)

systemctl enable httpd.service

开机时禁用服务(等同于chkconfig httpd on)

systemctl disable httpd.service

查看服务是否开机启动 (等同于chkconfig --list)

systemctl list-units --type=service


httpd-2.4的基本配置:

httpd配置文件httpd.conf中相关的内容及相关说明

1、监听的地址和端口:

        Listen [ip:]port

        ①IP省略时表示监听本机上所有可用的IP地址;   

    ②Listen可重复使用多数;默认监听本地可用的所有地址;

        例:    Listen 172.16.100.11:80

             Listen 172.16.100.11:8080


2、保持连接:

persistent connection:tcp连接建立后,资源获取完成之后不会断开连接,而是继续等待请求其它资源;服务模式是保持连链接的,如何断开?可以从数量和时间连个方面去限制。


定义开关   KeepAlive  On|Off

数量限制  MaxKeepAliveRequests 100

时间限制  KeepAliveTimeout 10


3、MPM:多路处理模块

    并发请求响应的不同实现,有三种模式(prefork,worker,event)前文已经提到过。

   httpd-2.2不支持同时编译多个不同的MPM,rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持。确认方法:ps aux| grep httpd 默认为/usr/sbin/httpd,其为prefork;

 

查看模块列表:

    httpd -l:查看静态编译的模块

    httpd -M:查看所有模块,包块静态编译和DSO模块

    httpd -t -D DUMP_MODULES :显示所有加载模块,同于-M。

更换支持不同的MPM的主程序:

    编辑 /etc/sysconfig/httpd

    启动变量:HTTPD


4、DSO:配置指令模块加载

格式:LoadModule <mod_name> <modules/mod_file_name> 



模块路径可使用相对路径:

        相对于ServerRoot指令的值来说;/etc/httpd/

 

5、定义Main Server的文档页面路径


    (1) DocumentRoot:站点文档根路径;,文件路径的映射;

(2) ServerName:服务器名称

     DocumentRoot指向的路径为URL起始地位置

    如:一个文件的绝对路径为/var/www/html/images/1.jpg,那么通过URL访问时的路径为:

        http://server/images/1.jpg



6、站点路径访问控制

  访问控制机制:可以基于来源地址或基于账号来进行,定义的方式有两种:

   ① 基于文件系统路径:  

    <Directory "/PATH/TO/DIR">

     </Directory>

    

     <File "">

     </File>

   ②基于URL进行:

    <Location "URL">

     ...

     </Location>

    

     <LocationMatch ~ "URL_PATTERN">

     ...

     </LocationMatch>

 

7、Directory中的访问控制定义

   ① Options:

Indexes Includes { FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews }

    None=none

    All:所有的都启用 


    Indexes(索引):当前访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用


    FollowSymLinks:允许跟踪符号链接,如果某页面文件是指向DocumentRoot之外路径上的其他文件时,将直接显示目标文件的内容。


    ExecCGI:允许执行CGI脚本

      

   ② AllowOverride

    httpd的访问控制配置,允许每目录单独进行;在每个目录下建立一个.htaccess文件;

     AllowOverride表示是否允许目录中的.htaccess文件中的配置来覆盖当前配置段中的配置;

    

     Options FileInfo AuthConfig Limit

     All

     None

 

   ③基于来源地址的访问控制:

     允许所有地址访问:Require all granted

     拒绝所有地址访问:Require all denied

    

     <RequireAll>

    

     </RequireAll>

    

    基于IP控制:

     Require ip ADDRESS

     Require not ip ADDRESS

       ADDRESS:

              ip

    

    

    基于主机名控制:

     Require host HOSTNAME

     Require not host HOSTNAME

       HOSTNAME:

          FQDN

          DOMAIN.TLD

    

8、定义默认的主页面

    DirectoryIndex index.html index.html.var

    自左而右,找到首次匹配到的文件,就将其作为默认主页返回;


9、配置日志:

    

错误日志:

        ErrorLog  "/var/log/httpd/error_log"

        LogLevel warn

Possible values include: debug, info, notice, warn, error, crit, alert, emerg.


    访问日志:受限要定义日志格式,然后才能设置日志信息。通过关键字LogFormat来定义一个日志的格式:

        LogFormat "FORMAT_STRINGS" LOG_FORMAT_NAME

如:LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

通过关键字CustomLog来设置访问日志的存放路径及格式信息:

        CustomLog  "/PATH/TO/LOG_FILE"  LOG_FORMAT_NAME

注:"FORMAT_STRINGS"参数详情请参考:

    http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats


10、路径别名:

如DocumentRoot "/var/www/html",在/var/www/html/web/htdocs下面又有bbs/index.html,显然我们通过url访问的时候路径是这样的:

    URL:http://www.xxxx.com/web/htdocs/bbs/index.html

此时我们可以使用Alias /URL/ "/path/to/some_directory"即 

Alias /xxbbs/ "/var/www/html/web/htdocs/bbs" 来重新定义一个别名路径,那么我们可以通过访问新的url来访问之前同样的内容。


格式:

    Alias  /URL/ /PATH/TO/SOME_DIR/

      注:/   相对应


11、设定默认字符集

    AddDefaultCharset UTF-8

    常用字符集:GBK,GB2312,GB18030

12、虚拟主机:

主机标识方式:

    IP不同 

    PORT不同

    ServerName:

模式:

<VirtualHost IP:PORT>
    ServerName
DocumentRoot
<Directory "">
    ...
Require all granted
</DIrective>
ErrorLog
CustomLog
</VirtualHost>

示例:

注:httpd-2.2中使用基于ServerName的虚拟主机时,要使用专用配置指令 NameVirtualHost IP:PORT

<VirtualHost 10.1.0.68:80>
    ServerName www1.a.com
    DocumentRoot "/vhosts/www1"
    <Directory "/vhosts/www1">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost 10.1.0.68:8080>
  ServerName www2.b.com
  DocumentRoot "/vhosts/www2"
  <Directory "/vhosts/www2">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>

<VirtualHost 10.1.0.69:80>
    ServerName www3.c.com
    DocumentRoot "/vhosts/www3"
    <Directory "/vhosts/www3">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
</VirtualHost>


13、基于用户的访问控制:

Require user USERLIST

    Require group GRPLIST


    虚拟用户: 只是用户标识,为了获取某个资源。


认证方式:

     basic

     digest


http协议认证过程 :

  认证质询:

        WWW-Authencate:响应码为401,拒绝客户端请求,并说明用户需要输入正确的账号和密码之后方可访问;


  认证:

        Authorization:客户端填入账号和密码,再次发送请求报文;认证通过,服务器发送响应内容;

 <Directory "">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "STRING"
    AuthUserFile ""
    Require user USER1 USER2 ...
 </Directory>


账号文件生成工具htpasswd

    htpasswd [options] "/PATH/TO/HT_PASSWD_FILE" username

     -c:创建此文件;

     -m:md5加密密码存放;

     -s:sha加密

     -D: 删除指定用户


示例:

<VirtualHost *:80>
    ServerName www1.a.com
    DocumentRoot "/vhosts/www1"
    <Directory "/vhosts/www1">
        Options None
        AllowOverride None
        Require all granted
    </Directory>
    <Directory "/vhosts/www1/admin">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "Admin Area, Enter your name/pass"
        AuthUserFile "/etc/httpd/conf/.htpasswd"
        Require valid-user
    </Directory>
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" combined
</VirtualHost>



Require的使用方式:

    (1) Require valid-user

    (2) Require user USER1 USER2 ...


    基于组进行认证:

<Directory "/vhosts/www1/admin">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "Admin Area, Enter your name/pass"
    AuthUserFile "/etc/httpd/conf/.htpasswd"
    AuthGroupFile "/etc/httpd/conf/.htgroup"
    Require group GRPNAME1 GRPNAME 2
</Directory>


组账号文件:

        每行定义一个组

        group_name: user1 user2 ...



示例1:

(1) 基于主机名实现三个虚拟主机

(2) 每虚拟主机使用独立的访问日志和错误日志

(3) 第三个虚拟主机的/admin要进行用户访问认证

(4) 在第二个虚拟主机上提供/status;

(5) 在第三个虚拟主机提供路径别名/bbs,访问其它文件系统路径;

(6) 尝试使用混合类型的虚拟主机:基于IP,PORT和ServerName


[[email protected]~]# tree /vhosts/
/vhosts/
├── www1
│   └── index.html
├── www2
│   └── index.html
└── www3
├── admin
│   └── index.html
├── index.html
└── test
└── index.html
[[email protected] ~]# htpasswd -c -m /etc/httpd/conf.d/.htpasswd tom
[[email protected] ~]# htpasswd -m /etc/httpd/conf.d/.htpasswd jack
[[email protected] ~]# cat /etc/httpd/conf.d/.htpasswd
tom:$apr1$KsgClzeF$3sjkA4SYzbO4rsLJ1Ry1F0
jack:$apr1$8CXU2TlX$uQt2LfZYK1yLWwF8oQD4F1

配置文件
[[email protected] ~]# vim /etc/httpd/conf.d/vhosts.conf
 <VirtualHost *:80>
     ServerName www1.magedu.com
     DocumentRoot "/vhosts/www1"
     <Directory "/vhosts/www1">
         Options None
         AllowOverride None
         Require all granted
     </Directory>

     ErrorLog "logs/www1-error_log"
     Customlog "logs/www1-access_log" combined
 </VirtualHost>

 <VirtualHost *:80>
     ServerName www2.magedu.com
     DocumentRoot "/vhosts/www2"
         <Directory "/vhosts/www2">
             Options None
             AllowOverride None
             Require all granted
         </Directory>

         <Location /status>
             SetHandler server-status
                 Require all granted
         </location>

     ErrorLog "logs/www2-error_log"
     Customlog "logs/www2-access_log" combined
 </VirtualHost>

 <VirtualHost *:80>
     ServerName www3.magedu.com
     DocumentRoot "/vhosts/www3"
         <Directory "/vhosts/www3">
             Options None
             AllowOverride None
             Require all granted
         </Directory>
     <Directory "/vhosts/www3/admin">
             Options None
             AllowOverride None
         AuthType Basic
         AuthName "Admin , Enter your name/passwd"
         AuthUserFIle "/etc/httpd/conf.d/.htpasswd"
         Require valid-user
     </Directory>

     Alias /bbs/ /vhosts/www3/admin/
     ErrorLog "logs/www2-error_log"
     Customlog "logs/www2-access_log" combined
 </VirtualHost>


示例2

2:使用脚本实现基于主机名的虚拟主机按需创建;

每虚拟使用单独的配置文件;

脚本可接受参数,参数虚拟主机名称;

 #!/bin/bash
 Dir=/vhost/
 Host() {
 cat <<EOF > /etc/httpd/conf.d/vhosts.conf
 <VirtualHost *:80>
     ServerName $Vhost.magedu.com
     DocumentRoot "$Dir$Vhost"
     <Directory "$Dir$Vhost">
         Options None
         AllowOverride None
         Require all granted
     </Directory>
 </VirtualHost>
 EOF
 }

 HostLog() {
 cat <<EOF > /etc/httpd/conf.d/vhosts.conf
 <VirtualHost *:80>
     ServerName $Vhost.magedu.com
     DocumentRoot "$Dir$Vhost"
     <Directory "$Dir$Vhost">
         Options None
         AllowOverride None
         Require all granted
     </Directory>
     ErrorLog "logs/$Vhost-error_log"
     CustomLog "logs/$Vhost-access_log" combined
 </VirtualHost>
 EOF
 }

  read -p "Input VirtualHost:(Hostname|quit)  " Vhost
   until [[ $Vhost == "quit" ]];do
   read -p "Whether use Log:(y|n) " Log
   if [ $Log == "y" ];then
      mkdir -pv $Dir$Vhost &> /dev/null
      HostLog
      echo ""$Vhost".magedu.com" > $Dir$Vhost/index.html
      systemctl reload httpd
   else
      mkdir -pv $Dir$Vhost &> /dev/null
      Host
      echo ""$Vhost".magedu.com" > $Dir$Vhost/index.html
      systemctl reload httpd
   fi
 read -p "Input VirtualHost:(Hostname|quit)  " Vhost
   done





14、curl命令

   curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。


    语法:curl  [options]  [URL...]


curl的常用选项


   -A/--user-agent <string> 设置用户代理发送给服务器

   --basic 使用HTTP基本认证


   -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

   -X, --request <command>:自定义请求方法


另一个工具:elinks

语法:elinks  [OPTION]... [URL]...

    -dump: 不进入交互式模式,而直接将URL的内容输出至标准输出; 



15、使用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



16、https,  http over ssl 


OpenSSL:

libcrpyto, libssl (ssl/tls), openssl

PKI: 

CA, 


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]



17、httpd自带的应用程序

  htpasswd:basic认证基于文件实现,用于生成账号和密码的程序;

    htdbm

    htdigest

  apachectl:httpd自带的服务控制脚本,支持start和stop等子命令;

  apxs:- APache eXtenSion tool

    为httpd增添模块的;

 

  rotatelogs:

     access_log,

     access_log, access_log.1, ...


  

  压测工具:

    ab:(http自带) - Apache HTTP server benchmarking tool

     webbench, httpload, ...  只能做简单评估

    

     loadrunner:既能做压测,又能对软件做测试

    jmeter (ASF):开源,既能压测,又能做软件测试需要测试模型

     tcpcopy:网易研发

  

18、ab - web service的压力测试工具

  ab [OPTIONS]  [http[s]://]hostname[:port]/path

     请求数:[ -n requests ]

     并发数:[ -c concurrency ]

     长连接:[ -k ]

    



  

本文出自 “I'm Groot” 博客,请务必保留此出处http://groot.blog.51cto.com/11448219/1872795

以上是关于漫谈HTTP(上)的主要内容,如果未能解决你的问题,请参考以下文章

漫谈PHP代码规范

HTTP 协议漫谈

漫谈反射在业务代码中的应用

代码补全漫谈 - 从TabNine说起

JAVA 蔡羽 基础知识漫谈

HTTP协议漫谈