http协议和apache入门

http协议概览

htpp(Hyper Text Transfer Protocol,80/tcp)协议工作在应用层,基于tcp/ip协议。

http协议个版本介绍

  • http/0.9:1991,原型版本,功能简陋,只有一个命令GET。GET /index.html,服务器只能回应HTML格式字符串,不能回应别的格式

  • http/1.0:1996年5月,支持cache,MIME,method

    每个TCP链接只能发送一个请求,发送数据完毕,链接就关闭,如果还要请求其他资源,就必须再建立一个连接
    引入了POST命令和HEAD命令
    头信息是ASCII码,后面的数据可为任何格式,服务器回应是会告诉客户端,数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME即多用途互联网邮件扩展,每个值包括一级类型和二级类型,预定义类型,也可以自定义类型,常见Content-Type值:text/xml image/jpeg audio/mp3

  • http/1.1:1997年1月,http/1.1效率不高

    引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求服用,不用声明Connection:keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接
    引入了管道机制(pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率
    新增方法:PUT、PATCH、OPTIONS、DELETE
    同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成”队头堵塞”(Head-of-line blocking)
    为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接。网页优化技巧,如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等
    HTTP 协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响速度

  • http/2.0:2015年

    头信息和数据体都是二进制,称为头信息和数据帧
    复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免你了”对头堵塞”,此双向的实时通信同为多工(Multiplexing)
    引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送,客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送字段,只发送引号,提高速度
    http/2允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)

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

建立连接:接受或拒绝连接请求
接受请求:接受客户端请求报文中对某资源的一次请求的过程
web访问响应模型(Web I/O)

  • 单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应

  • 多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求

  • 复用I/O结构:启动一个进程,同时响应N个连接请求

    实现方法:多线程模型和事件驱动

    多线程模型:一个进程生成N个线程,每线程响应一个连接请求
    事件驱动:一个进程处理N个请求
  • 复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M* N个请求

处理请求:服务器队请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主题部分队请求进行处理

元数据:请求报文首部
<method> <url> <version>
headers 格式name:value
<request body>
示例
    Host:www.msq.com 请求主机的名称
    server:Apache/2.4.7
http常用的请求方法 method
    GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

访问资源:服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责详情求者提供对方请求的静态资源,或动态运行后生成的资源

资源放置于本地文件系统特定的路径:DcoRoot
DocRoot --> /var/www/html
/var/www/html/images/logo.jpg

web服务器资源路径映射方式
docroot
alias
虚拟主机docroot
用户家目录docroot

构建响应报文:一旦服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含响应状态码,响应首部,如果生成了响应主题的话,还包括响应主体。

  • 响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括

    描述了响应主体MIME类型的Content-Type首部
    描述了响应主体长度的Content-Length
    实际报文的主体内容

  • URL重定向:web服务器构建的响应并非客户端请求的资源,而是资源另外一个访问路径

    永久重定向:http://www.360buy.com
    临时重定向:http://www.taobao.com

  • MIME类型:web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来

    魔法分类:

    Apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名时

    显式分类:

    可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型

    类型协商:

    有些Web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web服务器,使其可以通过与用户的协商来决定使用哪种格式(及相关的MIME类型)"最好"

发送响应报文:Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束了

记录日志:最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务

有状态和无状态

客户端发出的响应和得到的请求会受到之前的请求和响应的影响(即请求和请求之间有关联)的连接称为有状态的连接,反之称为无状态的连接。http协议是无状态的连接。

http报文语法格式

request报文

<method> <request-URL> <version>
<headers>
<entity-body>

response报文

<version> <status> <reason-phrase>
<headers>
<entity-body>

method: 请求方法,标明客户端希望服务器对资源执行的动作GET、HEAD、POST等

httpd介绍

20世纪90年代初,国家超级计算机应用中心NCSA开发
1995年开源社区发布apache(a patchy server)
ASF: apache software foundation
FSF:Free Software Foundation
特性

  • 高度模块化:core + modules
  • DSO: Dynamic Shared Object 动态加/卸载
  • MPM:multi-processing module多路处理模块

MPM工作模式

prefork:多进程I/O模型,每个进程响应一个请求,默认模型

  • 一个主进程:生成和回收n个子进程,创建套接字,不响应请求
  • 多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个

worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型

  • 一个主进程:生成m个子进程,每个子进程负责生成n个线程,每个线程响应一个请求,并发响应请求:m* n

event:事件驱动模型(worker模型的变种)

  • 一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m* n,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力

httpd功能特性

虚拟主机

  • IP、Port、FQDN

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

  • 反向代理

  • 负载均衡

  • 路径别名

  • 丰富的用户认证机制

    basic
    digest

  • 支持第三方模块

httpd-2.4新特性

  • MPM支持运行为DSO机制;以模块形式按需加载
  • event MPM生产环境可用
  • 异步读写机制
  • 支持没模块及每目录的单独日志界别定义
  • 每请求相关的专用配置
  • 增强型的表达分析式
  • 毫秒级持久连接时长定义
  • 基于FQDN的虚拟主机不需要NameVirutalHost指令
  • 新指令,AllowOverrideList
  • 支持用户自定义变量
  • 更低的内存消耗

httpd安装

yum安装

1
$ yum -y install httpd

编译安装:定制或特殊需求

centos7程序环境:httpd-2.4
配置文件

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

检查配置语法
-httpd -t

httpd程序环境

服务单元文件

  • /usr/lib/systemd/system/httpd.service

    配置文件

    /etc/sysconfig/httpd
  • 模块文件路径

    /etc/httpd/modules
    /usr/lib64/httpd/modules

  • 主程序文件:

    /usr/sbin/httpd

  • 主进程文件:

    /etc/httpd/run/httpd.pid

  • 日志文件目录:

    /var/log/httpd

    access_log: 访问日志
    error_log:错误日志
  • 帮助文档包:

    httpd-manual

  • httpd配置文件的组成:

    主要组成

    Global Environment
    Main server configuration
    virtual host
  • 配置格式:directive value

    directive 不区分字符大小写
    value 为路径时,是否区分大小写,取决于文件系统

  • 官方帮助

    http://httpd.apache.org/docs/2.4/

httpd配置实战

httpd的条件式应用标签

  • DocumentRoot 网页url的根

    < Directory “”>
    control-condition
    < /Drectory>
    < file “”>
    < /file>
    < DirectoryMatch>
    < /DirectoryMatch>
    默认文件夹/文件不允许访问,必许增加控制语句才可以访问

基于用户的访问控制

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

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

  • 认证方式

    basic:明文
    digest:消息摘要认证,兼容性差

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

  • 用户的账号和密码

    虚拟账号:仅用于访问某服务时用到的认证标识
    存储:文本文件,SQL数据库,ldap(轻量目录访问协议)目录存储,nis等

  • 示例:使用用户认证

    < Drectory “/path”>
    options +indexes #指明的URL路径不存在与定义的页面主页资源相符的资源文件时,返回索引列表给用户
    AllowOverride None #是否允许指定目录下的.htaccess中的指令覆盖之前的配置指令
    AuthType basic #认证方式
    AuthName “string” #认证对话框提示信息
    AuthUserFile “/path/to/httpd_user_passwd_file” #存放认证用户的文件
    Require user user1 user2… #允许那些用户认证登录,require valid-user表示.htaccess中的用户均可登录
    < /Direcroty>

    生成用于认证的用户

    [root@apache conf.d]#htpasswd -b  /etc/httpd/conf/.htpasswd jerry centos
  • 示例:使用用户组认证

    < Drectory “/path”>
    options +indexes #指明的URL路径不存在与定义的页面主页资源相符的资源文件时,返回索引列表给用户
    AllowOverride None #是否允许指定目录下的.htaccess中的指令覆盖之前的配置指令
    AuthType basic #认证方式
    AuthName “string” #认证对话框提示信息
    AuthgroupFile “/path/to/httpd_group_passwd_file” #存放认证用户的文件
    Require group group1 group2 group3… #允许那些用户组认证登录,require
    < /Direcroty>

    创建用于认证的用户组文件,并将生成的用户加入组

    [root@apache conf]#vi .htgroup
    disny : tom jerry

    htpasswd命令介绍

    htpasswd用于管理httpd认证的用户并自动成相关文件
    htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
    -c 自动创建文件,仅应该在文件不存在时使用
    -p 明文密码
    -d CRYPT格式加密,默认
    -m md5格式加密
    -s sha格式加密
    -D 删除指定用户

路径别名

通过定义路径别名,可以让用户访问不在DcumentRoot定义的根目录下的其他路径

  • 示例

    如下配置表示,当用户访问192.168.34.108/bbs/时,实际是在访问服务器上的/var/www/html/文件夹下的文件

    DocumentRoot /data/www/html/
    <Directory "/data/www/html">
            options none
            allowoverride none
            require all granted                
    </Directory>
    Alias /bbs/ /var/www/html/
    <Directory "/var/www/html/">
            options none
            AllowOverride none
            Require all granted
    </Directory>

httpd日志

httpd访问使用LogFormat format logformat_name定义日志格式
使用Cuetomlog logs/access_log format_name来启用某种格式的日志

  • format的常用选项

    %h 客户端IP地址
    %l 远程用户,启用mod_ident才有效,通常为减号“-”
    %u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”
    %t 服务器收到请求时的时间
    %r First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本
    %>s 响应状态码
    %b 响应报文的大小,单位是字节;不包括响应报文http首部
    %{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的
    %{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序

httpd错误日志有两部分组成,

  • Errorlog “logs/error_log” #错误日志存放位置
    LogLevel warn #报警级别,此配置代表warn及以上的报警都会记录

虚拟主机配置

通过虚拟主机的配置,可以实现一台服务器提供多个web站点的功能,提高了资源利用率,并且每个主机都可以使用自己专用的日志,别名,等等资源。

  • 基于ip地址的虚拟主机配置

    如下配置,当访问192.168.34.108时,实际访问的是主机上/data/vhost1文件夹下的文件,当访问172.18.132.240时,实际访问的是主机上/data/vhst2文件夹下的内容

    <VirtualHost 192.168.34.108:80>                               
    ServerName www.msq.com
    DocumentRoot "/data/vhost1"
    <Directory "/data/vhost1">
            Options None
            AllowOverride None
            Require all granted
    </Directory>
    </Virtualhost>
    <VirtualHost 172.18.132.240:80>
            ServerName bbs.msq.com
            DocumentRoot "/data/vhost2"
            <Directory "/data/vhost2">
                    Options None
                    AllowOverride None
                    Require all granted
            </Directory>
    </Virtualhost>
  • 基于端口的虚拟主机的配置,当访问192.168.34.108:8080时,实际访问的是/data/vhost1文件夹下的文件

    如下配置实现了基于端口的虚拟主机的配置

    Listen 8080
    <VirtualHost 192.168.34.108:8080>
            ServerName www.msq.com
            DocumentRoot "/data/vhost1"
            <Directory "/data/vhost1">
                    Options None
                    AllowOverride None
                    Require all granted
            </Directory>
    </Virtualhost>
  • 基于主机名的虚拟主机配置,此模式下需要使用DNS解析,

    如下配置实现了基于主机名的虚拟主机的配置,当访问www.msq.com时,访问的是/data/vhost1文件夹下的资源,当访问bbs.msq.com时,访问的是/data/vhost2文件夹下的资源。

    <VirtualHost *:80>                                           
    ServerName www.msq.com
    DocumentRoot "/data/vhost1"
    <Directory "/data/vhost1">
            Options None
            AllowOverride None
            Require all granted
    </Directory>
    </Virtualhost>
    <VirtualHost *:80>
            ServerName bbs.msq.com
            DocumentRoot "/data/vhost2"
            <Directory "/data/vhost2">
                    Options None
                    AllowOverride None
                    Require all granted
            </Directory>
    </Virtualhost>

持久连接配置

httpd-2.4支持毫秒级持久连接时长定义,全局配置;打开保持连接可以提高请求和响应的效率,但是当并发量较大时,会降低并发能力,需要在这之间寻找平衡。
KeepAlive on #开启持久连接
KeepAlive Timeout #ms #持久连接时长
MaxKeepAliveRequests 100 #最大持久链接数

mod_deflate模块

使用mod_deflate模块可以压缩页面优化传输速度
使用场景

  • 节约带宽,额外消耗CPU;同时,可能有些叫老浏览器不支持

  • 压缩适于压缩的资源,例如文本文件

  • 使用mod_deflate模块方法

    加载模块,可以在/etc/httpd/conf.moduels.d/文件夹下新建一个配置文件用于配置(htttpd-2.4默认已经加载该模块)

    LoadModule deflate_module modules/mod_deflate.so

    配置对哪些资源进行压缩,可以创建一个/etc/httpd/conf.d/deflate.conf的文件写入以下配置

    SetOutputFilter DEFLATE

    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

    设置压缩比,压缩比越大,消耗CPU越严重,压缩后的页面更小

    Level of compression (Highest 9 - Lowest 1)
    DeflateCompressionLevel 9

    排除特定旧版本的浏览器,不支持压缩

    Netscape 4.x 只压缩text/html
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    Netscape 4.06-08三个版本 不压缩
    BrowserMatch ^Mozilla/4.0[678] no-gzip
    Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压
    缩。如果用户代理首部匹配字符串“MSIE”(“B”为单词边界”),就关闭
    之前定义的限制
    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

status页面

status页面是由http内建模块提供的一项功能,允许用户查看服务器状态,这是个比较危险的设置,应该做访问控制,只允许内部ip进行浏览,或者通过认证才能访问。

  • 配置

    查看当前httpd是否加载了status模块(默认加载)

    [root@apache ~]#httpd -M|grep status
     status_module (shared)

    如果未加载,可在/etc/httpd/conf.moduels.d/目录下添加配置文件,写入如下配置

    LoadModule status_module modules/mod_status.so

    添加配置以启动status功能,可以增加全局设置或者只对某个虚拟主机进行配置(以在虚拟主机中配置为例)

     <VirtualHost *:80>
    ServerName blog.msq.com
    DocumentRoot "/data/vhost3"
    <Directory "/data/vhost3">
            Options None
            AllowOverride None
            Require all granted
            </Directory>
            <Location "/status">
                    SetHandler server-status
                    require ip 192.168.34                            
            </Location>
    </Virtualhost>

https

https: http over ssl
SSL会话的简化过程

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

  • 服务器端发送证书以及选定的加密方式给客户端

  • 客户端取得证书并进行证书验证

    如果信任给其发证书的CA

    验证证书来源的合法性;用CA的公钥解密证书上数字签名
    验证证书的内容的合法性:完整性验证
    检查证书的有效期限
    检查证书是否被吊销
    证书中拥有者的名字,与访问的目标主机要一致
  • 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换

  • 服务用此密钥加密用户请求的资源,响应给客户端

  • 注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机

https的实现

为服务器申请数字证书

  • 测试:通过实践CA发证书

    创建私有CA
    在服务器创建证书件数请求
    CA签证

配置httpd支持使用ssl,及使用的证书

  • yum -y install mod-ssl

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

    DocumentRoot
    ServerName
    SSLCertificateFile
    SSLCertificateKeyFile

测试基于httpd访问响应的主机
可以使用浏览器或openssl客户端测试

  • openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

https实战

生成私钥

1
[root@apache ssl]#(umask 066;openssl genrsa -out cakey.pem 2048)

生成自签名证书

1
[root@apache ssl]#openssl req -new -x509 -key cakey.pem -out cacert.crt -subj "/CN=blog.msq.com/O=devops" -days 3650

安装mod-ssl模块

1
[root@apache ssl]#yum -y install mod_ssl

修改/etc/httpd/conf.d/ssl.conf配置文件,将以下内容更改

SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.crt

重启httpd后,就实现了https连接。

http重定向到https

将http请求转发至https的URL上

  • 在配置文件加上下述语句

    Redirect [status] URL -path URL

  • status状态

    Permanent: 返回永久重定向状态码301
    Temp:返回临时重定向状态码302,此为默认值

  • 示例

    Redirect temp / http://blog.msq.com

配置

1
2
3
4
[root@apache ~]#ll /var/www/html/
total 12
-rw-r--r-- 1 root root 8435 Dec 14 18:59 access_log
drwxr-xr-x 4 root root 24 Oct 20 09:43 centos

http相关工具

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…]

常用options如下

-A/--user-agent <string> 设置用户代理发送给服务器
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
-k/--insecure 允许忽略证书进行 SSL 连接
--compressed 要求返回是压缩的格式
-H/--header <line>自定义首部信息传递给服务器
-i 显示页面内容,包括报文首部信息
-I/--head 只显示响应报文首部信息
-D/--dump-header <file>将url的header信息存放在指定文件中
--basic 使用HTTP基本认证
-u/--user <user[:password]>设置服务器的用户和密码
-L 如果有3xx响应码,重新发请求到新位置
-O 使用URL中默认的文件名保存文件到本地
-o <file> 将网络文件保存为指定的文件中
--limit-rate <rate> 设置传输速度
-0/--http1.0 数字0,使用HTTP 1.0
-v/--verbose 更详细
-C 选项可对文件使用断点续传功能
-c/--cookie-jar <file name> 将url中cookie存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服务器地址
-X/--request <command> 向服务器发送指定请求方法
-U/--proxy-user <user:password> 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
--data/-d 方式指定使用POST方式传递数据
-b name=data 从服务器响应set-cookie得到值,返回给服务器

elinks工具

用法

  • elinks [OPTION]… [URL]…

常用options

-dump: 非交互式模式,将URL的内容输出至标准输出
-source:打印源码

httpd自带的工具程序

htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl:httpd自带的服务控制脚本,支持start和stop
rotatelogs:日志滚动工具,如果单个日志太大会影响服务器性能,日志滚动可以在日志文件达到一定大小或规定时间时进行日志滚动。

  • access.log –> access.log,access.1.log –> access.log,access.1.log,access.2.log

httpd的压力测试工具

ab,webbench,http_load,seige

  • ab,webbench,http_load,seige
  • jmeter 开源
  • loaddrunner 商业,有相关认证
  • tcpcopy 网易,复制生产环境中的真是请求,并将之保存

ab介绍
ab时httpd自带的一个压力测试工具,来自httpd-tools包

用法

  • ab [options] url

常用options

-n:请求总数
-c:模拟的并行数
-k:以持久连接模式测试

ulimit -n # 调整能打开的文件数