Web Service学习笔记1

Web Service学习笔记1

应用层:http,https;实现某类具体应用;
传输层协议:TCP、UDP、SCTP

  • IANA:

    • 0-1023:众所周知,永久地分配给固定的应用使用,特权端口;
    • 1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用;如:3306/tcp,11211/tcp;
    • 41952+ :客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在/proc/sys/net/ipv4/ip_local_port_range;
  • BSD Socket:IPC的一种实现,运行位于不同主机(也可以是同一主机)上的进程之间进行通信;

    • Socket API(封装了内核中的socket通信相关的系统调用)

      • SOCK_STREAM:tcp套接字
      • SOCK_DGRAM:udp套接字
      • SOCK_RAW:raw套接字
    • 根据套接字所使用的地址格式,Socket Domain

      • AF_INET:Address Family,IPv4
      • AF_INET6:ipv6
      • AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址;Unix_SOCK
  • TCP FSM:(有限状态机Finite State Machine)
    CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESTABLISHED,FIN_WAIT1,CLOSE_WAIT,FIN_WAIT2,LAST_ACK,TIMEWAIT,CLOSING;

  • TCP协议的特性:

    • 建立连接:三次握手;
    • 将数据打包成段:校验和(CRC32);
    • 确认、重传及超时;
    • 排序:逻辑序号;
    • 流量控制:滑动窗口算法;
    • 拥塞控制:慢启动和拥塞避免算法;

http:hyper text transfer protocol

超文本传输协议;应用层协议,C/S架构,默认端口:80
html:hyper text mark language:
超文本标记语言,是一种编程语言。

  • 格式:

        
            TITLE
        
        
            

blabla... bla...

  • css:Cascading Style Sheet
  • js:JavaScript,客户端脚本

协议版本:

  • http/0.9:原型版本,功能简陋;

  • http/1.0:cache,MIME,method

    • method:GET POST HEAD PUT DELETE TRACE OPTIONS

    • MIME:Multipurpose Internet Mail Extesion,基于文本编码传输非文本数据的机制

      • 功能:能够实现把非文本信息编码成文本格式的数据,并且传输到对端以后还能还原回原有的格式;
  • http/1.1:增强了缓存功能;spdy

  • http/2.0:rfc 7540

工作模式:

  • http请求报文:http request

  • http响应报文:http response

    • 一次http事务: 请求<- - ->响应
  • web资源:web response

    • 静态资源(无需server做出额外处理):如 .jpg, .png, .gif, .html, .txt, .js, .css, .mp3, .avi;

    • 动态资源(server需要通过执行程序做出处理,发送给client的是程序的运行结果):如 .php, .jsp;

      • 注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求;
  • 资源的标识机制:URL(Uniform Resource,统一资源定位符)

    • locator:用于描述服务器某特定资源的位置
      例如:http://www.sina.com.cn/index.html
      格式:Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]

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

  1. 建立或处理连接:接受请求或拒绝请求;

  2. 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求过程;
    并发访问响应模型:

    • [1] 单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;多个请求被串行响应;

    • [2] 多进程I/O结构:并行启动多个进程,每个进程响应一个请求;

    • [3] 复用I/O结构:一个进程响应N个请求

      • 多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
      • 事件驱动:event-driven,一个进程直接处理N个请求;
    • [4] 复用的多线程I/O结构:启动M(多个)个进程,每个进程响应N个请求;响应的请求数量M*N

  3. 处理请求:对请求报文进行分析,获取客户端请求的资源及请求方法等相关信息;

    • 解析后的报文信息首部称为元数据,格式如下:

      Host:www.magedu.com 请求的主机名
      Connection:连接状态

    • method(资源传递方法):

      • GET:从服务器获取一个资源
      • HEAD:只从服务器获取文档的响应首部
      • POST:向服务器发送要处理的数据
      • PUT:将请求的主体部分存储在服务器上
      • DELETE:请求删除服务器上指定的文档
      • TRACE:追踪请求到达服务器中间经过的代理服务器
      • OPTIONS:请求服务器返回对指定资源支持使用的请求方法;访问资源:获取请求报文中请求的资源
    • http请求处理中的连接状态(connection):

      • keep-alive:保持连接,长连接
      • close:非保持连接,短连接
  4. 访问资源:获取请求报文中的资源;

    • web服务器,即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果;这些资源通常应该放置于本地文件系统某路径下;此路径称为DocRoot;
      例:在/var/www/html/路径下的:images/logo.jgp
      http://www.magedu.com/images/logo.jgp

    • web服务器的资源路径映射方式:

      • [1] docroot
      • [2] alias
      • [3] 虚拟主机的docroot
      • [4] 用户家目录的docroot
  5. 构建响应报文:根据用户请求的资源MIME类型以及URL重定向进行报文响应;

  6. 发送响应报文;

  7. 记录日志

http服务程序

  • 常见的服务程序:
    httpd(Apache):功能丰富、稳定性能极佳;
    nginx
    lighttpd

  • 应用程序服务器:
    IIS:.Net
    tomcat:.jsp

  • httpd的安装和使用:
    ASF:Apache software foundation,阿帕奇软件基金会;

    • httpd是基于HTTP协议的服务软件,是由伊利诺大学的国家超级电脑应用中心开发的
    • apache是一个改良过的httpd软件,是由一群志同道合的技术爱好者发起修改,寓意为A path server(一个修改过的服务器);并且是开源的,属于Apache 软件基金会的一个项目,后来更名为httpd。
httpd的特性:
  • 高度模块化:Core + modules

  • 动态链接库DSO:dynamic shared object

  • 多路处理模块MPM:Multipath Processing Modules

    • prefork :多进程模型,每个进程响应一个请求;一个主进程辅助生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,所示等待请求到达;最大不会超过1024个;

    • worker:多进程多线程模型,每个线程响应一个请求;

      • 一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程处理;
      • 多个子进程:每个子进程辅助生产多个线程;
      • 每个线程:负责响应用户请求;
      • 并发响应数量:M*N; M:子进程数量;N:每个子进程所能创建的最大线程数量
    • event:事件驱动模型,多进程模型;每个线程响应N个请求;

      • 一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程处理;
      • 子进程:基于事件驱动机制直接响应多个请求;
        httpd-2.2:仍为测试使用模型;
        httpd-2.4:event可生成环境中使用

httpd的程序版本:

  • httpd 1.3:官方已经停止维护
  • httpd 2.0:
  • httpd 2.2:
  • httpd 2.4:目前最新稳定版;

httpd的功能特性:

  1. CGI:Common Gateway Interface,通用网关接口;
  2. 虚拟主机:基于IP、Port、FQDN的虚拟主机;
  3. 反向代理
  4. 负载均衡
  5. 路径别名
  6. 丰富的用户认证机制:如basic和 digest
  7. 支持第三方模块

安装httpd:

  • rpm包:CentOS发行版中直接提供;yum install -y httpd
  • 编译安装:定制新功能,或其他原因;

CentOS 6:httpd-2.2

  • 程序环境:

    • 配置文件:

      • /etc/httpd/conf/httpd.conf
      • /etc/httpd/conf.d/*.conf
    • 服务脚本:

      • /etc/rc.d/init.d/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
    • 模块文件路径:

      • `/usr/lib64/httpd/modules
    • 服务控制和启动:

      • chkconfig httpd on | off
      • service {start | stop | restart | status | configtest | reload} httpd

CentOS 7 :httpd-2.4

  • 程序环境:

    • 配置文件:

      • /etc/httpd/conf/httpd.conf
      • /etc/httpd/conf.d/*.conf
      • 模块相关的配置文件:/etc/httpd/conf.modiles.d/*.conf
    • systemd unit file:

      • /usr/lib/.systemd/system/httpd.service
    • 主程序文件:

      • /usr/sbin/httpd httpd-2.4支持MPM的动态切换;
    • 日志文件:

      • /var/log/httpd:

        • access_log:访问日志
        • error_log:错误日志
    • 站点文档:

      • /var/www/html
    • 模块文件路径:

      • /usr/lib64/httpd/modules
    • 服务控制:
      • systemctl enable | disable httpd.service
      • systemctl {start | stop | restart | status} httpd.service`

httpd-2.2的常用配置

主配置文件:/etc/httpd/conf/httpd.conf
使用grep命令获取配置文件分段:

[root@localhost ~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment               全局配置环境
### Section 2: 'Main' server configuration      主服务器配置段
### Section 3: Virtual Hosts                    虚拟服务器配置

注意:‘Main’ server 和Virtual Hosts不能同时启用;默认启用的是‘Main’ server
常用配置:

  1. 修改监听的IP和PORT
    Listen [IP:]PORT

    • [1] 省略IP表示为0.0.0.0;
    • [2] Listen 指令可重复出现多次;
      Listen 80
      Listen 8080
    • [3] 修改监听socket,重启服务进程方可生效;
  2. 持久连接相关:

    • Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行;但是总归要断开,如何断开?可以通过对连接数量和时间限制来控制;比如:限制100个连接,超过100个后会断开最先的连接;限制连接60秒后没有进行任何操作则断开;
    • 副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
    • 折衷的改进办法:使用较短的持久连接时长,以及较少的请求数量;
    • 持久连接的相关参数:
        KeepAlive Off|On                           #关闭或打开持久连接
        MaxKeepAliveRequserts 100         #最大持久连接请求数量
        KeepAliveTimeout 15                    #连接时长,单位秒;httpd-2.4支持毫秒

        测试:
                telnet WEB_SERVER_IP PORT
                GET  /URL  HTTP/1.1
                Host:WEB_SERVER_IP

  1. MPM:多路处理模块,并发请求响应的不同实现,三种模式:prefork、 worker、 event;
    httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;

    • CentOS 6的rpm包专门提供了3个应用程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现对不同的MPM机制的支持

    • 确认现在使用的是那个程序文件的方法:

      • ps aux | grep httpd #默认是用的为/usr/sbin/httpd,其为prefork的模块
    • 查看httpd程序的模块列表:

      • 查看静态编译的模块:httpd -l
      • 查看静态编译及动态编译的模块:httpd -M
    • 更换使用httpd程序,以支持其他MPM机制:vim /etc/sysconfig/httpd
      修改此行:HTTPD=/usr/sbin/httpd.{worker,event}

    • 注意:重启服务进程方可生效

    httpd.conf配置文件当中对prefork和worker进行了选项和参数的描述,如下:

     MPM配置:
        profork的配置
        
        StartServers        8         #进程启动时创建多少个子进程等待访问
        MinSpareServers     5         #最小空闲进程数 
        MaxSpareServers    20         #最大空闲进程数
        ServerLimit       256         #生命周期内最多允许存在多少个子进程  
        MaxClients        256         #最多允许创建的子进程数,与ServerLimit等同
        MaxRequestsPerChild   4000    #每个子进程最多处理多少个请求后就得强制关闭
         

        worker配置
        
        StartServer      4
        MaxClients       300       #最大并发客户端连接数
        MinSpareThreads  25        #最小空闲线程
        MaxSpareThreads  75        #最大空闲线程
        ThreadsPerChild  25        #每个服务器进程中工作线程的常数
        MaxRequestPerChild 0       #服务器进程服务的最大请求数

  1. DOS:配置指定实现模块加载,格式如下:
    LoadModule
    模块路径:可使用相对路径;相对于ServerRoot指令只想的位置而言
    注意:建议使用service httpd reload 重新装载配置文件

  2. 定义‘Main’Server 的文档页面路径
    DocumentRoot " "

    • 文档路径映射:DoucmentRoot指向的路径为URL路径的起始位置;其相当于站点URL的根路径;
      (FileSystem) /web/host1/index.html --> (URL) /index.html
  3. 站点路径访问控制
    可基于来源地址或者基于账号两种访问控制机制;定义的方式有两种:

    • 文件系统路径: ...

    • URL路径: ...

  4. Directory中“基于来源地址”的访问控制定义

    • [1] Options:

      • Indexes:当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用。
      • FollowSymLinks:如果某页面文件是指向DocumentRoot之外的路径上的其他文件时,将直接显示目标文件的内容;
      • None:none;
      • All:所有的都启用;
    • AllowOverride:与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中; None: All:

    • order和allow、deny

      • Order:定义生效次序;写在后面的表示默法则;

      • Order Allow Deny:只有明确Allow的来源地址,才允许访问,其他的均为Deny

      • Order Deny Allow:

        • Allow from:允许访问的来源地址
        • Deny from:拒绝访问的来源地址
                例:
                        Order Allow Deny
                        Deny from 172.16.100.2
                        Allow from 172.16.0.0/16                                
                            from后面可跟的地址格式:
                                    IP地址:
                                    网络地址:
                                            172.16
                                            172.16.0.0
                                            172.16.0.0、16
                                            172.16.0.0/255.255.0.0

  1. 定义默认的主页面
    DirectoryIndex index.html index.html.var
    自左而右,找到首次匹配到的文件;就将其作为默认主页返回。

  2. 定义路径别名

    • 格式:
      Alias /URL/ "/PATH/TO/SOMEDIR/"

    • 例如:

         DocumentRoot “/var/www/html”
         我们访问:http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
         那么我们的文件路径为:/var/www/html/download/bash-4.4.2-3.el6.x86_64.rpm
         设置别名:Alias  /download/  "/rpms/pub/"
         在访问就变成:http://www.magedu.com/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm

  1. 定义默认字符集
    AddDefaultCharset UTF-8
    中文字符集:GBK, BG2312,GB18030
  2. 日志设定
*   日志类型:访问日志 和 错误日志
*   错误日志 
    `ErrorLog logs/error_log` 
    `LogLevel warn` 
    `Possible values include : debug,info,notice,warn,error,crit,alert,emerg`
*   访问日志;通过关键字LogFormat来定义一个日志格式 
    `LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined` 
    该格式还有一个名称叫combined,一次在后面引用格式的时候直接引用改格式的名称,通过关键字Customlog来设置访问日志的存放路径及格式信息 
    `CustomLog logs/access_log combined` 

    *   %h:Remote host,客户端主机ip地址
    *   %l:Remote logname(from identd,if supplied).客户用户通过identd登录时使用名称;一般为-
    *   %u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
    *   %t:服务器收到请求时的时间;
    *   %r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
    *   %>s:响应状态码;
    *   %b:响应报文的大小,单位是字节;不包括响应报文的http首部;
    *   %{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
    *   %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
  1. 基于用户的访问控制
*   认证质询: 
    WWW-Authenticate : 响应码为401,拒绝客户端请求, 并说明要求客户端提供账号和密码;
*   认证: 
    Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源; 

    *   认证方式有两种: 

        *   basic:明文
        *   digest:消息摘要认证
*   安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
*   用户的账号和密码存放于何处? 

    *   虚拟账号:仅用于访问某服务时用到的认证标识
    *   存储:文本文件、SQL数据库、ldap目录存储
*   basic认证配置示例: 

    *   [1]定义安全域 
        ` 
        Options None 
        AllowOverride None 
        AuthType Basic 
        AuthName "String" 
        AuthUserFIle “/PATH/TO/HTTPD_USER_PASSWD_FILE” 
        Require user username1 username2 ... 
        ` 
        允许账号文件中的所有用户登录访问: 
        `Require valid-user`
    *   [2]提供账号和密码存储(文本文件) 
        使用专用命令完成此类文件的创建及用户管理 
        `htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username 
        -c: 自动创建此处指定的文件,因此,仅应该在此文件不存在时使用; 
        -m:md5格式加密 
        -s:sha格式加密 
        -D:删除指定用户`
*   另外:基于组账号进行认证; 
    *   [1]定义安全域 
        ` 
        Options None 
        AllowOverride None 
        AuthType Basic 
        AuthName "String" 
        AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" 
        AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" 
        Require group grpname1 grpname2 ... 
        `
    *   [2] 创建用户账号和组账号文件; 
        组文件:每一行定义一个组 
        `GRP_NAME:username1 username2 ...`
  1. 虚拟主机
*   站点标识:socket 

    *   IP相同,但端口不同
    *   IP不同,但端口均为默认端口
    *   FQDN不同; 

        *   请求报文中首部
        *   Host:www.magedu.com
*   httpd三种类型的虚拟主机:

    *   基于IP:为每个虚拟主机准备至少一个ip地址;
    *   基于port:为每个虚拟主机使用至少一个独立的port;
    *   基于FQDN:为每个虚拟主机使用至少一个FQDN;
*   注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用‘Main’主机;

    *   禁用方法:注释中心主机的DocumentRoot指令即可
*   虚拟主机的配置方法: 
    ` 
    server Name FQDN 
    DocumentRoot "" 
    `

    *   其他可用指令: 
        `serverAlias:虚拟主机的别名;可多次使用 
        Errorlog:错误日志 
        CustomLog:访问日志 
         
        ... 
         
        Alias 
        ...`
*   基于IP的虚拟主机示例:后续web service 学习笔记2中记录

你可能感兴趣的:(Web Service学习笔记1)