web 服务介绍

web服务时一种应用程序的服务,它所提供的最主要的信息是一种超文本标记语言(HTML)、多媒体资源(如:视频、图片、音乐等)。HTML是一种纯文字的文本信息,通过所谓的标签来规范所要显示的内容格式,在客户端通过浏览器的形式对HTML及多媒体资源进行解析,然后呈现在终端上。主要由http和https协议实现

http协议

HTTP是一个属于应用层的面向对象的协议,B/S架构,由于其简单、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断的完善和扩展。

http协议版本

HTTP/0.9
HTTP/1.0:cache,MIME,method
        MIME:Multiurpose Internet Mail Extesion
        method:GET HEAD POST PUT DELETE TRACE OPTIONS
HTTP/1.1:增强了缓存功能
HTTP/2.0:采用二进制格式 完全多路复用 报头压缩 响应主动“推送”到客户端缓存

http协议的特点

1.c/s
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器练习的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型有Centent-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

http端口

服务所使用的端口信息,http服务默认为80端口,https默认为443端口,而这些默认的端口是可省略的,协议自身会去识别,只有当认为更改服务器服务监听端口时需要在客户端手动指定端口,否则会指向默认端口。

默认端口

IANA(The Internet Assigned Numbers Authority,互联网数字分配机构)是负责协调一些使Internet正常运作的机构。同时,由于Internet已经成为一个全球范围的不受集权控制的全球网络,为了使网络在全球范围内协调,存在对互联网一些关键的部分达成技术共识的需要,而这就是IANA的任务。 
0-1023:众所周知,永久地址分配给固定的应用使用,特权端口;
1024-41951:为注册端口,但要求不是特别严格,分配给程序注册为某应用使用; 3306/tcp, 11211/tcp
41952+:客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在/proc/sys/net/ipv4/ip_local_port_range

socket

源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字。其用于标识客户端请求的服务器和服务。它是网络通信过程中端点的抽象表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的IP地址,本地进程的协议端口,远地主机的IP地址,远地进程的协议端口。

socket类型

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套接字通信使用的一种地址

TCP协议的特性

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

TCP协议状态类型

CLOSED:关闭连接
LISTEN:监听
SYN_SENT:请求建立连接
SYN_RECV:接收请求连接
ESTABLISHED:已建立的连接
FIN_WAIT1:主动关闭tcp连接,等待对方响应
CLOSE_WAIT:在关闭连接之前还有数据要发送或其它事物
FIN_WAIT2:被动关闭tcp连接
LAST_ACK:等待对方确认关闭连接
TIMEWAIT:当主动发起关闭连接请求后,则进入TIME_WAIT

接收请求的模型

并发访问响应模型:
    单进程I/O模型:启动一个进程处理用户请求; 这意味着,一次只能处理一个请求,多个请求被串行响应
    多进程I/O结构:并行启动多个进程,每个进程响应一个请求
    复用的I/O结构:一个进程响应n个请求
            多线程模式:一个进程生成n个线程,一个线程处理一个请求
            事件驱动(event-driven):一个进程直接n个请求
    复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程
    响应的请求的数量:m*n

http完整请求处理过程

(1)建立或处理连接:接收请求或拒绝请求
(2)接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程
(3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息
(4)访问资源:获取请求报文中请求的资源
(5)构建响应报文
(6)发送响应报文
(7)记录日志

http事务

http请求报文首部
http响应报文首部

请求报文首部的格式:request
    <method> <URL> <VERSION>
    HEADERS(name value)

    <request body>

响应报文首部的格式:response
    <version> <status> <reason-phrase>
    HEADERS(name value)

    <entity-body>

method:请求方法,标明客户端希望服务器对资源执行的动作
    GET, HEAD, POST
version:
    HTTP/<major>.<minor>
status:
    三位数字:如200, 301, 302, 404, 502; 标记请求处理过程中发生的情况
reason-phrase:
    状态码所标记的状态的简要描述
headers:
    每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个value
entity-body:请求时附加的数据或响应时附加的数据

method

    GET:从服务器获取一个资源
   HEAD:只获取一个资源的首部,而不是内容
   POST:向服务器发送要处理的数据
    PUT:将请求的主体部分存储在服务器上
DELETE:请求删除服务器上指定的文档
  TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;

status

1xx:100-101,信息提示:
2xx:200-206,成功
3xx:300-305,重定向
4xx:400-415,错误类信息,客户端错误
5xx:500-505,错误类信息,服务端错误

常用的状态码:
    200:成功,请求的所有数据通过响应报文的entity-body部分发送:OK
    301:请求的URL指向的资源已被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
    302:与301相似,但在响应报文中通过Location指明资源现在所处临时新位置;Found
    304:客户端发出了条件是请求,但在服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端:Not Modified
    401:需要输入账号和密码认证方能访问资源:Unauthorized
    403:请求被禁止;Forbidden
    404:服务器无法找到客户端请求的资源:Not Found
    500:服务器内部错误;Internet Server Error
    502:代理服务器从后端服务器收到了一条伪响应;Bod Gateway
点此查看:状态码大全

headers

格式:
    name:value

首部的分类:
    通用首部
    请求首部
    响应首部
    实体首部
    扩展首部

通用首部:
    Date:报文的创建时间
    Connection:连接状态,如keep-alive,close
    Via:显示报文经过的中间节点
    Cache-Control:控制缓存
    Pragma:

请求首部:
    Accept:通知服务器自己可接收的媒体类型
    Accept-Charset:声明自己可接收的字符集
    Accept-Encoding:可接收的编码格式,如gzip
    Accept-Language:接收的语言

    Client-IP:客户端IP地址
    Host:请求的服务器名称和端口号
    Referer:包含当前正在请求的资源的上一级资源,表示从哪个页面跳转至此页面
    User-Agent:客户端代理(浏览器类型)

条件式请求首部:
        Expect:
        If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改
        If-Unmodified-Since:自从指定的时间之后,请求的资源是否没有被修改过
        If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配
        If-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag匹配

安全请求首部:
        Authorization:向服务器发送认证信息,如账号和密码
        Cookie:客户端向服务器发送cookie
        Cookie2

代理请求首部:
        Proxy-Authorization:向代理服务器认证

响应首部:
    信息性:
        Age:响应持续时长
        Server:服务器程序软件名称版本

    协商首部:某资源有多种表示方法时使用
        Accept-Ranges:服务器可接受的请求范围类型
        Vary:服务器查看的其它首部列表

    安全响应首部:
        Set-Cookie:向客户端设置cookie
        Set-Cookie2
        WWW-Authentication:来自服务器的对客户端的质询认证表单

实体首部:
    Allow:列出对此实体可使用的请求方法
    Location:告诉客户端真正的实体位于何处

    Content-Encoding:服务器表明了自己的压缩方法
    Content-Language:服务器告诉客户端自己响应的语言
    Content-Length:主体的长度
    Content-Location:实体真正所处的位置
    Content-Type:主体的对象类型

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

web资源

 静态资源(无须服务端做出额外处理):.jpg, .png, .gif, .html, .txt, .js, .css, .mp3, avi
动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序的运行结果):.php, .jsp
注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求

URL

Uniform Resouce Locator:用于描述服务器某特定资源的位置
    scheme://host[:port]/URL
        URL的根通常要映射为文件系统上的某路径
            DocumentRoot /var/www/html
                /index.html --> /var/www/html/index.html
                /p_w_picpaths/logo.jpg --> /var/www/html/p_w_picpaths/logo.jpg

            Alias /p_w_picpaths/ /data/imgs/
                /p_w_picpaths/logo.jpg --> /data/imgs/logo.jpg
                /p_w_picpaths/a/3.gif --> /data/imgs/a/3.gif

    基本语法:<scheme>://<user>:<password>@<host>:<port></path>;<params>?<query>#<frag>
   params:参数
     http://www.luyubo.com/bbs/hello;gender=f
   query:查询
     http://www.luyubo.com/bbs/item.php?username=tom&title=abc
   frag:标记

httpd的特性

高度模块化:core modules + standard modules + 3rd party modules
DSO:dynamic shared object
MPM:Multipath Processing Modules(多路处理模块)
    prefork:多进程模型,每个进程响应一个请求
        一个主进程:负责生成子进程及回收子进程; 负责创建套接字; 负责接收请求,并将其派发给某子进程进行处理
        n个子进程:每个子进程处理一个请求
        工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求; 最大空闲和最小空闲
    worker:多进程多线程模型,每线程处理一个用户请求
        一个主进程:负责生成子进程
        多个子进程:每个子进程负责生成多个线程
        每个线程:负责响应用户请求
        并发响应数量:m*n
            m:子进程数量
            n:每个子进程所能创建的最大线程数量
    event:事件驱动模型,多进程模型,每个进程响应多个请求
        一个主进程:负责生成子进程; 负责创建套接字; 负责接收请求,并将其派发给某子进程进行处理
        子进程:基于事件驱动机制直接响应多个请求

        httpd-2.2:仍为测试使用模型
        httpd-2.4:event可生产环境中使用

httpd 安装

1.我们这里使用yum来安装httpd程序(以centos 6.8为例)
[root@localhost ~]# yum -y install httpd
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|reload|configtest} httpd
centos7:
        模块相关配置文件:/etc/httpd/conf.modules.d/*.conf
        systemctl unit file:/usr/lib/systemd/system/httpd.service
        设置开机启动:
        systemctl enable|disable httpd.service
        管理选项:
        systemctl {start|stop|restart|status} httpd.service

httpd配置

ServerRoot "/etc/httpd"      配置文件存放路径
PidFile run/httpd.pid        pid存放路径
Listen 80                    设置监听端口
Include conf.d/*.conf        定义conf.d下面以.conf的配置文件
DocumentRoot "/var/www/html" 程序默认存放目录
DirectoryIndex index.html    程序默认首页
AddDefaultCharset UTF-8      设置默认编码 中文字符集:GBK, GB2312, GB18030

服务重载

配置完成之后一定要测试语法是否正确使用命令 httpd -t
确定语法没有任何问题之后直接重载服务即可 service httpd reload
centos 7:
        测试语法命令:httpd -t
        重载程序命令:systemctl reload httpd

保持链接

persistent connection:tcp连接建立后,资源获取完成之后不会断开连接,而是继续等待请求其它资源;
    可以通过数量限制或者时间限制来断开链接
        KeepAlive On|Off          #开启或关闭保持链接
        MaxKeepAliveRequests 100  #设置链接请求数限制
        KeepAliveTimeout 10       #设置超时时间限制,秒
    测试命令
        telnet 192.168.88.1 80
        GET /index.html HTTP/1.1
        host:192.168.88.1
        回车

MPM

httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定; CentOS 6的rpm包为此专门提供了三个应用程序文件,http(prefork),http.worker
httpd.event,分别用于实现对不同的MPM机制的支持;


prefork:进程模型,两级结构,master/worker,每worker处理一个请求;
worker:线程模型,三级结构,master/worker/thread,每thread处理一个请求;
  event:事件驱动线程模型,两级结构,master/worker,每worker响应多个请求;


默认使用的为/usr/sbin/httpd, 其为prefork的MPM模块
    查看httpd程序的模块列表
        查看静态编译的模块
            # httpd -l
        查看静态编译及动态编译的模块
            # httpd -M

更换使用httpd程序,以支持其它MPM机制;
    /etc/sysconfig/httpd
        HTTPD=/usr/sbin/httpd.{worker,event}

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

MPM配置:
    prefork的配置
        <IfModule prefork.c>
        StartServers       8   #启动服务器进程的数量
        MinSpareServers    5   #保持空闲的服务器进程的最少数量
        MaxSpareServers   20   #保持空闲的服务器进程的最大数量
        ServerLimit      256   #用于服务器的寿命MaxClients最大值
        MaxClients       256   #允许启动的服务器进程的最大数量
        MaxRequestsPerChild  4000  #服务器进程服务的最大请求数
        </IfModule>    

    worker的配置
        <IfModule worker.c>
        StartServers         4   #子进程初始数量
        MaxClients         300   #最大并发数
        MinSpareThreads     25   #保持空闲的最小工作线程数
        MaxSpareThreads     75   #保持空闲的最大工作线程数
        ThreadsPerChild     25   #在每个服务器进程中的恒定数目的工作线程
        MaxRequestsPerChild  0   #服务器进程服务的最大请求数
        </IfModule>

站点资源访问控制

httpd2.2

示例
基于文件系统目录路径
<Directory "/var/www/html"> <== 针对特定目录的限制!底下参数 很重要!
Options Indexes FollowSymLinks <== 建议拿掉 Indexes 比较妥当! AllowOverride None

# httpd 2.2
Order allow,deny
Allow from all
deny from 192.168.88.88

# httpd 2.4
Require all granted
Require not ip 10.252.46.165
</Directory>

基于文件系统文件路径
<files "">  
</files>

基于文件系统路径模式
<FileMatch "PATTERN">
</FileMatch>


基于URL路径
<Location "">
</Location>

基于URL路径模式
<LocationMatch "">
</LocationMatch>


    (1) Options(目录参数)
        此设定值表示在这个目录内能够让 Apache 进行的动作,亦即是针对 apache 的 程序的权限设定!主要的参数值有
            Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
            FollowSymLinks:允许跟踪符号链接文件所指向的源文件
            ExecCGI:是否允许运行CGI脚本
            MultiViews:多国语言的支持,可以依据客户端的语系而给予不同的语言显示呢
            None:没有任何权限
            All:拒绝全部
                       
    (2) AllowOverride(参数覆写)
        表示是否允许额外配置文件 .htaccess 的某些参数覆写?我们可以在 httpd.conf 内设定好所有的权限,不过如此一来若使用者自己的个人网页想要 修改权限时将会对管理员造成困扰。因此 Apache 默认可以让用户以目录底下 的 .htaccess 档案内覆写 <Directory> 内的某些功能参数。 这个项目则是在 规定 .htaccess 可以覆写的权限类型有哪些。常见的有:
            ALL:全部的权限均可被覆写
            AuthConfig:仅有网页认证 (账号密码) 可覆写
            Indexes:仅允许 Indexes 方面的覆写
            Limits:允许使用者利用 Allow, Deny 与 Order 管理可浏览的权限
            None:不可覆写,亦即让 .htaccess 档案失效
           
    (3) Order, Allow, Deny (能否登入浏览的权限):
        决定此目录是否可被 apache 的 PID 进程所浏览的权限设定!能否被浏览主要有 两种判定的方式:
           deny,allow:以 deny 优先处理,但没有写入规则的则默认为 allow
           allow,deny:以 allow 为优先处理,但没有写入规则的则默认为 deny
       所以在预设的环境中,因为是 allow,deny 所以预设为 deny (不可浏览),不过 在下一行有个 Allow from         all,allow 优先处理,因此全部 (all) 客户端皆可浏览
       
   (4) Require  granted,Deny( 能否登入浏览的权限  httpd 2.4)
       允许所有主机访问:Require all granted
       拒绝所有主机访问:Require all deny

       控制特定IP访问:
                Require ip IPADDR:授权指定来源地址的主机访问
                Require not ip IPADDR:拒绝指定来源地址的主机访问
               
                IPADDR:
                     IP: 172.16.100.2
                     Network/mask: 172.16.0.0/255.255.0.0
                     Network/Length: 172.16.0.0/16
                     Net: 172.16

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

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


虚拟主机

httpd2.2

编辑httpd配置文件
vim /etc/httpd/conf/httpd.conf 
#DocumentRoot "/var/www/html” 禁用中心主机
NameVirtualHost *:80 (httpd 2.4 不需要)
Include conf/extra/httpd-vhosts.conf  引用虚拟主机文件

编辑虚拟主机文件
示例
<Virtualhost *:80 >
             ServerAdmin webmaster@dummy-host.example.com
             DocumentRoot "/web/web1/"            
             ServerName localhost		    
	     ErrorLog logs/dummy-host.example.com-error_log
	     CustomLog logs/dummy-host.example.com-access_log common

        <Directory "/web/web1/">
             AllowOverride All
             Order allow,deny
             allow from all
        </Directory>
</Virtualhost>

虚拟主机三种类型
基于端口 
Virtualhost *:port
Listen port(多个端口 监听多个)

基于IP 
Virtualhost ip:port

基于域名 
Virtualhost *:80 
ServerName domain

httpd 2.4




日志设置

日志类型:访问日志和错误日志
错误日志:
    ErrorLog logs/error_log
    LogLevel warn
    Possible values include: debug, info, notice, warn, error, crit,alert, emerg.

访问日志:
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    CustomLog logs/access_log combined

        %h:客户端的IP地址
        %l:Remote User,通常为一个减号("_")
        %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"的值; 即发出请求的应用程序

访问验证控制

认证质询:
    WWW-Authenticate:响应吗为401,拒绝客户端请求,并说明要求客户端提供账号和密码

认证:
    Authorization:客户端用户填入账号和密码后再次发送请求报文; 认证通过时,则服务器发送响应的资源

认证方式有两种:
        basic:明文
        digest:消息摘要认证

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

用户账号和密码存放于何处?
    虚拟账号:仅用于访问某服务时用到的账号

存储:
        文本文件
        SQL数据库
        LDAP目录存储

basic认证配置示例:
      (1)定义安全域
            <Directory "/home/httpd">
                Options None
                AllowOverride None
                AuthType Basic     #认证类型
                AuthName "STRING"  #认证提示
                AuthUserFile "/etc/httpd/.passwd"  #认证的密码文件
                Require user test  #允许哪个用户访问
               #Require valid-user #允许账号文件中所有用户访问
            </Directory>

    (2)提供账号和密码存储(文本文件)
        使用专用命令完成此类文件的创建及用户管理
       #第一次需要使用-c创建指定的文件,第二次无须使用-c选项
            htpasswd -c -m /etc/httpd/.passwd  test
            htpasswd -m /etc/httpd/.passswd  test1
                -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
                -m:md5格式加密
                -s:sha格式加密
                -D: 删除指定用户
    另外:基于组账号组进行认证
        (1)定义安全域
            <Directory "/home/httpd">
                Options None
                AllowOverride None
                AuthType Basic
                AuthName "String"
                AuthUserFile "/etc/httpd/conf/.htpasswd"
                AuthGroupFile "/etc/httpd/.passwd_group" #编辑.passwd_group文件格式为每一行定义一个组
                Require group groupluyubo
            </Directory>

定义网站别名

格式:
    alias /URL/ "/PATH/TO/SOMEDIR"
定义alias:
    alias /test/ "/web/test/"
   
访问测试(下载/test/qq.exe)
   
使用上面定义的alias可以正常打开,说明我们的配置是正确的,下面贴出配置
<Virtualhost *:80 >
         ServerName www.fan2.com
         DocumentRoot "/web/web2/"
         Alias /test/ "/web/test/"
   
    <Directory "/web/web2/">
         AllowOverride All
         Order allow,deny
         allow from all
    </Directory>
   
</Virtualhost>


反向代理

ProxyRequests off
ProxyPass / 
ProxyPa***everse /  http://127.0.0.1:9528/


负载均衡

<Proxy balancer://mycluster>
    BalancerMember http://10.3.5.46:7004 loadfactor=3
    BalancerMember http://10.3.5.48:7004 loadfactor=3
    ProxySet lbmethod=byrequests
</Proxy>
ProxyRequests Off
ProxyPass / balancer://mycluster/

轮询方法
 lbmethod表示:负载载均衡策略。 
        lbmethod=byrequests 按照请求次数均衡(默认) 
        lbmethod=bytraffic 按照流量均衡 
        lbmethod=bybusyness 按照繁忙程度均衡(总是分配给活跃请求数最少的服务器)
        ProxyPass表示:所有的test请求都会重定向到balancer://mycluster/处理。balancer是内置负载。
        ProxyPa***everse表示:反向代理,也就是将所有的请求反向代理到负载均衡后的应用url路径中。
        stickysession表示:进行Session复制使用。