第一:Web Service基础

@1:补充  TCP、UDP

image

   OSI模型,TCP(应用、表示、会话)资源子网,下四具为通信子网。

前三层在用户进程进行(用户空间用户程序,后四层在内核中。

Ip地址主机至主机(通信双方)

    数据链路层mac设备到设备之间的通信

   TCP/IP提供进程地址(端口号) 

   TCP:面向链接在通信前创建虚拟链路(三次握手),通信完成后

还要拆除链路。可提供可靠流协议。0-65535

   UDP:用户数据报协议(User dataGram Protocol),无链接协议(

无法保证对方在线)0-65535

   套接字socket:IPC的一种实现。目的实现允许不同主机(或同一主机)

上不同进程之间通信。从而实现数据交换。socket API,在1983年实现。

最早4.2BSD版本。是IP地址加端口的组合的结果。

      源端口16位,目标端口16位

   套接字三种类似:TCP端口的、UDP端口的以有裸套接字(直接通过IP报文)

不使用TCP或UDP端口。

         SOCK_STREAM   TCP套接字 流行通信

         SOCK_DGRAM   UDP套接字

         SOCK_RAW   裸套接字(IP报文实现应用)

    二个主机通信时同层之间有协议,不同层之间上层利用下提供的接口和服务,

下层接口向上层提供服务。多层能够提供模块化          

     image

     网络IP,将IP切为数据报文进行传送。(为不可靠),传输单元MTU一般

为1500。

image

   客户端与服务器进程通信时产生一组套接字(原I地址+原端口和目标地址+目标端口形式)

客户端的端口随机41952以上,服务器端固定80(http服务)

 

  @2:IP

分类:

    A类:1-127     B:128-191     C:192-223     D:组播:224-239     E:240-254

私有地址: 

      A:10.0.0.0/8    B:172.16.0.0/16—172.31.0.0/16

      C:192.168.0.0/24      D:192.168.255.0/24

     @3:端口使用限制

由国际互联网地址IANA

  0-1024分配给固定使用   22/tcp(ssh) 80/tcp(http),443/tcp(https)

  2014-41951  为注册端口,要求不严格,分配给程序注册使用

           11211/tcp memory cached    3306 tcp/mysql)

  41952-65535 客户端随机使用端口(动态端口),在Linux中

       /proc/sys/net/ipv4/ip_local_port_range  可修改(增加端口数)

@3 :TCP协议特性(双向)

tcp发送与接收在不同的信道。(内核的接收速度大于网卡)

image

一端的发送缓存对应另一端的接收缓冲。TCP功能

    三次握手

     分段每段有校验和(CRC-32)。

     确认、重传、超时、排序(逻辑序号-在数据流中的位置)、

     流控(滑动窗口算法-缓存区剩余大小)、

     拥塞控制(发送慢启动和拥塞避免算法)【接收的绥中小于发送缓存】

@4:Socket Domain:

根据使用地址使用socket domain,每类套接字至少提供2种socket:流、数据报

       AF_INET :Adress Famil .IPV4

       AF_INET6: IP V6

        AF_UNIX:同一主机不同进程

    流提供可靠传递、面向连接、无边界

    数据报:不可靠传递,有边界、无连

    套接字相关系统调用

          socket():创建(向内核申请调用)

            bind():绑定,使用套接字

           Listen():监听

            Accept():接收请求

            connect():客户端请求链接建立

            write();数据包的发送  read();从缓存接收数据

                  (send(),recv(),sendto(),recvfrom():

      当无请求调用时,将阻塞

第二部分:http协议

第一:HTTP基础

1、 定义

http: hyper text transfer protocol, 80/tcp
     html: 编程语言,超文本标记语言;

<html>
   <head>
     <title>TITLE</title>
   </head>
     <body>
       <h1></h1>
        

blabla... <a href="http://www.magedu.com/logo.jpg"> blabla

 
       <h2></h2>
    </body>
   </html>

CSS: Cascading Style Sheet(级联样式表)
  js: javascript

   MIME: Multipurpose Internet Mail Extesion(支持文协议发送非文本数据,支持多)

  http工作在应用层

2、工作机制:
   http请求
   http响应

Web资源:web resource(请求的内容)
       静态文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi
       动态文件:.php, .jsp,

媒体:媒体类型解决需要那个外部程序执行。
        媒体类型(MIME类型,不同编码方式):major/minor(主类型、次类型)
           text/html(超文本)
           text/plain(纯文本)
           image/jpeg
           image/gif

URI: Uniform Resource Identifier(统一资源标识符,标识可被引用的资源)

    URI的二种类型:
     URL: Uniform Resorce Locator,用于描述某服务器某特定资源的位置;

         (统一资源定位符)
        URL组成: Scheme://Server:Port/path/to/resource

            scheme:方案   server:port(代表进程地址),path做资源映射。
         例如:http://www.magedu.com/images/logo.jpg
     URN: Uniform Resource Naming(统一资源命名)

3、http协议版本:
   HTTP/0.9:原型版本,功能简陋
   HTTP/1.0:第一个广泛使用的版本,支持MIME
   HTTP/1.1: 增强了缓存功能
      spdy(google)
   HTTP/2.0:

      rfc(请求注解文档)

4、一次完整的http请求处理过程:

image
  (1) 建立或处理连接:接收请求或拒绝请求
  (2) 接收请求:【请求报文】
      接收来自于网络的请求报文中对某资源的一次请求的过程;

并发访问响应模型(Web I/O):
      单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;

            多个请求被串行响应;(一个用户请求一个PV)
     多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
      复用I/O结构:使用复用连接处理器(C10K--1万个并发),一个进程响应n个请求;
           多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
           事件驱动:event-driven:一个进程有事件监控器,能够接受多个请求。

                  基于事件回调机制。
     复用的多进程I/O结构:启动多个(m)进程,每个进程响应n个请求;

四个响应模型如下图:

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

      元数据:请求报文首部(包括很多元数据)
          <method> <URL> <VERSION>  #方法类似put、get
          Host: www.magedu.com   请求的主机名称
          Connection:

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

     web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,

或动态运行后生成的资源;这些资源放置于本地文件系统某路径下,此路径通常称为

DocRoot(实现映射 httpd默认 /var/www/html /)

          images/1.jpg

          外部路径:http://www.magedu.com/images/1.jpg

   web服务器资源路径映射方式:
          (a) docroot  直接映射,
          (b) alias  路径别名
          (c) 虚拟主机docroot   
          (d) 用户家目录docroot 

  (5) 构建响应报文:把访问到的资源打包,构建响应相应报文,再发给客户端

  资源的MIME类型:
     显式分类:类型在服务器直接定义完成
     魔法分类 :判断类型
     协商分类:

  URL重定向:(永久重定向、临时重定向)
     web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径;

(6) 发送响应报文:

         持久:不会断开请求链接

         非持久:断开链接,再3次握手和4次断开

(7) 记录日志:供后期分析

第二、http介绍

1、 http服务器程序:
    httpd (apache)  
    nginx 
    lighttpd

    应用程序服务器:
      IIS
      tomcat, jetty, jboss, resin
      webshpere, weblogic, oc4j(oracle)

     www.netcraft.com(进行相应统计份额)

2、httpd的安装配置和使用:
httpd: apache
      a  patchy server = apache  (充满补丁的服务器)
     ASF: apache software foundation

         ----该组织其它应用:tomcat、spark

httpd的特性:
    高度模块化:core + modules
    DSO: Dynamic Shared Object(模块动态加载、卸载)
    MPM:Multipath Processing Modules(多路处理模块)
         prefork:多进程模型,每个进程响应一个请求;
            一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;

即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;

            每个进程连接的套接字,一个端口一个进程。
        worker:多线程模型,每个线程响应一个请求;
            一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;
m进程,n线程:m*n                    
         event:事件驱动模型,每个线程响应n个请求;
      一个主进程:生成m个子进程,每个进程直接n个请求; m*n

     

        httpd-2.2: event为测试使用
        httpd-.24:event可生产使用

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

4、安装httpd:  (httpd.apache.org官方站点)

     rpm包
     源码编译安装

    yum list all httpd*  显示httpd版本

image

 

第三部分: httpd安装
1、回顾:
    MPM:(多路处理模块)
        prefork: 多进程模型,每个进程响应一个请求;
        worker:多线程模型,第个线程响应一个请求;
        event:事件驱动模型,一个线程响应多个请求;

    并发服务器响应请求:
        单进程I/O模型
        多进程I/O模型
        复用的I/O模型
            多线程模型
            事件驱动
        复用的多进程I/O模型

httpd的基本配置和应用(2)

    httpd.apache.org
        2.2
        2.4

2、http安装

利用yum list all httpd*,查看以安装安装包

image

   rpm –ql httpd-tools查看安装包配置的相就应包

image

rpm包安装的httpd的默认工作目录(根目录):/etc/httpd

程序环境 
    配置文件: 
        主配置文件:/etc/httpd/conf/httpd.conf 
        分段配置文件:/etc/httpd/conf.d/*.conf
    服务脚本:
         /etc/rc.d/init.d/httpd (在centos 7无此目录,通过systemctl进行管理)
         脚本的配置文件:/etc/sysconfig/httpd
     模块文件目录: 实际为链接
         /etc/httpd/modules --> /usr/lib64/httpd/modules

image
    主程序文件: rpm –ql httpd |grep bin

         centos 6主程序文件:
          /usr/sbin/httpd (prefork)
          /usr/sbin/httpd.worker (worker) 
         /usr/sbin/httpd.event (event)

       centos 7主程序文件:

image
    日志文件目录:
          /var/log/httpd
             access_log: 访问日志文件
             error_log: 错误日志
     站点文档目录:
           /var/www/html

     启动systemctl start httpd(在启动前注意DNS解析)

image

     通过查看/var/log/httpd/目录下的error_log以及ss –tnl查看80端口,

并通过浏览器查看

image

image

     欢迎页/etc/httpd/conf.d目录中welcome.conf(默认)

/var/www/html htm为网页文件根目录

同时通过tail /var/log/httpd/access_log查看访问目录

第四部分;httpd配置

配置文件: 
    Directive     Value    (Directive不区分大小写)
    指令         值

    # grep "Section" httpd.conf 
    ### Section 1: Global Environment 
    ### Section 2: 'Main' server configuration 
    ### Section 3: Virtual Hosts

    'Main' server((主服务器-中型主机)和Virtual Hosts不能同时启用;

默认启用的是'Main' server;

1、指定监听地址和端口 
     Listen [IP:]80   #修改完成后需要重新启动

    (1) IP省略时表示监听本机上所有可用的IP地址; 
    (2) Listen指令可以出现多次,用于指明多个不同的监听端口或套接字: 
         Listen 172.16.100.11:80 
         Listen 172.16.100.11:8080

image

2、持久连接相关

  持久连接:连接建立后,每个资源获取结束不会断开连接,而继续等待其它资源请求并完成传输; 
        如何断开? 
               数量限制:如100个 
               时间限制:如60秒 
        劣势:对并发访问量较大的服务器,开持久连接会有些请求得不到服务; 
        改进:减短,httpd-2.4支持毫秒级 
  非持久连接:每个资源都是单独通过专用的连接进行获取

   KeepAlive Off|On 
   MaxKeepAliveRequests 100 
   KeepAliveTimeout 15

    #默认情况 下以上参数在centos 6环境,7中需要单独配置

      测试: (http请求谁请求谁断开)
# telnet Server 80 
      GET /URL HTTP/1.1 
       Host: Server  (回车二次)

image

   结尾:connection closed 说明是非持久链接

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  与上相同

更换支持不同的MPM的主程序: (以下参数在centos 6版本中)

        编辑/etc/sysconfig/httpd

   修改参考如下:

image

   在centos 7版本中已忽略

centos7 :/etc/httpd/conf.modules.d/00-mpm.conf

image
  启用变量: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 
  # MaxClients: maximum number of server processes allowed to start 
  # MaxRequestsPerChild: maximum number of requests a server process serves 
      <IfModule prefork.c> 
         StartServers       8  #默认启动空闲进程  root为主,apach为子进程

image
         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 
     <IfModule worker.c> 
        StartServers         4  #多少个子进程
        MaxClients         300 
        MinSpareThreads     25 #最少空闲线程数
        MaxSpareThreads     75 
        ThreadsPerChild     25  #每个子进程多少个线程
        MaxRequestsPerChild  0   #每个子进程最大请求数量 、无限制
      </IfModule>

4、DSO 【动态装卸模块】
    配置指令模块加载: 
        LoadModule <module_name> <module_path>  

    #以centos 6文件中修改httpd.conf文件添加注释即可, 以centos 7环境中

       模块路径:可使用相对路径 
       相对于ServerRoot指令指向的位置而言;(ServerRoot定义起始位置/etc/httpd)

  注意:建议使用service httpd reload重新装载配置文件(针对centos 6)

5、定义'Main' server的文档页面路径 (方法适用于centos 6)

   默认/var/www/html/

  mkdir /data/web/html -pv

   httpd -t语法测试
   DocumentRoot指令

      文档路径映射: 
    DocumentRoot指向的路径为URL起始的位置 
        /var/www/html/images/1.jpg 
        http://server/images/1.jpg

6、站点路径访问控制 
访问控制机制: 
     基于来源地址 
     基于账号

定义的方式有两种: 
   文件系统路径: 
     <Directory "/PATH/TO/SOMEDIR"> 
             ... 
    </Directory>

image
    URL路径: 
           <Location "/URL"> 
                   ... 
           </Location>

7、Directory中的访问控制定义

   修改/etc/httpd/conf/httpd.conf
   (1) Options 
   Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,

会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用; 
   FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文

件时,将直接显示目标文件的内容; 
   None: none   所有特性都不启用
   All: 所有的都启用;

image

    alloverride Node 影响性能比较严重

image

  (2) 基于来源地址访问控制

image

参考centos 6

Order: 检查次序 
    Order Allow Deny:只有明确Allow的来源地址,才允许访问,其它的均为Deny 
    Order Deny Allow: 
    Allow from:允许访问的来源地址 
    Deny from:拒绝访问的来源地址

示例:只允许allow的地址,拒绝100.2  

Order Allow Deny 
        Deny from 172.16.100.2 
        Allow from 172.16.0.0/16

访问本机页面curl命令用于获取 html的资源

   image

    from后可跟上的地址格式: 
          IP地址; 
          网络地址: 
                  172.16   #网段
                  172.16.0.0    #网段
                  172.16.0.0/16   #网段
                  172.16.0.0/255.255.0.0  #网段

8、定义默认的主页面 
  DirectoryIndex index.html index.html.var

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

示例:在DirectoryIndex 后面添加相应的html页面地址

9、配置日志

二类为错误日志和访问日志

   错误日志: 相对路径: /etc/httpd/目录
       ErrorLog    logs/error_log 
       LogLevel warn(日志级别)alert :比这个warn级别的都会记录

image

     访问日志:要定义日志格式  :使用logformat命令;后面为内置宏

image

         log日志三种格式【combinded、common、combinedio】

   参考链接:http://httpd.apache.org/docs/
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
     CustomLog logs/access_log combined

      日志:tail /var/log/httpd/access_log

image

   %h: Remote host,客户端主机 ,相对服务器来说 
   %l: Remote logname (from identd, if supplied). 客户用户通过identd登录时使用名称;一般为空-;  
   %u: Remote user (from auth; may be bogus if return status (%s) is 401),用户认证登录

              的名字;无登录机制一般-;  
   %t: Time the request was received (standard english format),收到客户端请求时的时间;  
           \": 显示引号本身,而不作为引用符号;  
   %r:First line of request,请求报文的首行     <method> <url> <version>  
  %>s:响应状态状态码 五位(1,2,3,4,5开头)
  %b: Size of response in bytes, excluding HTTP headers,响应报文的大小,单位为字节

              ;不包含首部信息;  
  %{Referer}i:记录Http首部Referer对应的值;即访问入口,从哪个页面跳转至此页面; 

        如直接指定登陆时记录为空。
  %{User-Agent}i:记录http首部User-Agent对应的值;即浏览器类型;

  详情: http://httpd.apache.org/docs/2.4/mod/core.html#errorlogformat

  10、路径别名

   DocumentRoot "/var/www/html" 
        download 
             mp3 
               1.mp3 
             bbs 
               index.html 
                
   URL: http://www.magedu.com/download/mp3/1.mp3 
   URL: http://www.magedu.com/bbs/index.html

   Alias /URL/ "/path/to/some_directory"

   例如:Alias /bbs/ "/web/bbs/htdocs/"  把 BBS路径以 “/web/bbs
  URL: http://www.magedu.com/bbs/index.html --> /web/bbs/htdocs/index.html

    Alias /images/ "/web/pics/" 
  URL: http://www.magedu.com/images/a.jgp --> /web/pics/a.jpg

  Centos  6在/etc/httpd/conf/httpd.conf中alias中

  Centos 7 参考

image

  

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

       常用字符集:GBK, GB2312, GB18030

12、基于用户的访问控制  
    质询: 
       WWW-Authenticate: 服务器用401状态拒绝客户端请求,说明需要用户提供用户名

  和密码;弹出对话框; 

image
    认证: 
        Authorization:客户端用户填入账号密码后再次发请求至服务器;认证通过,则请求授权;

        示例:DocumentRoot "/var/www/html" 
              images  正常访问
              bbs    正常访问
              employee/  不允许访问

         安全域:需要用户认证后方能访问的路径  
              应该有其名称,用于向用户通知此认证的原因等;

  http协议支持的认证方式:  
          basic:基本  (明文)默认
              BASE64 
          digest:摘要

      basic认证机制的实现 
      (1) 定义安全域 

    创建以下目录:
         <Directory "/data/web/html/employee">  
              Options None     #不启用前定义根目录
               AllowOverride None    #限制权限
               AuthType Basic  #认证类型
               AuthName "Employee Infomation, only for employee"  #提示信息
               AuthUserFile /etc/httpd/users/.htpasswd  #认证信息,需要自己创建
               Require user tom jerry  #针对一部分用户登陆

                Require valid-user #与以上二选一

            </Directory>     
                     
  Require valid-user: 所有位于AuthUserFile文件中定义的用户都允许登录;  
  Require user user1 user2 ...: 仅允许user1,user2等出现AuthUserFile

文件中定义的特定几个用户登录;       

              虚拟用户:即非系统用户;

     (2) 提供用户的账号文件  
      htpasswd命令用于维护此文件

       htpasswd [ -c ] [ -m ] [ -D ] passwdfile username  
           -c: 添加第一用户时创建此文件;  
           -m: 以md5格式加密用户密码存放;  
           -s: 以sha格式加密用户密码存放;  
           -D:删除指定用户

示例:接(1)创建/etc/httpd/users/,并生成文件

注意htpasswd第二时需要取消-c选项

image

    (3) 组认证

  <Directory "/data/web/html/employee">  
       Options None  
       AllowOverride None  
       AuthType Basic  
       AuthName "Employee Infomation, only for employee"  
       AuthUserFile /etc/httpd/users/.htpasswd  
       AuthGroupFile /etc/httpd/users/.htgroup  
        Require group GRP1 GRP2 ...  
   </Directory>

image

     组文件:  
         每行定义一个组,格式  
          Grp_Name: User1 User2 ...   只要列出即可

示例:编辑/etc/httpd/users/.htgroup文件

image

httpd –t 检查语法

13、虚拟主机

一个物理器可以服务于多个站点,每个站点可通过一个或多个虚拟主机来实现;

    httpd三种类型的虚拟主机:  
           基于IP  
           基于Port  
           基于FQDN  :用户注册,并能解析域内的主机,主机名不能够相同

 

   注意:得首先关闭'Main' server  虚拟主机与Main Server不能同时存在
             方法:注释DocumentRoot指令即可;以下方法适用于centos 6环境中

   定义虚拟主机的方法: 
         <VirtualHost "IP:PORT"> 
                ServerName   #可随意
                ServerAlias   #可选
                DocumentRoot  #必选
          </VirtualHost>

image

            <VirtualHost *:80>   #表示所有80端口
                 ServerName www.a.com 
                 DocumentRoot /vhost/a.com/htdocs/ 
             </VirtualHost>

   # mkidr –pv /vhost/{a.com,b.org}/htdocs

注意:大多数可用于全局或'main' server中的指令,都可以定义有VirtualHost中;

   示例1:基于IP 

           <VirtualHost 172.16.100.11:80> 
                 ServerName www.a.com 
                 DocumentRoot /vhost/a.com/htdocs/ 
             </VirtualHost>

       同时编辑每个目录下index.html <h1>内容</h1>

 

            <VirtualHost 172.16.100.21:80> 
                 ServerName www.b.org 
                 DocumentRoot /vhost/b.org/htdocs/ 
             </VirtualHost>

             <VirtualHost 172.16.100.31:80> 
                 ServerName www.c.net 
                 DocumentRoot /vhost/c.net/htdocs/ 
              </VirtualHost>   

     注意:本机要配置上所有IP地址并能够用于通信;

    示例2:基于Port 
          <VirtualHost 172.16.100.11:80> 
              ServerName www.a.com 
              DocumentRoot /vhost/a.com/htdocs/ 
          </VirtualHost>

          <VirtualHost 172.16.100.11:808> 
               ServerName www.b.org 
               DocumentRoot /vhost/b.org/htdocs/ 
           </VirtualHost>

           <VirtualHost 172.16.100.11:8080> 
               ServerName www.c.net 
                DocumentRoot /vhost/c.net/htdocs/ 
            </VirtualHost>   

       注意:httpd要监听这里指明的所有端口 
               Listen

    示例3:混用IP和Port 
           <VirtualHost 172.16.100.11:80> 
                ServerName www.a.com 
                DocumentRoot /vhost/a.com/htdocs/ 
            </VirtualHost>

            <VirtualHost 172.16.100.21:80> 
                ServerName www.b.org 
                DocumentRoot /vhost/b.org/htdocs/ 
            </VirtualHost>

             <VirtualHost 172.16.100.11:8080> 
                ServerName www.c.net 
                 DocumentRoot /vhost/c.net/htdocs/ 
              </VirtualHost>   

   示例4:基于FQDN

   必须需要启用:  NameVirtualHost 172.16.100.11:80

            <VirtualHost 172.16.100.11:80> 
                ServerName www.a.com 
                 DocumentRoot /vhost/a.com/htdocs/ 
             </VirtualHost>

            <VirtualHost 172.16.100.11:80> 
                 ServerName www.b.org 
                 DocumentRoot /vhost/b.org/htdocs/ 
             </VirtualHost>

             <VirtualHost 172.16.100.11:80> 
                 ServerName www.c.net 
                 DocumentRoot /vhost/c.net/htdocs/ 
             </VirtualHost>   

使用cur命令查看

image

   注意:额外经常用于每个虚拟主机的配置有 
           ErrorLog 
           CustomLog 
           <Directory> 
           <Location> 
             ServerAlias

14、内置的status页面

       <Location /server-status> 
           SetHandler server-status    #httpd内置程序,表示启动
              Order deny,allow  #启动程序
              Deny from all 
             Allow from 172.16.0.0/16 
      </Location>

示例:通过172.16.16.100.11/server-status 进行该部

image

15:Curl命令

     Curl是基于URL语法在命令行方式式工作的文件传输工具,它支持FTP、

http https,telnet  dict File以及LDAP协议,CURL支持http的post,put

等方法,Ftp上传,kerberos认证,http上传、代理服务器,cookies、用户

名和密码认证,上传和下载文件断开续传、,http代理服务器管道(proxy tunneling),

甚至支持ipv6,socks5代理服务器中,通过http代理服务器上传文件到 FTP服务器。

   curl常用 选项

      -A/- -user –agent <string>设置用户代理发送给的服务器,模拟自己成为浏览器

模拟自己为chrome 40浏览器

image

     -basic (使用http基本认证)  -u 指定用户名和密码

     --tcp-nodelay 使用gcp_nodelay选项

     -e/- - referer <URL> 来源地址

image

      --cacert <file>  CA证书(SSL)  验证服务器端通过ssl

      --compressed 要求返回是压缩的格式,gzip等格式返回

      -H/- -header  <line>自定义头信息传给服务器

      -I /- - head 只显示响应报文首部信息(红色为起始行)

image

      --limit-rate <rate>设置传输速度

      -u/- - user <user[Password]>设置服务器的用户和密码

       -0/- - httpd1.0使用http 1.0 (零)

      用户:curl [options] [url…]

         TCP拥塞控制,Magle算法

        其它工具:elinks(全屏浏览器) 用户网站测试

image

直接显示获取的内容  -dump不进行交互模式,而直接将URL

的内容输出到标准输出

image

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

  适应场景:

             节约带宽,需要额外消耗CPU(有浏览器不支持)

             压缩比的资源,如文本,(图片、流媒体不适合)

        setoutputfilter  DEFLATE (setoutputfiler httpd内置)

可将以上文件加到配置文件中(不定义到virtualhost中)

      #Mod_deflate configuration

  image

测试命令

image
压缩格式

image

17、https

@1:基础

       http over ssl=https  与http不同,是二进制、压缩的。利用443端口。

可通过ssl或tls进行加密传输

        ssl:v3  

        tls:v1

       https//   scheme

@2:SSL会话的简化过程

         首先是TCP三次握手,这是https未参与

   (1) 客户端发送可供选择的加密方式,并向服务器请求证书。

   (2)服务器将证书,及选定的加密方式给客户端,把自己的给客户端

   (3)客户端进行证书验证

            如信任发证书的CA,验证证书来源的合法性,用CA的公钥解密签名。

如能解密是CA所发。

            下一步验证证书的内容的合法性,完全性验证(md5)

            下一步检查证书的有效期限

            下一步证书是否已被吊销

             最后证书中拥有者的名字,与访问的目标主机要一致。

      (4)客户端生成临时 会话密钥(对称密钥),并使用服务端的公钥加密此数据

发给服务器(密钥交换),完成密钥交换。

      (5)服务器用此密钥加密用户请求的资源,响应给客户端。

   CRL证书吊销列表,X.509数字证书的版本,CA证书签发机构,PKI公钥基础设备

     会话结束,先拆除SSL会话,断开后再断开TCP链接(四次断开) ,ssl基于IP地址创建。

所以单IP的主机只可以使用一个https主机

  @3:配置httpd支持https

     (1)服务器申请数字证书

示例:

   测试:通过私有CA发证书

      (a)创建私有CA (证书服务器172.100

     (b)在服务器上创建证书签署请求(web服务器100.11)100.100

     (C)CA签证   --100.37(签证服务器)100.104

    创建私钥和自签证书

 image

   生成自签证书

image

数据证索引文件touch index.txt

echo 01 >serial序列号

image

经过以上部分CA自签证书创建完成

 

      下一步完成应用的证书签署请求

image

注意这里openssl中不指定x509,在输入服务器要与解析一致。生成请求文件

image

注意二端配置请求一致

image

返回16.104,证书文件名一般为crt结尾,生成证书文件

image

生成完成后返回给服务器端使用。如果提示签名不一致。删除

/etc/httpd/ssl文件中内容。

image

image

     (2)配置httpd支持使用SSL,及使用的证书

       #yum –y install mod_ssl

    配置文件:/etc/httpd/conf.d/ss.conf

        DocumentRoot

         ServerName

         SSLCertificationFile

         SSLCertificateKeyFile

httpd –M |grep ssl 查看未安装

利用 yum info mod_ssl并进行安装

image

   rpm –ql mod_ssl

image

   备份配置文件进行编辑

image  

image
编辑servername以及相应的DocumentRoot/路径

示例

image

编辑证书密钥

image

配置完成重启https服务

(3)测试基于https访问相应的主机

openssl s_client [-connect host:port] [-verify depth] [-cert filename]

  测试工具 openssl自带的s_client   -connect 那个服务器的那个端口。

-CAfile 指定CA证书位置。

image

Windows中将PEM文件扩展名修改为crt

18:httpd自带的工具程序

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

    apachectl stop|start  :httpd自带的服务控制脚本

    apxs  :yum install httpd-devel包:apache第三方扩展工具

    rotatelogs:日志滚动工具(自动执行)

            示例:access.log

                   access.log  access.1.log

              access.log  access.1.log   access.2.log

    suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行

    ab:apache benchmark

19:http压力测试工具

     ab:apache benchmark(模拟测试工具,无法模拟实际)

     webbench(额外安装)

     httP-Load(额外安装)

     jmeter

     loadrunner

     tcpcopy(网易开发)

@1:ab :Apache HTTP server benchmarking tool

      ab [options] URL

    -c 并发:模拟多少个并发(并发峰值)

    -n 多少个请求

    -k 以持久连接模式测试

   ulimited  -n #调整用户当前同时打开的文件时(内核默认有限制)

ab –n 1000 –c 10 http://www.a.com/rc.txt

concurrency level:并发级别

time taken for tests:测试时长

complete request:完成请求数

failed requests:

write error:

total transerered:总传输数据量(有开销)大于html transfer

html transfered:

requested per second:多少并发下1秒请求数

time per request:完成1000个请求时间

time per request:1000中每个请求的时间
  (一个并发一个套接字文件)

   利用ulimit –n 3000(修改并发连接数量)

 

image

 

1000个请求,10个并发

   

第四部分:Http请求和响应报文

  1、回顾:

httpd配置

     Listen [IP:]Port

     KeepAlived (On|off)

     MPM(并发响应模型):prefork,worker,event

     DSO:LoadModule     Httpd  -M

     DocumentRoot(定义方法)

          <Directory>

              Options   Index   FollowSymLinks

              Order

              Allow  From

              deny  From

          < Loction>

    DirectoryInex

    ErrorLog

       CustomLog(指定日志格式)---Logformat

          %(Referer)i:引用referer首部的值。

          Alias  /URL/    “/Path/to/somedir”   别名

   基于用户访问控制

         认证方法:basic,digest

               Authtype basic

               AuthName “”

               authUserFile

               AuthGroupfile

               Require User

               Require Group

               Require valid-user

        工具:htpasswd
   虚拟主机 :IP ,Port FQDN(由于http报文中包括主机)

2、http协议和httpd的配置

(一)URL

@1:url定义

     URL统一资源定位符(Unifrom resource Locator)

      组成:URL方案 :scheme

                  服务器地址:IP:port

                 资源路径:路径       

          http://www.magedu.com:80/bbs/index.php,      

          https://www.magedu.com:443/

        http://,https://代表scheme,/bbs/index.php是资源路径

  @2:URL基本语法

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

     params: 参数:类似表单的数据

            示例:http://www.magedu.com/bbs/hello,gender=f (红标代表是参数,判断)

     query:指名查询语句的查询条件

            示例:http://www.magedu.com/bbs/item.php?user=tom&titil=abc

     frag:片断,页面的标签位置

    可以根据三种方法进行负载均衡判断

   @3:相对URL(不完整,相对当前位置,一般用于同站点)

             绝对URL(跨站使用)

(二)http协议

http:/0.9, http://1.0,http://1.1,http/2.0

1:http协议: 是无状态的(stateless)

    服务器无法持续追踪访问者来源(利用cookie与session机制)

         某客户端发送数据至服务端时,服务器将cookie部分数据给客户端

每个cookie有作用范围(每个服务器不同)

    cookie(重--内容详细;轻--内容比较少)

    session:服务器与客户端进程维护的微小数据结构,记录客户端在服务器访问行为

关联到cookie。

2:http事务:http一次请求和响应

           请求;request报文       响应:response报文

   @1:报文语法格式:

       request报文(有统一类型,起始行不同)

    <method><request-url><version>

    <headers> #后面二个换行

     

     <entity-body>

        reponse报文

        <version><status><reason-phrase原因短语》

        <headers> #后二个换行

 

          <entity-body>

   说明:

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

          常用:GET     HEAD   POST

    version:  http://<major>.<minor>  示例 http://1.1

    status:统一三位数字:响应状态码 如200-成功,301-重定向,302,404-失败无资源,

502--失败服务器故障, 标记请求过程中发生的情况。

    reason-phrase:状态码所标记的简要描述

    headers:请求或响应的报文包括任意个首部,每个首部都有首部名称,后面跟一个

冒号,面后跟上一个可选空格,接一个值。

     entity-body(实体部分)有用的数据块,可能为空   

1):http请求方法methord(客户端告诉服务器做什么)

     Get:从服务器获取一个资源(安全)

     HEAD:只从服务器获取文档的首部(有起始行) 、

     Post:向服务器发送要处理的数据(放到请求报文的实体部分,提交给服务器端)

     Put:与get相反,将请求主题存储在服务器(实体部分包括内容)  

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

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

      OPTIONS:可以请求服务器返回资源支持的方法

     协议分析:报文tcpdump,tshark,wireshark

2) status(状态)服务器告诉客户端请求状态信息;5种

     1XX:100-102,额外信息提示

      2XX:200-206,成功类信息

      3XX:300-305 重定向

      4XX: 400-415 错误类响应码(因客户端错误)

       5XX:500-505 错误类信息:(因服务器端错误)

        常用状态码:

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

        301:请求URL指向资源已经被删除,但响应报文中通过location指明了

             资源现在所处的新位置。(永久重定向)move-permantly

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

             新位置;Found

       304:客户端发出条件式请求,但服务器上的资源未发曾发生改变,则通过

          响应此响应状态码通知客户端:Not Modified(客户端资源问服务器是否改变)

       401:需要输入账号和密码认证后访问资源.Unauthorized

       403:请求被禁止:Forbidden

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

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

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

             请求数据通过代理服务器访问相应的资源利用trace方法

  3)Headers:

     格式:

    Name Values:

响应首部和请求首部信息

 image         image

首部的分类:

        通用首部

        请求首部

        响应首部

        实体首部

        扩展首部

  第一类: 通用首部:(可用在请求和响应报文当中)

        Data :请求和响应报文创建时间 

         connection:连接方式:keepalive持久连接 ,close

         Via:报文经过的中间节点

        Cache-control:控制缓存生效机制

        Pragme:兼容http1.1版本

  第二类:请求首部:

          Accept:通知服务器客户端能够接收的媒体类型(MIME)

          Accept-Charset:接受的字符集

          Accept-Encoding:接受的编码格式如gzip

          Accept-Language:接受的语言

           Client-IP:

           Host:请求的服务器的名称和端口号

           Referer:包括当前正在请求的资源的上一级资源。

            User-Agent:客户端代理,浏览器类型

    条件式请求首部:

        Expect: 期望发什么信息

        If-Modified-Since:自从指定时间后请求资源是否发性过修改

        If-Unmodfied-Sinace:相反

        If-None-Mache:本地缓存中存储的文档的Etage(扩展标签)

   是否与服务器文档中Etage不匹配

        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-Location:实体真正的位置

           Content-Range:实体字节范围

           content-Type:主体的对象类型

         提供缓存相关内容:

           Etag:实体的扩展标签

           expires 实体过期时间

           Last-Modified最后 次修改的时间