Linux之http协议及apache
http协议及Apache服务
http协议
什么是http?
http全称为超文件传输协议(Hyper text transfer protocol),其是一个应用层协议,基于tcp的80端口,一般使用ASCII编码传输。http协议是无状态的(stateless),即服务器无法追踪访问者来源. 其可以使用cokie机制来追踪同一个用户.
Cookie的追踪用户的原理
第一次方访问服务时,服务器发送一个cookie的小数据(随机数,用来标识客户端身份)
, 客户端会将其保存下来,随后 , 访问同一个站点时,会把应用于此站点的cookie提交给服务器,从而服务器就能识别客户端身份.
- 胖Cookie的实现原理
将用户会话及状态信息都保存至客户端本地,在请求数据时,将状态信息回传至服务器 - 瘦cookie + session的实现原理
将用户的状态信息都保存至服务器端,并与相应客户端的cookie令牌相对应,请求数据的时候,只是需向告诉服务器自己的cookie信息.
什么是超文本?
使用html(Hyper text mark language)编程语言编写,被称为文本标记语言。大致格式如下:
<html>
<head>
<title>Title</title>
</head>
<body>
<h1></h1>
<h2></h2>
<p>正文<a href="www.magedu.com/download.html">正文</a></p>
<h2></h2>
</body>
</html>
http协议版本
-
http 0.9
: 原型版本,功能简单,只添加了GET的方法 -
http 1.0
:增加cache,MIME,Method,长连接等功能-
MIME
: multipurpose internet mail extesion(多用途邮件传输扩展协议,实现文本传输能添加非文本数据等附加),其原理为,将非文件数据在传输前重新编码为文件格式再传输,接收方能够用相反的方式将其重新还原的格式,同时能够调用相应的程序打开此文件 -
常见的method
: 客户端请求数据的方法:-
GET
: 从服务器获取一个资源,通常不包含主体(entiy-body), 其为安全的方法 -
POST
: 向服务器发送服务器要处理的数据,通常包含主体(entiy-body),通常向服务器发送HTML的表单数据. -
HEAD
: 只从服务器获取文档的响应首部,不包含entiy-body,其为安全的方法. -
PUT
: 将请求的主体部分直接存储在服务器上, 包含entiy-body,如果上传的文档已经存在,就用这个主体替代它. -
DELETE
: 请求删除服务器上指定URL的文档,通常服务器不会返回删除成功或是失败的消息通知.,不包含主体. -
TRACE
: 追踪请求到达服务器中间经过的代理服务器,由服务器发回一个trace响应,通常不包含主体 -
OPTIONS
: 请求获得可以在服务器上执行那些方法,或者对某些特殊资源支持那些方法,通常不包含主体
-
-
扩展方法
:-
lock
: 允许用户锁定资源,可以在编辑某个资源的时候将其锁定,以防止别人同时对其进行修改 -
mkcol
: 允许用户创建资源 -
copy
: 便于在服务器上复制资源 -
move
: 在服务器上移动资源
-
-
-
http 1.1
: 其增加了缓存功能,是目前被广泛使用的标准 -
http 2.0
: 借用Google开放的html协议标准spdy,改进的版本
http的工作模式
-
http请求报文(http request):格式如下:
<method><request-URL><version> #获取方法 请求的资源 http协议版本 <headers> #http协议首部 #空白行 <entity-body> #报文主体 #空白行
-
http响应报文(http response)
<version><status><reason-phrase> #http版本 状态码 <headers> #响应报文首部 #空白行 <entity-body> #空白行
报文示例:
-
请求报文
GET / HTTP/1.1 Host:www.zhenping.me Connection:keep-aliv #连接方式为长连接 #空白行
-
响应报文
HTTP/1.1 200 OK X-powered-By:PHP/5.2.17 # 说明是一个PHP动态网页 Vary : Accept-Encodeing,cookie,User-Agent Cache-Control:max-age=3,must-revalidate Content-Encoding:gzip :网页压缩技术 Content-Length:6931 :网页长度 #空白行
手动模拟一个http请求会话:
telnet 172.16.36.60 80
Trying 172.16.36.60...
Connected to www.a.com.
Escape character is '^]'.
GET /index.html HTTP/1.1 #输入获取方法 请求的url 使用的协议
host:www.a.com #指定主机
#两次回车
HTTP/1.1 200 OK
Date: Tue, 12 Jan 2016 04:29:18 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 11 Jan 2016 11:41:51 GMT
ETag: "e000f-13-5290d6c437a91"
Accept-Ranges: bytes
Content-Length: 19
Connection: close
Content-Type: text/html; charset=UTF-8
<h1>www.a.com</h1>
Connection closed by foreign host.
http的状态码:
-
1XX
: 纯信息(100-101)-
100
: continue,说明收到了请求的初始部分,请客户端继续 -
101
: switching protocols,说明服务器正在根据客户端的指定,将协议切换成update首部所列的协议
-
-
2XX
: 成功类的状态信息(200-206)-
200
: OK,请求没有问题,实体的主体部分包含了所请求的资源
-
-
3XX
: 重定向类的信息(300-305)-
301
: 永久重定向 -
302
: 临时重定向 -
304
: 内容没有发生改变,使用缓存(客户端发出了条件式请求,但服务器上的资源未发生改变,则通过)
-
-
4XX
: 客户端错误类的信息(400-415)-
400
: 用于告知客户端发送了一个错误的请求 -
401
: unauthorized,未授权,访问前需要对用户认证 -
403
: forbidden,请求服务器拒绝,服务器不想说明拒绝原因的时候使用 -
404
: not found, 不存在的文件 -
405
: Method not allowed , 发起的请求不支持的方法
-
-
5XX
: 服务器端错误类的信息-
500
: internal server error,服务器内部错误 -
502
: bad gateway ,无法连接至其父网关 -
504
: gateway timeout, 服务器连接超时
-
http报文首部
-
通用首部
-
Date
: 报文的创建时间 -
connection
: 连接方式,如keepalive, close. -
Via
: 显示报文经过的中间节点(via本意为:经由) -
Cache-control
: 控制缓存 -
pragma
: 跟缓存相关,为了兼容1.0版本 -
MIME-version
: 给出发送端使用的MIME版本 -
trailer
: 如果报文采用分块传输编码方式,就可以用这个首部列出位于报文拖挂部分 -
Transfer-Encoding
: 告知接收端为了保证报文可选传输,对报文采用的编码方式 -
Update
: 给出发送端可能想要"升级"使用新的版本或协议
-
-
请求首部
-
accept
: 通知服务器自己可接受的媒体类型 -
Accept-charset
: 接收的字符集 -
Accept-Encoding
: 接收内容编码格式(如压缩格式) -
Accept-Language
: 接收的语言 -
Accept-Length
:实体主体数据包含了多少字节数据 -
Accept-type
: 实体主体数据是什么类型 -
From
: 提供了客户端用户的Email地址 -
Client-ip
: 客户端IP地址 -
Host
: 请求服务器名称和端口号 -
Referer
: 包含了当前正在请求的资源上一级资源(由那跳转过来的) -
User-agent
:浏览器类型-
条件式请求首部
-
Expect
: 允许客户端列出某请求所要求的服务器行为 -
If-modified-since
: 请求的数据如果晚于此修改时间,服务器将发回新文件 -
If-unmodified-sinec
: 除非在某个指定日期之后资源没有被修改过, 否则就限制这个请求 -
If-none-match
:本地缓存中存储的文档中的ETag标签是否与服务端文档的ETag不匹配(如果提供的实体标记与当前文档的实体标记不相符,就获取文档) -
If-Match
: 如果实体标记与文档当前实体标记相匹配,就获取这份文档 -
If-range
: 允许对文档的某范围进行条件请求 -
Range
: 如果服务器支持范围请求,就请求资源的指定范围
-
-
安全请求首部
-
authorization
: 向服务器发送认证信息,如帐号密码 -
Cookie
: 客户端向服务器发送cookie -
cooki2
: cookie的版本2
-
-
代理请求首部
-
proxy-authorization
: 向代理服务器认证 -
proxy-connection
: 与connection首部相同,但这个首部是在与代理建立连接时使用 -
max-forward
: 在通往源服务器的路径上,将请求转发给其它代理网关的最大次数---与trace方法一周使用
-
-
-
-
响应首部
-
信息性
-
Age
: 响应持续时长 -
Server
: 服务器程序软件名称和版本 -
date
: 服务器产生报文的时间 -
Content-length
: 实体主体数据包含了多少字节数据 -
Content-type
: 实体数据是什么类型 -
Location
: 重定向的连接 -
Public
: 服务器为其资源支持的请求方法列表 -
Retry-after
: 如果资源不可用的话,就在此时间或日期重试 -
Title
: 对HTML文档来说,就是HTML文档的源端给出标题 -
Warning
: 对原因短语中更详细的一些警告报文
-
-
协商首部(某资源有多种表示方法时使用)
-
Accept-Ranges
: 服务器可接受的请求范围类型 -
Vary
: 服务器查看的其它首部列表
-
-
安全响应
-
set-cookie
: 不是真正的安全首部,但隐含有安全功能,可以在客户端设置一个令牌,以便服务器对客户端进行标识 -
set-cookie2
: 与set-cookie类似 -
www-authenticate
: 来自服务器对客户端的质询认证表单 -
Porxy-Authenticate
: 来自代理的对客户端的质询列表
-
-
-
实体首部
-
Allow
: 列出对些实体可使用的请求方法 -
Location
: 告诉客户端真正的实体位于何处,重定向时使用
-
-
内容首部
-
Content-base
: 解析主体中相对URL时使用的基础URL -
Content-Encoding
: 内容的编码格式 -
Content-Language
: 理解主体时最适宜使用的自然语言 -
Content-length
: 主体的长度或尺寸 -
Content-Location
: 实体真正所处位置 -
Content-md5
: 主体的MD5校验和 -
Content-range
: 在整个资源中些实体表示的字节范围 -
Content-Type
: 主体的对象类型-
缓存相关
-
ETag
: 实体的扩展标签 -
Expires
: 实体的过期时间,实体不再有效,要从原始的源端再次获取此实体的日期和时间 -
Last-Modified
: 最后一次修改时间和日期
-
-
-
-
扩展首部
什么是keep-alive?
其被称之为长连接,由于http基于tcp协议通信,每个资源的请求都需要建立一个会话的虚拟通道,如果对于并发大的服务器来讲,高频的TCP会议建立和拆除将消耗更多的系统开销,故长连接可以实现tcp协议通信建立后,在允许的机制下,进行多个资源请求获取,当服务端设定的条件达到时,将断开与客户端的TCP连接。
keep-alive的控制机制
-
空闲超时机制(httpd2.2版本以秒为单位,httpd2.4可以以毫秒为单位)
-
请求次数限制
注意:在高并发的应用场景中,空闲超时机制将会导致后面用户的请求进行挂起操作,以导致访问慢的情况。故时间需要测试而设定,并且对请求次数进行设定,这样可以避免高并发的情况中,用户的请求长时间连接,而新的用户请求一直得不到处理。 空闲超时机制在低并发的应用场景中, 可以加速用户的访问请求。
实现步骤
client发起请求并与server建立Tcp的连接,进行数据传输,当client的资源请求完成后,通知服务端断开连接,服务端并予ack报文,并不发送fin报文,此时连接将处理半连接状态,服务器会检查httpd的keep-alive参数设置的两个条件:1、如果半连接空闲时间超出keep-alive设定的值,将主动断开连接 ;2、当客户端请求的资源次数达到httpd的参数设置,也将会主动断开连接。
客户端浏览器加速访问的机制
- 1、多线程请求,同时打开不同的资源
- 2、静态内容进行缓存
web资源的类型:
-
1、静态资源
- 无需服务器做出额外处理,一般内容格式为:
- jpg,png,gif,html,txt,js,css,mp3,avi等
- 无需服务器做出额外处理,一般内容格式为:
-
2、动态资源
- 服务端需要通过执行程序做出处理,并发送给客户端程序的运行结果,一般格式为:
- php,jsp
- 服务端需要通过执行程序做出处理,并发送给客户端程序的运行结果,一般格式为:
服务端完整的HTTP请求处理过程
- 1、建立和处理连接(接收请求或拒绝请求)
- 2、接收请求:通过网络读取HTTP请求报文
- 3、处理请求:解析请求报文并做出相应的动作
- 4、访问资源:访问请求报文中相应的资源
- 5、构建响应报文:使用正确的首部生成http响应报文
- 6、发送响应:向客户端发送生成的响应报文
- 7、记录日志:当已经完成的http事务记录进日志文件
HTTP的访问归类:
- 1、PV(Page view),页面的访问量,其在访问日志中的URL字段中第二个位置
- 2、UV(User view),用户的访问量,以IP访问数量来统计,其在访问日志中的第一个字段
服务端接收请求的模型
1、单进程I/O模型
启动一个进程处理用户请求,这意味着,一次只能处理一个请求,多个请求被串形响应
2、多进程I/O模型
每个请求都有一个独立的进程来响应,并行启动多个进程,每个进程响应一个请求
3、复用的I/O模型(必须要有多路IO管理机制)
- 1、多线程模式
- 一个进程生成N个线程,一个线程处理一个请求,其能生成的线程也是有限定的
- 2、事件驱动
- 一个进程直接响应N个请求,不用启动线程
4、利用的多进程I/O结构
启动M个进程,每个进程生成N个线程
http服务的实现软件
-
1、服务程序
httpd
nginx
lighttpd
thttpd
-
2、应用程序服务器
-
IIS
:(windwos .net) -
tomcat
:(apache,JSP,open source) -
websphere
: (IBM,JSP,commodity) -
weblogic
: (Oracle,JSP,commodity) -
JBoos
: (readhat,open source,commidity,核心是tomcat)
-
httpd服务程序
httpd简介
httpd是apache基金会(ASF:apache foundation)维护,其官网为httpd.apache.org,其基金会下有众多的著名软件。
http的版本
- httpd 1.3
- httpd 2.0
- httpd 2.2 (Centos 6平台的默认版本,其event模型仍为测试模型)
- httpd 2.4(Centos 7平台的默认版本,目前最新稳定版本,对event可用于生产环境中)
httpd的功能特性
-
1、CGI(Common Gateway Interface)
-
2、虚拟主机
IP
PORT
FQDN
-
3、支持反向代理
-
4、负载均衡
-
5、路径别名
-
6、丰富的用户认证机制
-
basic
:基本身份认证 -
digest
: 摘要身份认证
-
-
7、支持第三方模块
-
8、高度模块化
-
9、动态模块加载(DSO,Dynamic shared object)
-
10、多路处理模块(MPM,Multipath processing modules)
-
prefork
: 多进程模型,每个进程响应一个请求,特性如下:-
工作模型
- a) 有一个主进程,其负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程处理
- b) 多个子进程,每个子进程处理一个请求,主进程不负责接收请求
- c) 会预先生成几个空置的进程,随时等待用于响应用户请求,其预先定义最大空闲和最小空闲
-
-
worker
: 多进程多线程模型,每个线程处理一个用户请求,特性如下:-
工作模型
- a) 有一个主进程,其负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程处理
- b) 每个子进程负责生成多个线程,每个线程负责响应用户请求
-
-
event
: 事件驱动机制,事件驱动模型,多进程模型,每个进程响应多个请求-
工作模型
- a) 有一个主进程,其负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程处理
- b) 子进程基于事件驱动机制直接响应多个请求
-
-
-
11、支持https协议,由
mod_ssl
模块提供 -
12、支持用户认证
简单认证
摘要认证
基于表单认证
-
13、访问控制机制
基于IP或主机名的访问控制
基于每目录的访问控制
HTTPD的配置文件
1、httpd-2.2的版本(Centos 6)
- 配置文件
- /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
- /var/log/httpd/error_log
- 站点文档
- /var/www/html
- 模块文件路径
- /usr/lib64/httpd/modules
- 网站文件存放路径
- /var/www/html : 静态网页存放路径
- /var/www/cgi-bin : 动态网页存放路径
- 服务控制和启动
- service httpd on|off
- service {start|stop|restart|status|configtest|reload} httpd
2、httpd-2.4的版本(Centos 7)
- 配置文件
- /etc/httpd/conf/httpd.conf
- /etc/httpd/conf.d/*.conf
- /etc/httpd/conf.modules.d/*.conf : 模块相关的配置文件
- /usr/lib/systemd/system/httpd.service
- 主程序文件
- /usr/sbin/httpd : 2.4版本支持MPM的动态切换
- 日志文件
- /var/log/httpd/access_log
- /var/log/httpd/error_log
- 站点文档
- /var/www/html
- 模块文件路径
- /usr/lib64/httpd/modules
- 网站文件存放路径
- /var/www/html : 静态网页存放路径
- /var/www/cgi-bin : 动态网页存放路径
- 服务控制
- systemctl enable | disable httpd.service
- systemctl {start|stop|restart|status} httpd.service
HTTPD的进程
1、主进程的属主和属组
root:root
2、子进程或工作进程
apache:apache
HTTPD主配置文件
主配置文件的选项
- 1、全局配置段:影响apache的全局配置选项
- 2、中心主机配置段
- 3、虚拟主机配置段
主配置文件的格式
-
指令 + 值
- 指令:不区分大小写
- 值:在为路径时,是否区分大小写,取决于文件系统
常用配置选项
-
1、
修改监听的IP和PORT
- 格式:Listen [IP:] PORT
-
a) 省略IP表示0.0.0.0
-
b) Listen指令可复现出现多次
Listen 80 Listen 8080 Listen 172.16.0.1:80
-
c) 修改监听的socket,中有重启服务进程方可有效
-
- 格式:Listen [IP:] PORT
-
2、持久连接功能
- TCP连接建立后,每个资源获取完成后,不会断开连接,而是继续等待其它资源请求的进行,如何断开 ?
-
a) 数量限制
-
b) 时间限制
KeepAlive on | off KeepAlive Timeout 15 MaxKeepAliveRequests 100 注意:副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应。折衷处理:使用较短的持久连接时长,以及较少的请求数量
-
- TCP连接建立后,每个资源获取完成后,不会断开连接,而是继续等待其它资源请求的进行,如何断开 ?
-
3、MPM
修改2.2版本中的MPM机制,需要修改/etc/sysconfig/httpd中,启用HTTPD=/usr/sbin/httpd.worker或者指定其它的MPM模块,需要重启服务方可生效。-
prefork
的配置<IfModule prefork.c> StartServers 8 #启动时启动多少个进程 MinSpareServer 5 #最少空闲进程 MaxSpareServers 20 #最大空闲进程 ServerLimit 256 #最大启动多少个进程数,可大于maxclients MaxClients 256 #最大进程在线数量,不能大于serverlimit MaxRequestsPerChild 4000 #表示每个进程最多处理多少个请求,达到数量时由主进程销毁 </IfModule>
-
worker
的配置<IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 #0表示不启用 </IfModule>
-
-
4、配置指定实现模块加载
-
1、定义格式
LoadModule <mod_name> <mode_path>
-
2、使用相对路径,是相对于serverroot,默认为/etc/httpd
-
-
5、定义中心主机"Main server"的文档页面路径
-
1、定义格式
DocumentRoot "/var/www/html"
-
2、文档路径映射
- DocumentRoot指向的路径为URL路径的起始位置,相当于站点URL的根路径
-
-
6、站点访问控制定义方法
-
1、基于文件系统路径
方法一: <Directory "/PATH"> ...... </Directory> 方法二 <File "/PATH"> ...... </File> 方法二 <FileMatch "PATTERN"> ..... </FileMatch> #以模式匹配,需要启动正则表达式引擎,其效率低
-
2、基于URL
方法一: <Location "/"> ...... </Location> 方法二: <LocationMatch "/"> ...... </LocationMatch>
-
-
7、站点访问控制设定
-
1、基于IP方式实现控制
<Location /server-status> SetHandler server-status order deny,allow #定义生效次序 deny from all allow from 172.16.249.148 </Location> ##注意: 来源地址定义格式,可如下方式: 172.16 172.16.0.0 172.16.0.0/16 172.16.0.0/255.255.255.0
-
2、基于用户名和密码方式实现控制
<Directory "/www/b.com/htdocs"> Options None #可以定义多个,使用空格分开,None表示不定义 AllowOverride None #是否允许覆盖,覆盖面面order或者auth的认证,None表示不定义 AuthType Basic #认证类型 AuthName "Please Enter your username and password." #认证提示 AuthUserFile "/etc/httpd/conf/.htpass" #用户和密码存放路径 AuthGroupFile "/etc/httpd/conf/.htpass_group" #用户组的定义存放路径 Require group mygrp #允许mygrp组中的用户 或者只是定义用户,不定义组 AuthType Basic #认证类型 AuthName "Please Enter your username and password." #认证提示 AuthUserFile "/etc/httpd/conf/.htpass" #用户和密码存放路径 Require user zhenping #只允许用户zhenping登录,多个用户可以使用空格隔开 </Directory> 注意1:如果需要定义的所有用户都可以访问,需使用: Require valid-user 注意2:认证方式有两种: basic :明文 digest : 消息摘要认证 注意3:用户及密码的存储方式 文本文件 SQL数据库 Ldap目录服务 注意4:组文件定义格式 GROUP_NAME: group1 group2 注意4:用户名的密码需要使用htpasswd工具来创建,如下格式: htpasswd -c -m /etc/httpd/conf/.htpasswd tom Options: -c : 自动创建加密文件,一般用于第一次 -D : 删除用户 -m : 以MD5格式加密 -s : 以sha格式加密
-
Options的各参数说明:
Index:定义索引,索引是指列出目录下所有的文件 None:不支持任何选项 FollowSymLinks:跟随符号连接,意味访问符号连接所指向的文件,会降低服务器的性能 Includes:允许执行服务器端包含(SSI),此方式不安全 SymLinksifOwnerMatch:允许执行符号连接,但属主必须与执行httpd进程的属主相匹配,不 开放 ExecCGI:允许执行CGI脚本 MultiViews:判断客户端使用的语言,并显示相应语言的网页,一般比较消耗资源 ALL:启用所有选项
-
-
-
8、定义站点主页
-
1、定义格式
DocumentRoot "/www/htdocs"
-
2、未定义的错误提示
- 404 Not Found错误
- 显示目录下的所有文件
-
-
9、定义路径别名
- 1、定义格式
-
alias /URL/ "/PATH"
alias /download/ "/rpms/pub" #后者为文件系统路径
-
- 1、定义格式
-
10、定义默认字符集
-
1、定义格式
AddDefaultCharset UTF8 可支持的中文字符集:GBK,GB2312,GB18030
-
-
11、日志设定
-
1、错误日志的定义格式
ErroLog logs/error_log LogLevel warn ##日志等级为: Debug Info notice Warn Error Crit Alert Emerg
-
2、访问日志的定义格式
CustomLog logs/access_log combined #combined为日志格式 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent #其宏定义的格式: %h :客户端的IP地址 %l :远程登陆的用户名,通常为一个减号“-” %u :远程登陆的用户(from auth),非登陆访问时,其为一个减号 %t :服务器收到请求的时间,standerd english time %r :First line of request,表示请求报文的首先,记录了此次请求的:方法,URL,协议版本 %>s :响应的状态码 %b :响应报文的大小,单位字节,不包含http请求首部 %{Referer}i : 请求报文中首部"referer"的值,即从那个页面中的超连接跳转至当前页面 %{User-Agent}i : 请求报文中首部"User-Agent"的值,即发出请求的应用程序,浏览器类型
-
-
12、虚拟主机(如果需要虚拟主机的方式,需先注释中心主机的DocumentRoot)
- 1、实现方式
-
基于IP
<VirtualHost 192.168.0.1:80> ...... </VirtualHost> <VirtualHost 192.168.0.2:80> ...... </VirtualHost>
-
基于PORT
<VirtualHost 192.168.0.1:80> ...... </VirtualHost> <VirtualHost 192.168.0.1:8080 ...... </VirtualHost>
-
基于FQDN
<VirtualHost 192.168.0.1:80> servername www.a.com ...... </VirtualHost> <VirtualHost 192.168.0.1:80> servername www.b.com ..... </VirtualHost> 注意:如果需要在2.2版本及以下,需要使用NameVirtualHost IP:PORT来先定义,2.4以后版本不需要
-
- 1、实现方式
-
13、status页面
1、启用加载对应的模块 LoadModules status_module modules/mod_status.so 启用server-status容器选项 <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from .example.com </Location> 访问 www.a.com/server-status
-
14、域名别名
-
1、定义格式
serveralias www.b.com www.a.com #将www.b.com定义为www.a.com
-
httpd的子命令
-
httpd -l
: 查看httpd所支持的MPM类型 -
httpd -t
: 测试主配置文件是否有语法错误 -
httpd -M
: 查看http的加载模块
========
15 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,socket5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大.
-
用法:
- curl [options] [URL....]
-
常用选项
-
-A / --user-agent <string>
: 设置用户代理发送给服务器 -
--base
: 使用http基本认证 -
--tcp-nodelay
: 使用tcp_nodelay选项 -
-e / --referer <URL>
: 来源网址 -
--cacert <file>
: CA证书(SSL) -
--compressed
: 要求返回是压缩的格式 -
-H / --header <line>
: 自定义首部信息传递给服务器 -
-I / --head
: 只显示响应报文首部信息 -
--limit-rate <rate>
: 设置传输速度 -
-u / --user <user[:password]>
: 设置服务器的用户和密码 -
-0 / --http1.0
: 使用HTTP1.0
-
16 apache的用户及组
指定以哪个用户的身份运行httpd服务进程
- user apache
- group apache
如果需要使用root权限执行操作时,需要使用SUexec命令调用相关操作
17 使用mod_deflate模块压缩页面优化传输速度
- 适用场景
- 节约带宽,额外消耗CPU,同时可能有些老浏览器不支持
- 压缩适于压缩的资源,例如文本文件
####设置一个过滤器,名称为DEFLATE ,名称用于后面设置参数引用
SetOutputFilter DEFLATE
# mod_deflate configuration
####设置指定那些类型需要压缩
# 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
####设置压缩级别
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
####排除老的浏览器
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
18 配置https
-
配置https的注意事宜
- yum安装httpd服务情况:
需要安装mod_ssl模块,其安装后会在/etc/httpd/conf.d/目录下生成ssl.conf文件,需要其配置文件中加载相应的模块文件及配置
- 编译安装httpd服务的情况:
要编译的时候可以使用 --enable-ssl选项启用ssl功能,只需要在httpd的配置文件中, 加载相应的ssl模块及配置相关ssl参数
-
SSL会议的简化过程
- 客户端发送可供选择的加密方式,并向服务器请求证书
- 服务器端发送证书以及选定的加密方式给客户端
- 客户端取得证书并先进行证书验证
- 验证证书的合法性,用CA的公钥解密证书上数字签名
- 验证证书的内容合法性:完整性验证
- 检查证书的有效期限
- 检查证书是否被吊销
- 证书中拥有者的名字,与访问的目标主机是否一致
- 客户端生成临时会议密码(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
- 服务器用此密码加密用户请求的资源,响应给客户端
-
https配置实例
yum install httpd -y
CA
cd /etc/pki/CA/
[root@Centos7 CA]# ls
certs crl newcerts private
[root@Centos7 CA]# cd private/
[root@Centos7 private]# (umask 077; openssl genrsa -out cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
.........................................+++
........................+++
e is 65537 (0x10001)
[root@Centos7 private]#
[root@Centos7 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Mageedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.mageedu.com
Email Address []:admin@mageedu.com
[root@Centos7 CA]# ls
cacert.pem certs crl newcerts private
[root@Centos7 CA]# touch index.txt serial
[root@Centos7 CA]# echo 01 > serial
[root@Centos7 CA]# ls
cacert.pem certs crl index.txt newcerts private serial
http server
root@Centos7 ~]# cd /etc/httpd/
[root@Centos7 httpd]# ls
conf conf.d conf.modules.d logs modules run
[root@Centos7 httpd]# mkdir ssl
root@Centos7 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
...+++
.................................................................................+++
e is 65537 (0x10001)
[root@Centos7 ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Mageedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.zhenping.com
Email Address []:admin@zhenping.com
[root@Centos7 ssl]# scp httpd.csr root@172.16.36.71:/tmp
CA Server
[root@Centos7 CA]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
Serial Number: 1 (0x1)
Validity
Not Before: Jan 17 23:42:58 2016 GMT
Not After : Jan 16 23:42:58 2017 GMT
Subject:
countryName = CN
stateOrProvinceName = CN
organizationName = Mageedu
organizationalUnitName = Ops
commonName = www.zhenping.com
emailAddress = admin@zhenping.com
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
Netscape Comment:
OpenSSL Generated Certificate
X509v3 Subject Key Identifier:
61:7F:29:8A:68:A6:70:C2:F2:0E:49:15:D7:DD:4D:02:BF:EF:92:6A
X509v3 Authority Key Identifier:
keyid:18:F8:A6:71:FB:05:F3:0C:D3:56:9C:90:78:F1:4D:B5:0E:EC:51:5F
Certificate is to be certified until Jan 16 23:42:58 2017 GMT (365 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@Centos7 CA]# scp certs/httpd.crt root@172.16.36.70:/etc/httpd/ssl
The authenticity of host '172.16.36.70 (172.16.36.70)' can't be established.
ECDSA key fingerprint is f7:6e:2f:38:57:8e:8c:0b:12:74:cc:af:44:82:88:17.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.36.70' (ECDSA) to the list of known hosts.
root@172.16.36.70's password:
httpd.crt 100% 4606 4.5KB/s 00:00
httpd server
vim /etc/httpd/conf.d/ssl.conf
DocumentRoot "/var/www/html"
ServerName www.zhenping.com
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
http的配置实例:
root@Centos6-ser1 ~]# cat /etc/httpd/conf.d/vhost.conf
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
order deny,allow
deny from all
allow from 172.16.249.148
</Location>
namevirtualhost 172.16.36.60:80
<VirtualHost 172.16.36.60:80>
servername wwww.a.com
Documentroot "/www/a.com/htdocs/"
alias /download "/www/a.com/htdocs/file"
Errorlog /www/log/a.com/error.log
LogLevel warn
Customlog /www/log/a.com/access.log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
<Directory "/www/a.com/htdocs/file/">
Options Indexes
AllowOverride None
AuthType Basic
AuthName "Please enter you username and password...."
AuthUserFile "/etc/httpd/conf/.htpass"
Require user zhenping
</Directory>
</virtualhost>
<virtualhost 172.16.36.60:80>
servername www.b.com
documentroot "/www/b.com/htdocs"
Errorlog /www/log/b.com/error.log
LogLevel warn
Customlog /www/log/b.com/access.log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
<Directory "/www/b.com/htdocs">
Options None
AllowOverride None
AuthType Basic
AuthName "Please Enter your username and password."
AuthUserFile "/etc/httpd/conf/.htpass"
AuthGroupFile "/etc/httpd/conf/.htpass_group"
Require group mygrp
</Directory>
</virtualhost>
<virtualhost 172.16.36.60:80>
servername www.c.com
documentroot "/www/c.com/htdocs"
ErrorLog /www/log/c.com/error.log
LogLevel warn
CustomLog /www/log/c.com/access.log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
<Directory "/www/c.com/htdocs">
Options None
AllowOverride None
order deny,allow
deny from all
allow from 172.16.249.148
</Directory>
</virtualhost>