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/mp3http/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.comMIME类型: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 为路径时,是否区分大小写,取决于文件系统官方帮助
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 | [root@apache ~]#ll /var/www/html/ |
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 # 调整能打开的文件数