一、HTTP
http协议全称为超文本传输协议(hyper text transfer protocol),是一种应用层协议,监听在80/tcp。所谓超文本就是使用html编程语言开发的纯文本文件
1. 超文本标记语言
超文本标记语言(hyper text mark language)就是用来开发超文本文档的, 通过一些标签对文本进行修饰,客户端的浏览器引擎负责解析这些标签,将结果显示在浏览器上
<html>
<head>
<title> TITLE</title>
</head>
<body>
<h1></h1>
<p> lianjie... <a href="https://www.busyops.com"> lianjie... </a></p>
<h2></h2>
</body>
</html>
2. HTTP协议版本
HTTP/0.9
:最原型版本,有很多的严重的设计缺陷,仅能够实现简单的资源交互,不支持多媒体内容,所以由于过于简陋,很快就被HTTP/1.0版本取代HTTP/1.0
:这是第一个被真正广泛使用的版本,支持版本号、各种HTTP首部、HTTP请求的方法以及引入MIME,但仍然有很多问题,比如缓存机制设计的比较薄弱HTTP/1.1
:增强了缓存功能,引入了长链接机制spdy
:google为能够加速http协议的资源获取性能而专门设计的HTTP/2.0
:2.0借鉴了spdy的优势,对1.1进行了诸多改进,使得性能上有很大提升,所以google已经放弃对spdy的支持了
3. http事务
http的工作模式就是客户端发送一次请求、服务端回应一次响应,而一次请求和响应过程就叫做http事务
4. MIME机制(Multipurpose Internet Mail Extesion)
http是一种文本协议,意思是只能传输文本,任何要发送的内容通通会编码为艾斯克码再进行发送,但是图片是二进制格式的,强行将二进制编码为文本对方收到会乱码的,在早些时候http协议仅能够实现超文本浏览,没有任何图片内容。后来http协议当中引入了mime机制之后才能支持多媒体浏览的。mime早期是为了smtp协议而设计的,smtp是一种古老的邮件协议,早期的时候也是只能传输文本的,但后来人们需要发送附件、发一些非文本文件,mime就可以将非文本数据编码成文本,而后对方还能同样的反向机制还原回来
Web服务器构建响应报文时,会基于MIME机制对内容进行分类,以实现构建响应报文时能够明确标记资源内容类型
- 显示指定:自己提前在服务器上将资源类型定义完成
- 魔法分类:服务器自行扫描内容并判断类型
- 协商分类:服务器端和客户端协商哪种类型最好,然后在决定发送哪个
媒体类型:每一种资源都有媒体类型,主要被MIME标记以后由MIME对它们分别使用不同的编码方式对它们进行编码,媒体类型标记决定了客户端浏览器在访问此资源是应该由哪个Web插件进行解析
格式:主类型/次类型 major/minor
text/html:文本类型中的超文本文档
text/plain:纯文本文档
image/jpeg
image/gif
5. cookie
http协议是无状态的(stateless),服务器无法持续追踪用户来源,通过引用cookie机制解决,客户端第一次访问服务器时,服务器会发送cookie给客户端,能唯一标识用户信息,每个cookie都有作用范围
- 胖cookie:将用户的访问记录都存储在用户本地,这种容易被其他第三方的杀毒软件窃取信息
- session:用户的访问记录都存储在远端的服务器上
6. http请求首部和响应报文语法格式
请求报文和响应报文都有固定的格式,其第一行都称为协议报文起始行。接着会跟上很多的<headers>
,然后接两个换行和<entity-body>
部分,请求报文中如果没用使用put或post方法,<entity-body>
中的内容一般都是空的。
(1) 请求报文首部格式
<method> <request-URL> <version>
<headers>
两次换行
<entity-body>
① method
method叫做请求方法,标明客户端希望服务器对资源执行的动作,就是客户端告诉服务器端你应该做什么
- GET:从服务器获取一个资源
- PUT:上传,将请求的主体部分存储在服务器端而不是被服务器处理,所以PUT方法中
<entity-body>
当中一定是包含内容的,此方法对服务器比较危险。要使用PUT方法需要服务器端开启分布式版本协作功能(DAV)机制,但一般不会有人互联网中公开的 - MOVE:请求服务器将指定页面移至另一个网络
- DELETE:删除服务器上指定的文档,此方法对服务器很危险
- TRACE:web服务器是可以被代理的,想知道一次资源请求到底经过了多少级代理,就可以使用这个方法
- HEAD:只从服务器获取文档的响应首部,意为着每一次服务器端在发响应内容给客户端时,不发送数据内容,只发送http响应首部,包含
<request-URL>
、<version>
、<headers>
- POST:向服务器发送要处理的数据。服务器端通常是有一个表单提供给我们,我们填入些数据点提交,这些提交的数据都会放在请求报文的
<entity-body>
当中提交给服务器端,所以在使用POST方法时<entity-body>
是有数据的,有时候注册账号、上传账号和密码用到最多的就是post方法 - OPTIONS:可以请求服务器返回其指定资源支持的请求方法。比如很多服务器对某些资源允许HEAD、GET,但是不允许DELETE和PUT,这个时候如果知道一个资源支持哪些方法,就可以用options
② request-URL
请求的URL
③ version
使用的http协议版本,格式为HTTP/<major>.<minor>
④ headers
各种类型的headers
(2) 响应首部语法格式
<version> <status> <reason-phrase>
<headers>
两次换行
<entity-body>
----------------------------------
<version>:响应时使用的协议版本号
<reason-phrase>:原因短语,用来说明状态码简要描述
<entity-body>:响应实体
status
状态码,三位数字,就是服务器端告诉客户端,你的请求发生了什么
- 1xx:目前正在使用的只有100和101两种,这类状态码主要做额外信息提示的,没有太多额外的意义
- 2xx:200-206,主要用来表示成功类的响应
- 200:成功,请求的所有数据通过响应报文的entity-body部分发送给你了,对应的原因短语为OK
- 201:上传文件成功后显示,对应的原因短语为CREATED
- 3xx:300-305,重定向类的状态码。本来请求的是某一资源,但是服务器端没有把那个资源响应给你,而是给你重定向到别的位置
- 301:永久重定向,请求的URL资源已经被删除,但服务器端会在响应报文中通过首部Location指明资源现在所处的新位置,下次客户端请求这个资源时直接向新访问即可。对应的原因短语为Moved Permanently(永久)
- 302:临时重定向,与301相似,也会在响应报文中通过Location首部指明资源现在所处的临时新位置,不过将来还有可能在回来,下次客户端请求这个资源时依然会向老位置询问。对应的原因短语为Found
- 304:表示客户端发出了条件式请求,也就是说客户端请求资源时会问服务端这个资源在上次我请求过以后有没有发生改变,如果发生了变化,服务器就会告诉客户端发生变化了,并发送新资源给客户端。如果未变化,服务器端会告诉客户端,资源没变化,你直接使用你缓存的资源就可以了,对应的原因短语为Not Modified
- 4xx:400-415,表示客户端类错误
- 401:表示需要输入账号和密码,当客户端请求需要认证的资源时,服务器端要求客户端输入账号和密码才能访问,所以先返回个错误给客户端。对应的原因短语为Unauthorized
- 403:请求被禁止,比如服务端禁止某个IP访问。对应的原因短语为Forbidden
- 404:资源请求失败,无法找到客户端请求的资源。对应的原因短语为Not Found
- 405:你使用的方法不被允许、不支持,对应的原因短语为Method Not Allowed
- 5xx:500-505,表示服务器端的错误,比如你请求的资源服务器应该响应给你的,但是服务器资源因为自己内部有语法错误运行不成功,这就没法响应了
- 500:服务器内部错误,对应的原因短语为Internal(内部的) server Error
- 502:代理服务器从上游服务器收到一条伪响应,不是真正的响应,是错误的响应,对应的原因短语为Bad Gateway
- 503:服务暂时不可用,对应的原因短语为Service Unavailable
7. headers
用来标记请求或响应的属性,每个请求或响应报文可使用任意个header。通用格式为header名称后面跟一个冒号,而后在跟上一个可选空格,(有没有都行,但大多数都在,所以就成了标准语法)接着是一个值
(1) headers示例
请求header示例
Accept: text/html,application/xhtml+xml,
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Host: www.bilibili.com
Referer: https://www.bilibili.com/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64)
响应header示例
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin,
Access-Control-Allow-Origin: https://www.bilibili.com
Connection: keep-alive
Content-Encoding: gzip
Content-Type: application/json;charset=UTF-8
Date: Thu, 22 Nov 2018 13:19:22 GMT
Server: Apache-Coyote/1.1
Transfer-Encoding: chunked
X-Cache: BYPASS from ks-bj6-webcdn-11.hdslb.com
(2) headers分类
① 通用首部
请求与响应报文都可用的首部
- Date:报文的创建时间
- Connection:通常表示这次链接是长链接或是短连接,常见的值如keep-alive、close
- Via:经由。显示报文经过的中间节点(代理服务器),这些信息是由服务器管理员或网站程序员定义的,可以设置不显示
- Cache-Control:控制缓存的生效机制,这是http1.1才有的功能
- Pragma:偶尔在HTTP\1.1中还会出现,是为了兼容HTTP\1.0的,也是跟缓存相关
② 请求首部
- Accept:客户端通知服务器自己能够接收的媒体类型(MIME类型)
- Accept-Charset:客户端通知服务器自己能够接收的字符集类型
- Accept-Encoding:编码格式,客户端通知服务器端自己能接收哪些压缩机制,如gzip、deflate、sdch
- Accept-Language:客户端通知服务器端自己能接收哪些语言编码的页面
- Host:请求的服务器名称和端口,大多数端口都省略了
- Referer:包含了当前正在请求资源的上一级资源
- User-Agent:客户端代理,说白了就是浏览器类型,现在的浏览器向服务器发请求一般都会附带自己的浏览器类型,因此服务器就是因此来给你返回特定站点
- Client-IP
安全请求首部
- Authorization:向服务器发送认证信息,如账号密码
- Cookie:客户端向服务器端发送身份标识
- Cookie2:版本2
条件式请求首部
- Expect:表示客户端期望服务器发什么样的信息
- If-Modified-Since:自从指定时间后资源有没有修改过
- If-Unmodified-Since:自从指定时间后资源是否没修改过
- If-None-Match:本地缓存中存储文档的Etag标签是否与服务器端文档的Etag不匹配,Etag是扩展标签
- If-Match:本地缓存中存储文档的Etag标签是否与服务器端文档的Etag匹配
③ 代理请求首部
- Proxy-Authorization:与代理服务器进行认证是用到的首部
④ 响应首部
信息性响应首部
- Age:响应持续时长,指这个资源有限期限
- Server:指服务器程序的版本号或者是服务器程序名称
协商性响应首部
某资源有多种表示方法时使用
- Accept-Ranges:服务器端通知客户端可自己接受的请求类型
- Vary:首部列表,服务器会根据此列表挑选最适合的版本发给客户端
安全响应首部
- Set-Cookie:向客户端设置Cookie
- Set-Cookie2:向客户端设置Cookie2
- WWW-Authenticate:来自服务器对客户端的质询认证表单
⑤ 实体首部
用来标示实体自己的相关信息的,很多时候用来表示报文中内容的相关属性
跟内容格式相关
- Allow:列出对此实体可使用的请求方法,使用options时通常有这个响应
- Location:告知客户端真正实体位于何处,这是在重定向时使用的
- Content-Encoding:内容的编码格式
- Content-Language:内容使用的语言
- Content-Length:内容的长度
- Content-Location:实体真正的所处位置
- Content-Range:在整个资源中此实体表示的字节范围
- Content-Type:实体的对象类型
跟缓存相关
- Etag:资源的扩展标签。基于标签做条件请求时会使用,在网络上图片不会经常改动,当客户端第一次请求资源时,服务器在返回状态码200的同时还会返回该图片的签名Etag(可以理解为图片的指纹)。接着客户端再次访问该图片时,就会去服务器校验指纹信息, 如果图片没有变化则直接使用缓存里的图片,从而减轻了服务器的负担。也就是说二次访问返回状态码为304,浏览器就会从本地缓存里面取图片,节省了图片在网络上传输的时间
- Expires:内容过期时间
- Last-Modified:最后一次修改时间
8. Web资源
请求和响应中的内容叫web资源(Web resource),这种资源有两种类型,我们现在看到的网页都是通过多个资源组成的,每个资源都需要单独请求
- 常见的静态资源:
.jpg .gif htm txt .js .css .mp3
,静态资源是服务端无需额处理,客户端请求时就直接发送给客户端就可以了 - 常见的动态资源:
.php .jsp
,服务端需要执行程序作出处理,将处理结果发送至客户端
web资源能支持这么多种类型,就是因为http协议中引入了mime机制
9. URL
统一资源定位符(Uniform Resource Locator),在请求或响应web资源时需要明确指出请求资源的位置,而url就是用来描述服务器某特定资源的位置
基本语法:<scheme>://<user>:<passwd>@<host>:<Port>/<Path>;<params>?<query>#<frag>
Scheme:方案,用来指明协议
params:参数
query:查询标准
frag:定位符
10. http的请求过程
- 第一步:建立连接。服务器端要判断是否接受客户端请求,如果要接受请求则建立链接
- 第二步:接受请求。接收来自于网络上某主机请求报文中对某资源的一次请求
- 第三步:处理请求。服务器端对请求报文进行解析,从而并获知客户端请求的资源及请求方法等相关信息
- 第四步:获取资源。服务器端根据客户端所请求的资源,向本地磁盘发起I/O请求从而获取资源
- 第五步:构建响应报文。一旦服务器端拿到了资源,就开始构建响应报文并以此响应客户端请求,所谓构建响应报文就是在这个资源的外部加上响应报文的首部
- 第六步:发送响应报文
- 第七步:记录日志
11. 并发访问响应模型(Web I/O)
服务器同时响应多个用户请求的方式
- 单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
- 多进程I/O结构:两级进程结构,主控进程负责接收用户请求,而后把请求分发给子进程,每个子进程响应一个请求
- 复用I/O结构:一个进程响应N个请求,有两种机制
- 多线程模型:一个进程生成N个线程,每个线程响应一个用户请求,但是此种方式线程内存空间都是共享的,可能会出现堵塞的情况
- 事件驱动(event-driven):一个进程可以响应多个请求,内部没有线程,通过事件回调机制完成
- 复用的多进程I/O结构:启动多个进程,每个进程响应N个请求
二、http服务器程序
http是一个协议,而协议必须有实现方式,web服务器程序就是http协议的实现
1. 常见的静态web服务器程序
- httpd:apache,a patchy server后来叫apache
- nginx
- lighttpd:德国人研发的Web服务器,性能与nginx不相上下的Web服务器
2. 应用程序服务器
不单能服务静态内容,又能解析动态内容
(1) 轻量级
- IIS:解析asp
- tomcat:著名的jsp容器
- jetty:在google当中被广泛使用的轻量级jsp容器
- jboss:早期时候被红帽购买的第三方组织,提供专业级jsp服务器解决方案的应用程序,是二次封装的tomcat
(2) 重量级
- webshpere:IBM公司的重量级jsp容器,通常在企业级部署时使用
- weblogic:早期是小公司研发的,后来被BEA公司收购,对它做了大规模的改进,使得weblogic也占据了大量的市场
- oc4j:Oracle公司开发,后来Oracle收购了BEA,于是就专注weblogic的维护了
互联网上有一个著名的数据挖掘站点,它会统计过去一段时间内web站点使用的web服务器的程序比例。网址为www.netcraft.com
3. 网站衡量指标
- PV:page view,用户完成一次完整的页面访问叫一个pv,注意PV和一次资源请求是不一样的
- UV:user view,统计有多少个用户访问
- IP:独立的浏览量,这个数一定会小于uv的
计算网站带宽:假如一个资源的大小为5K、用户并发量为1000,那么服务器带宽至少应该准备5M
三、httpd的简介
httpd也称为apache,据说是由美国的一个组织开发的最初版本。这个组织曾经为了开发一个完整的web服务器软件,从而召集了很多优秀的工程师,当开发成功后这个项目组就解散了。而开发人员就散布于各大互联网公司,但是这些工程师对此前研发的这个程序仍然怀有一份感情,不舍得这个软件没落了。于是他们就各自通过互联网进行协作,通过打补丁的方式维护这个web服务器。后来,这个服务器程序就被戏谑的称为a patchy server(一个充满了补丁的服务器),在后来就被简写成了apache。现在httpd是由apache这个组织负责维护的,其成立后的两年内就让httpd程序占据了60%的市场份额。随着组织的影响力越来越大,于是就成立了软件基金会(ASF),专门扶持更多的开源项目
1. httpd的特性
- 高度模块化设计:是由core加各种modules组成
- DSO:动态共享对象(Dynamic Shared Object),支持模块的动态装载
- MPM:多路处理模块,实现多种不同的I/O访问模型。prefork、worker、event
- CGI:一种动态网站技术的接口
- 支持虚拟主机:一台物理服务器可以服务多个网站
- 支持主机反向代理:将用户的访问发送至后端的主机
- 支持负载均衡
- 支持路径别名
- 丰富的用户认证机制
- 支持第三方模块
2. MPM
MPM叫做多路处理模块,它是httpd上实现并发访问模型的几种机制
- prefork:父进程负责管理子进程,每个进程响应一个请求,即便没有用户请求时,也会生成多个空闲进程,随时等待请求到达
- worker:父进程管理子进程,子进程通过线程响应用户请求,每个线程响应一个请求
- event:事件驱动模型,父进程管理子进程,子进程通过事件驱动机制直接响应多个请求
3. httpd 相关的安装包
httpd
:主程序包httpd-devel
:对httpd做二次开发时用到的包httpd-manual
:httpd的手册httpd-toosl
:httpd相关的测试工具mod_ssl
:httpd开启ssl需要的包
4. rpm方式安装httpd配置文件路径
(1) rpm安装
直接使用yum install httpd -y
即可,分析依赖关系时会自动将httpd-tools
也安装上。如果将来可能无法访问互联网,也可以将httpd-manual
(手册包)一并安装
(2) 配置文件路径
① httpd 2.2
httpd2.2中,主程序有三个用于启用不同的MPM,需要哪个就启动哪个。如果是编译安装的话,必须将三个都编译才行
/etc/httpd/conf/httpd.conf
:主配置文件/etc/httpd/conf.d/*.conf
:为httpd.conf提供额外配置片段/etc/rc.d/init.d/httpd
:服务脚本文件/usr/sbin/httpd
:主程序文件/usr/sbin/httpd.worker
:主程序文件/usr/sbin/httpd.event
:主程序文件/usr/sbin/apachectl
:辅助的程序脚本/usr/lib64/httpd/modules/mod_*.so
:模块文件路径/var/www/html
:默认网页存放路径/var/log/httpd/
:日志文件目录
② httpd 2.4
/etc/httpd/conf
:配置文件目录/etc/httpd/conf/httpd.conf
:主配置文件etc/httpd/conf.d/*.conf
:为httpd.conf提供额外配置片段/etc/httpd/conf.modules.d/*.conf
:专门配置模块工作特性的配置文件,httpd2.2没有这个目录/usr/sbin/httpd
:主程序文件/usr/sbin/apachectl
:辅助的程序脚本/usr/lib/systemd/system/httpd.service
:systemd unit文件/usr/lib64/httpd/modules/mod_*.so
:模块文件路径/var/www/html
:默认网页存放路径/var/log/httpd/
:日志文件目录
5. 编译安装httpd
httpd依赖于arp、apr-util、apr-icon,apr就是apache portable runtime,意为apache运行环境,类似apache虚拟机,因为apache是一个跨平台工具,不同的操作系统互相调用接口不相同,2.4需要1.4以上版本的apr
(1) 安装apr
./configure --prefix=/usr/local/apr
make && make install
./configure --prefix=/usr/local/arp-util --with=/usr/local/apr
make && make install.
apr安装完毕后,需要安装开发环境pcre-devel
(2) 编译安装httpd
./configure --prefix=/usr/local/apache --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most –enable -mpms-shared=all --with-mpm=prefork
四、配置httpd配置
在httpd 2.2中将配置文件逻辑分为三段全局环境段(Global Environment)、主服务器配置段(Main server configuration)、虚拟主机配置段(Virtual Hosts),但是在httpd 2.4中配置分段的概念已经弱化了。不过二者配置格式是一致的,都需要使用指令后跟一个值配置,指令不区分大小写,但是值要是定义路径时,大小写取决于文件系统
1. 监听端口
文件为:/etc/httpd/conf/httpd.conf
Listen
:格式为Listen [IP:]Port [protocol]
,省略ip表示监听所有地址,而后面的协议用来规定此Linten的端口只能通过哪种协议访问,常用于SSL,比如Listen 8443 https
。如果修改了监听端口需要重启才能生效,但是如果添加了监听端口重载下配置即可。Listen可以应用多次
2. 长连接
文件为:/etc/httpd/conf/httpd.conf
KeepAlive on|off
:持久连接(Persistent Connection),http协议是基于tcp实现的,每一次的http事务都会三次握手、四次断开,严重浪费带宽资源。那么就可以启用长连接机制,让客户端仅需建立一次连接,请求完毕后再断开。但是为了更好的保证资源不被浪费,长连接从两个维度进行了限制,一是请求资源限制,二是超时时长限制,当二者中有一个达到阈值时就自动断开连接,下一次http事务需要重新进行三次握手、四次断开。对并发访问量较大的服务器,持久连接功能会导致有些请求的得不到响应
MaxkeepAliverequests #
:数量限制,获取规定的资源数后就断开连接,默认是100个KeepAliveTimeout #[ms]
:持久连接时间限制,httpd 2.4支持毫秒级持久时间,使用毫秒级别需要在后面加上ms
3. MPM更换
确认当前运行的是哪个模块使用命令ps aux | grep httpd
(1) httpd 2.2
对于rpm安装的httpd 2.2来讲,为了支持不同MPM机制,其提供了三个二进制文件,分别为/usr/sbin/httpd、/usr/sbin/httpd.worker、/usr/sbin/httpd.event
,编辑vim/etc/sysconfig/httpd
,修改里面HTTPD=
对应的值即可
(2) httpd 2.4
编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf
,在其中将想要启动的mpm注释信息去掉即可,也就是LoadModule关键字对应的值
4. prefork工作特性配置
文件为:/etc/httpd/conf/httpd.conf
startservers
:服务启动后立即创建多少个子服务进程,每个子进程响应一个请求minspareservers
:最少空闲子进程数maxspareservers
:最大空闲子进程数serverlimit
:对maxclients做限定,在服务进程生命周期内,允许启动的进程最大值maxclients
:最大允许启动的子进程数量maxrequestperchild
:一个进程最多能响应多少次请求,达到阈值后自动关闭这个子进程,定义为0表示永不过期
5. worker工作特性配置
文件为:/etc/httpd/conf/httpd.conf
startservers
:服务启动后立即创建多少个子进程minsparethreads
:最少空闲线程maxsparethreads
:最大空闲线程threadsperchild
:每个进程最大启动的线程数maxclients
:最大并发请求数maxrequestperchild
:每个线程响应的最大请求次数,0表示不做限制
6. event工作特性配置
7. DSO机制
使用命令httpd -M
查看模块时,后面显示为shared类型的模块都是可以LoadModule关键字动态装卸载的。指定模块路径可使用相对地址路径,相对于主配文件ServerRoot关键字指向的路径,默认路径为/etc/httpd/modules
,这个路径是个链接,指向了/usr/lib64/httpd/modules
,如果需要添加第三方模块就可以编译完成后将模块放置在这个路径,接着使用LoadModule关键字进行装载
8. 中心主机相关指令
DocumentRoot
:定义中心主机的网页文档路径,默认为/var/www/html/
ServerName
:定义中心主机名称,格式为ServerName [scheme://]FQDN[:port]
,用于定义当前主机域名DirectoryIndex
:定义默认页面user/group
:指定以哪个用户的身份运行进程AddDefaultCharset
:设定默认字符集
9. 访问控制机制
可基于三种方式指明对哪些资源进行访问控制
(1) 文件系统路径
<Directory ""> </Directory>
:对目录文件做控制<File ""> </File>
:对单个文件做控制<FileMatch ""> </FILEMatch>
:根据正则表达式匹配做控制,但建议不使用,因为每次匹配时要调用正则表达式匹配引擎,效率会降低
(2) URL路径
可以明确指明限制哪些请求方法
<Location ""> </Localtion>
<LocationMatch ""> </LocaltionMatch>
10. 配置Directory访问控制
(1) httpd 2.2
使用<Directory ""> </Directory>
将配置段包含,其中可使用的指令如下
options
:定义当不存在主页时,用户对此目录下的资源访问机制,可以多参数共存,多项指令可以使用空白字符分割All: Indexes:允许索引目录 FollowSymLinks:允许索引目录,意思将目录中所有文件以索引形式展示 SymLinksifOwnerMatch:符号链接文件和源文件属主是同一个用户时允许追踪 AllowOverride:是否允许当前配置去覆盖每一个网站页面路径下的.htaccess
Order
:检查次序Allow from IP
:允许某个ip地址或网络地址访问,默认为Allow from allDeny from IP
:拒绝某个IP或网络地址访问Deny from all
1. 仅允许一台主机进行访问
<Directory "/var/www/html">
Order allow,deny
Allow from 192.168.1.100
</Directory>
---------------------------
2. 开放一个网段访问
<Directory "/var/www/html">
Order allow,deny
Allow from 192.168.1
</Directory>
---------------------------
3. 开放一个网段,但是拒绝此网段的一台主机
<Directory "/var/www/html">
Order allow,deny
deny from 192.168.1.200
Allow from 192.168.1
</Directory>
---------------------------
(2) httpd 2.4
使用<Directory ""> </Directory>
将配置段包含,其中可使用的指令如下
options
:定义当不存在主页时,用户对此目录下的资源访问机制,可以参数有很多,多项指令可以使用空白字符分割All:启用所有选项,除了MultiViews None:什么选项都不启用 Indexes:允许索引目录,意思将目录中所有文件以索引形式展示 FollowSymLinks:允许跟踪符号链接文件所指向的源文件 SymLinksifOwnerMatch:符号链接文件和源文件属主是同一个用户时允许追踪 AllowOverride:是否允许当前配置去覆盖每一个网站页面路径下的.htaccess。
Require [not] ip | host
:拒绝或允许某个IP或网段访问,当IP有多个时需要使用子配置<Requireall>
或<Requireany>
将其包含,拒绝所有和允许所有使用Require all denied和Require all granted
1. 允许一台主机访问
<Directory "/var/www/html">
Require ip 192.168.1.100
</Directory>
<Directory "/var/www/html">
Require host www.busyops.com
</Directory>
---------------------------
2. 拒绝一台主机访问
<Directory "/var/www/html">
Require not ip 192.168.1.100
</Directory>
<Directory "/var/www/html">
Require not host www.busyops.com
</Directory>
---------------------------
3. 拒绝某个主机访问,并允许一个网段访问,检测次序由上至下
<Directory "/var/www/html">
<Requireall>
Require not host www.busyops.com
Require ip 192.168.1
</Requireall>
</Directory>
11. 配置路径别名
(1) httpd 2.2
直接在配置文件中加入Alias /URL/ "/PATH/TO/SOMEDIR/"
(2) httpd 2.4
- 在配置文件中加入
Alias /URL/ "/PATH/TO/SOMEDIR/"
- 使用
<Directory>
配置块对/PATH/TO/SOMEDIR/
进行授权
12. 配置日志
(1) 定义访问日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
:通过LogFormat定义日志格式,后面给这个格式起个名称用于后面引用
%h:客户端IP地址
%l:客户访问时登录的用户名,一般都没有登录所以记录为一个横线-
%u:认证登录时使用的用户名,没登录的话记录为一个横线-
%t:访问时间
%r:请求报文的首行
%>s:使用%s记录请求重定向等响应码,使用%>s记录请求重定向后的响应码
%b:响应报文的大小,单位是字节,但是不包含http首部,如果大小为0记录为-
%{Referer}i:请求报文当中referer首部的值,就是从哪个页面中的超链接跳转而来
%{User-Agent}i:请求报文当中User-Agent首部的值,客户端的浏览器类型
使用CustomLog "logs/access_log" combined
定义日志路径及启用哪个日志格式
(2) 错误日志
ErrorLog "logs/error_log"
:定义错误日志路径LogLevel warn
:debug、info、notice、warn、error、crit、alert、emerg
13. 用户认证质询
对指定的页面资源提供账号密码认证功能,这个机制是http协议内建的,
(1) 认证过程
- 第一步:当客户端请求需要认证的资源时,服务器端会向客户端发送认证质询响应首部(WWW-Authenticate),响应码为401并拒绝客户端请求,要求客户端输出账号密码
- 第二步:客户端填入账号密码后发送一个请求认证的首部(Authorization)
- 第三步:认证通过则向客户端发送响应资源
(2) 认证类型
- basic:明文认证,这种方式会以明文的方式发送账号密码,极度不安全
- digest:消息摘要认证,使用单向加密方式传出加密后的认证密码结果
(3) 认证配置
① 生成密码文件
使用命令:htpasswd
命令,格式:htpasswd [options] passwdfile name [passwd]
optons:
-c:自动创建passwordfile:因此应该在第一次添加用户时使用
-m:MD5加密用户密码
-s:sha1:加密用户密码
-D:删除指定用户
-b:直接在命令中指定密码
注:文件放在/etc/httpd/conf.d/.htpasswd
htpasswd -c -s /etc/httpd/conf.d/.htpasswd tom
htpasswd -b -s /etc/httpd/conf.d/.htpasswd mike 123456
② 对用户进行授权
/etc/httpd/conf.d/admin.conf
<Directory "/var/www/html/admin">
options None
AllowOverride None
AuthType Basic
AuthName "Please enter user and passwd."
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
Require valid-user
</Directory>
如果仅授权个别用户使用 Require user tom 即可
③ 对组进行授权
- 第一步:使用htpasswd命令创建密码文件
- 第二步:创建组定义文件,组文件手动创建,每一行定义一个组:
GRP_NAME: username
/etc/httpd/conf.d/.htgroup
admingrp: tom
- 第三步:在配置文件中进行授权
<Directory "/var/www/html/admin">
options None
AllowOverride None
AuthType Basic
AuthName "Please enter user and passwd."
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group admingrp
</Directory>
digest:消息摘要;
c) 需要用户认证后方能访问的路径叫安全域;
d) 虚拟账号:仅用于访问某服务时用到的认证标识;
14. 虚拟主机
互联网上有些站点访问量非常小,一台物理服务器去承载一个站点太浪费了,因此可以使用单台物理服务器承载多个站点,这就需要用到虚拟主机,每一个虚拟主机承载一个独立的域名,维护自己独立的网页路径。这里需要注意,httpd 2.2虚拟主机不要与中心主机混用,如要使用虚拟主机,先禁用中心主机,只需注释掉DocumentRoot就能实现。而在httpd 2.4中直接定义虚拟主机即可。另外,每个虚拟主机最好能分开定义日志文件
(1) 基于ip的虚拟主机
vim /etc/httpd/conf.d/virtualhost.conf
<VirtualHost 192.168.1.200:80>
ServerName web1.busyops.com
DocumentRoot "/vhosts/web1/htdocs"
<Directory "/vhosts/web1/htdocs">
options None
AllowOVerride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.201:80>
ServerName web2.busyops.com
DocumentRoot "/vhosts/web2/htdocs"
<Directory "/vhosts/web2/htdocs">
options None
AllowOVerride None
Require all granted
</Directory>
</VirtualHost>
(2) 基于端口的虚拟主机
基于端口区分虚拟主机需要使用Listen关键字启用端口
<VirtualHost 192.168.1.200:80>
ServerName web1.busyops.com
DocumentRoot "/vhosts/web1/htdocs"
<Directory "/vhosts/web1/htdocs">
options None
AllowOVerride None
Require all granted
</Directory>
</VirtualHost>
Listen 8080
<VirtualHost 192.168.1.200:8080>
ServerName web2.busyops.com
DocumentRoot "/vhosts/web2/htdocs"
<Directory "/vhosts/web2/htdocs">
options None
AllowOVerride None
Require all granted
</Directory>
</VirtualHost>
(3) 基于域名的虚拟主机
<VirtualHost 192.168.1.200:80>
ServerName www.web1.com
DocumentRoot "/vhosts/web1/htdocs"
<Directory "/vhosts/web1/htdocs">
options None
AllowOVerride None
Require all granted
</Directory>
</VirtualHost>
<VirtualHost 192.168.1.200:80>
ServerName www.web2.com
DocumentRoot "/vhosts/web2/htdocs"
<Directory "/vhosts/web2/htdocs">
options None
AllowOVerride None
Require all granted
</Directory>
</VirtualHost>
注意:在httpd 2.2中,如果启用基于主机名称的虚拟主机,需要将NameVirtualHost
项启用
15. httpd内建的status页面
以虚拟主机为例,编辑器配置文件在其中加入<Location>
定义
<VirtualHost 192.168.1.200:80>
ServerName www.web1.com
DocumentRoot "/vhosts/web1/htdocs"
<Directory "/vhosts/web1/htdocs">
options None
AllowOVerride None
Require all granted
</Directory>
<Location /admin-status>
SetHandler server-status
Require ip 192.168.1.208
</Location>
</VirtualHost>
进程槽位状态
_:空闲进程
W:正在发送响应的
S:正在启动的
R:正在接受用户请求
K:保持连接
D:正在做DNS查询
C:正在断开连接
L:正在记录日志
G:正在优雅终止
I:正在空闲清理进程
.:没启动
在httpd 2.2的主配文件中,可以启用ExtendedStatus On
让status页面显示的更加详细
16. 页面压缩
压缩页面优化传输速度,需要使用mod_deflate
模块。适用于带宽稀缺,CPU空闲较多的情况。需要注意可能有些较老浏览器不支持。并且压缩那些适合压缩的资源,例如文本文件
第一步:开启主配文件deflate模块(或检查模块是否装载httpd -M | grep deflate
LoadModule deflate_module modules/mod_deflate.so
第二步:在主配文件中或conf.d/
目录下加入压缩配置
SetOutputFilter DEFLATE
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
DeflateCompressionLevel 9
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
第三步:使用httpd -t检查配置文件,执行systemctl restart httpd.service
SetOutputFilter DEFLATE
:作为Web服务器来讲,把文件响应给客户端叫输出。这选项表示调用一个叫做Deflate的输出过滤器AddOutputFilterByType DEFLATE
:定义压缩的MIME类型,将这些类型都调用一个叫做Deflate的输出过滤器DeflateCompressionLevel 9
:定义压缩比(Highest 9 - Lowest 1)
较老版本的浏览器不支持压缩,服务器根据客户端请求首部中的User-Agent
来判断客户端是哪种类型
BrowserMatch ^Mozilla/4 gzip-only-text/html
:表示对mozilla/4的浏览器只用gzip压缩text/htmlBrowserMatch ^Mozilla/4\.0[678] no-gzip
:Mozilla4.0[678]的表示不压缩BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
:对于MSIE浏览器不压缩,如果要压缩的话那也只压缩这一种类型!gzip-only-text/html
17. 配置HTTPS
(1) SSL会话的简化过程
- 客户端发送可供选择的加密方式,并向服务器请求证书
- 服务器端发送证书以及选定的加密方式给客户端
- 客户端取得证书并进行证书验证:验证证书来源的合法性(用CA的公钥解密证书上数字签名)、验证证书的内容的完整性(使用同样的单向加密算法进行验证)、检査证书的有效期限、检査证书是否被吊销、证书中拥有者的名字与访问的目标主机要一致
- 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此对称秘钥发送给服务器,完成密钥文换
- 服务器用此密钥加密用户请求的资源,响应给客户端
注意:SSL会话是基于IP地址创建,所以单IP的服务器上仅可以使用一个https虚拟主机
(2) 配置过程
① 建立私有CA
(1) 生成CA自己的私钥文件
cd /etc/pki/CA
(umask 077; openssl genrsa -out private/cakey.pem 2048)
(2) 生成CA自签证书
touch index.txt
echo 01 > serial
openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300
② 在web服务器创建证书签署请求
(1) 创建单独保存秘钥的文件
mkdir /etc/httpd/ssl
(2) 生成web服务器私钥文件
(umask 077; openssl genrsa -out ssl/httpd.key 1024)
(3) 生成证书颁发请求并发送给CA服务器
openssl req -new -key ssl/httpd.key -out ssl/httpd.csr
scp ssl/httpd.csr root@192.168.1.250:/tmp/
③ CA签证并发还证书
(1) 签署请求并发还客户端
openssl ca -in /tmp/httpd.csr -out certs/web.server.com.crt -days 365
scp certs/web.busyops.crt root@192.168.1.200:/etc/httpd/ssl/
④ 安装ssl模块
httpd服务器安装mod_ssl:yun install -y mod_ssl
,生成的配置文件如下
/etc/httpd/conf.d/ssl.conf
:配置文件/etc/httpd/conf.modules.d/00-ssl.conf
:模块配置文件/usr/lib64/httpd/modules/mod_ssl.so
:模块/usr/libexec/httpd-ssl-pass-dialog
/var/cache/httpd/ssl
:ssl会话缓存
⑤ 修改配置ssl.conf
配置文件:/etc/httpd/conf.d/ssl.conf
Listen 443 https
:设置端口及协议,保持不变即可SSLSessionCache
:SSL会话非常消耗资源,使用会话保持功能可减少建立SSL的频次,此项第一SSL会话缓存位置SSLSessionCacheTimeout
:SSL会话缓存时长SSLRandomSeed
:定义SSL会话随机数来源DocumentRoot
:于需要提供SSL会话的主机保持一致ServerName
:于需要提供SSL会话的主机保持一致SSLCertificateFile
:服务器公钥SSLCertificateKeyFile
服务器私钥文件
⑥ 测试基于https访问相应的主机
openssl s_client [-connect host:port] [-CAfile filename]
五、http相关命令
1. httpd命令
option
-l:显示编译 进核心的模块
-M:显示静态编译及动态装载的模块
-t:检查语法
-t -D DUMP_VHOSTS:导出虚拟主机配置信息
2. 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、socket4代理服务器,通过http代理服务器上传文件到FTP服务器等等,功能十分强大
命令格式:curl [options] URL
options
-A "string":可以把自己伪装为某个浏览器向服务器端发请求
-e "URL":伪装自己的referer来源网址
-H <header>:自定义首部信息传递给服务器
-I:只显示响应报文首部信息
-0:使用HTTP 1.0版本
--basic:使用HTTP基本认证
-u <user[:password]>:设置服务器的用户和密码,结合--basic选项使用
--tcp-nodelay:使用TCP_NODELAY选项
--cacert <file>:CA证书(SSL)
--compressed:要求返回是压缩的格式,前提是两端都支持压缩
--limit-rate <rate>:设置传输速度
elinks是一个交互式命令行浏览器,可以解析html标签。
命令格式:elinks option URL
--dump:不进入交互式模式,直接将内容输出值屏幕
3. ab命令
压力测试(apache bench)
命令格式:ab [option] URL
option
-n:总的请求数
-c:模拟的并发数
-k:以持久链接模式测试
输出信息
Server Software:服务器程序
Server Hostname:域名
Server Port:
Document Path: 测试的URL
Document Length: 请求的页面大小
Concurrency Level: 并发数量
Time taken for tests: 这个测试的时间
Complete requests: 在请求数
Failed requests: 失败的数量
Write errors: 响应报文错误数
Non-2xx responses: 10000
Keep-Alive requests: 10000
Total transferred: 总数据传输量
HTML transferred: 主体部分大小
Requests per second: 没秒钟可以完成的响应数量
Time per request: 每并发数完成需要的时间
Time per request: 每单个请求需要的时长
Transfer rate: 传输速率
Connection Times (ms)
min mean[+/-sd] median max
最短 平均 中间值 最长
Connect: 请求建立需要的时间
Processing: 处理请求的时间
Waiting: 发送响应报文的时间
Total: 一次请求完成的时间
Percentage of the requests served within a certain time (ms)
50% 7 :完成50%消耗的时间
66% 8 :完成66%消耗的时间
75% 215 :完成75%消耗的时间
80% 218 :完成80%消耗的时间
90% 428 :完成90%消耗的时间
95% 856 :完成95%消耗的时间
98% 1757 :完成98%消耗的时间
99% 6680 :完成99%消耗的时间
100% 56953 (longest request) :完成100%消耗的时间