http: hyper text transfer protocol, 80/tcp
html: 编程语言,超文本标记语言;
TITLE
blabla... blabal
CSS: Cascading Style Sheet
js: javascript
MIME: Multipurpose Internet Mail Extesion 多用途互联网邮件拓展
工作机制:
http请求:http request
http响应:http response
Web资源:web resource
静态文件:.jpg, .gif, .html, .txt, .js, .css, .mp3, .avi
动态文件:.php, .jsp,
媒体:
媒体类型(MIME类型):major/minor
text/html
text/plain
image/jpeg
image/gif
URI:每个Web服务器资源都有一个名字,服务器资源名被称为URI(统一资源标识符)
URI有俩种形式:
URL(通过描述资源的位置来标识位置的)
URN(通过名字来标识资源)
URL:(统一资源定位符),URL描述了一台特定服务器上某资源的特定位置。
Scheme(方案,协议类型)://Server:Port(服务器因特网地址)/path/to/resource(Web服务器上的某资源)
为了向应用程序提供它们所需要的输入参数,以便正确的与服务器交互,URL中有一个参数组件,名值对列表,由“;”将其与URL
的其余部分分隔开来。如ftp://prep.ai.mit.edu/pub/gnu;type=d
绝对URL:包含有访问资源所需的全部信息
相对URL:URL的一种便携缩略记法,
http协议版本:
HTTP/0.9:原型版本,功能简陋
HTTP/1.0:第一个广泛使用的版本,支持MIME
HTTP/1.1: 增强了缓存功能
spdy(Google 研发)
HTTP/2.0:
rfc
一次完整的http请求处理过程:
(1) 建立或处理连接:接收请求或拒绝请求
(2) 接收请求:
接收来自于网络的请求报文中对某资源的一次请求的过程;
并发访问响应模型(Web I/O):
单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;多个请求被串行响应;
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用I/O结构:一个进程响应n个请求;
多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
事件驱动:event-driven 一个进程直接响应N个请求
复用的多进程I/O结构:启动多个(m)进程,每个进程生成n个线程;
(3) 处理请求:对请求报文http首部进行解析,并获取请求的资源及请求方法等相关信息
元数据:请求报文首部
Host: www.magedu.com 请求的主机名称
Connection:
(4) 访问资源:获取请求报文中请求的资源
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源;这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
/var/www/html/
images/1.jpg
http://www.magedu.com/images/1.jpg
web服务器资源路径映射方式:
(a) docroot
(b) alias
(c) 虚拟主机docroot
(d) 用户家目录docroot
(5) 构建响应报文
资源的MIME类型:
显式分类
魔法分类
协商分类
URL重定向:
web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径;
(6) 发送响应报文
(7) 记录日志
http支持几种不同的请求命令,称为http方法(http method)
http method:(每条http请求都包含一个http方法,这个方法告诉服务器要执行什么操作)
常见method:
GET:从服务器获取一个资源;
HEAD:只从服务器获取文档的响应首部;
POST:向服务器发送要处理的数据;
PUT:将请求的主体部分存储在服务器上;
DELETE:请求删除服务器上指定的文档;
TRACE:追踪请求到达服务器中间经过的代理服务器;
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;
POST用于向服务器发送数据,PUT用于向服务器上的资源(例如文件)中存储数据。
http状态码:(每个http响应报文返回时都会携带一个状态码)
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: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway
Web的结构组件
代理
位于客户端和服务器之间的http中间实体
缓存
http的仓库,使常用的页面副本离客户更近
网关
连接其他应用程序的特殊web服务器
隧道
对http通信报文进行盲转发的特殊代理
Agent代理
发起自动http请求的半智能web客户端
http报文
起始行(shart line)
首部(header)
主体(body)(可选)
请求报文的格式
响应报文的格式
报文组成简要描述:
方法
请求URL
报文所使用的http版本 格式为HTTP/.
主要版本号
次要版本号
状态码
原因短语
首部
通用首部
请求首部
响应首部
实体首部
拓展首部
实体的主体部分
HTTP允许客户端和最终的源服务器之间存在一串HTTP中间实体(代理、高速缓存等)
可以从客户端开始,逐跳的将HTTP报文经过这些中间设备,转发到远端服务器上去。
TCP连接
TCP的数据是通过IP数据报(IP分组)的小数据块来发送的。
每个IP分组中都包括:
一个IP分组首部
一个TCP段首部
一个TCP数据块
在任意时刻计算机都可以有几条TCP连接处于打开状态,TCP是通过端口号来保持连接的正确运行的。
TCP连接是通过4个值来识别的:
<源IP地址,源端口号,目的IP地址,目的端口号>
这4个值一起唯一定义了一条连接。不同的TCP连接拥有不同的地址组件值。
TCP连接是双向的,TCP连接的每一端口都有一个输入队列和一个输出队列,用于数据的读或写。放入一端输出队列中的数据会出现在另一端的输入队列中。
TCP的完全关闭和半关闭
应用程序可以关闭TCP输入和输出信道中的任意一个,或者将俩者都关闭了。
套接字调用close()会将TCP连接的输入和输出信道都关闭。这被称作"完全关闭",
还可以调用shutdown()单独关闭输入或输出信道。
提高http连接性能的方法:
并行连接
通过多条TCP连接发起并发的http请求
持久连接
重用TCP连接,以消除连接及关闭时延
持久连接有俩种类型:
比较老的http/1.0+ "keep-alive"连接
现代的http/1.1 "persistent"连接
实现HTTP/1.0 keep-alive 连接的客户端可以通过包含Connection:Keep-Alive 首部请求将一条连接保持在打开状态。
如果服务器愿意为下一条请求将连接保持在打开状态,就在响应报文中包含相同的首部。
如果响应中没有Connection:Keep-Alive 首部,客户端就认为服务器不支持keep-alive
会在发回响应报文之后关闭连接。
Keep Alive 选项:
keep-alive 首部只是请求将连接保持在活跃状态。发出keep-alive请求之后,客户端和
服务器并不一定会同意进行keep-alive会话。它们可以在任意时刻关闭空闲的keep-alive连接,并
可限制keep-alive连接所处理事务的数量。
可以用keep-alive通用首部中指定的,由逗号分隔的选项来调节keep-alive的行为。
keep-alive响应首部可用的选项:
timeout:估计了服务器希望将连接保持在活跃状态的时间。
max:估计了服务器希望为多少个事务保持此连接的活跃状态。
范例:Connection:Keep-Alive
Keep-Alive:max=5,timeout=120
http处理请求的连接方式:
保持连接(长连接):keep-alive
非保持连接(短连接)
http服务器程序(只能处理静态程序):
httpd (apache)
nginx
lighttpd(德国人研发)
应用程序服务器(可解析动态程序):
IIS
tomcat, jetty, jboss(RedHat,重新封装的tomcat), resin
webshpere(IBM,用于解析jsp), weblogic(Oracle公司产品,用于解析jsp), oc4j
www.netcraft.com
httpd的安装配置和使用:
httpd: apache
a patchy server = apache
ASF: apache software foundation
httpd的特性:
事先创建进程
按需维持适当的进程
高度模块化:core + modules
支持运行时配置,支持单独编译模块
DSO: Dynamic Shared Object 动态共享对象
MPM:Multipath Processing Modules (多路处理模块)
prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成n个子进程及回收子进程,主进程也负责创建套接字,负责接收请求,并将其派发给某子进程进行处理;
子进程:子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
worker:多进程多线程模型,每个线程响应一个请求;
一个主进程:生成多个子进程,主进程也负责创建套接字,负责接收请求,并将其派发给某子进程进行处理,每个子进程负责生个多个线程,每个线程响应一个请求;
m子进程,n线程:m*n
event:事件驱动模型,多进程模型,每个进程响应n个请求;
一个主进程:负责生成子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理
子进程:基于事件驱动机制直接响应多个请求
m*n
httpd-2.2: event为测试使用
httpd-2.4:event可生产使用
httpd的功能特性:
apache主机的分类:
中心主机
虚拟主机
虚拟主机和中心主机一般不能同时使用
虚拟主机:服务于多个不同的站点
IP:不同虚拟主机IP不同,端口相同
Port:IP地址可以是同一个,但端口不同
FQDN(实际应用最多):
IP相同,端口相同,FQDN不同
需要在配置文件中使用特殊指令指定启用基于FQDN的虚拟主机:
CGI:(通用网关接口,让web服务器能跟额外的应用程序通信的一种机制,是Web服务器和Web应用程序之间数据交换的一种协议)
(httpd或web服务器并不处理任何动态内容,而是通过某种协议调用额外的的其他程序来运行程序并将结果返回)
FastCGI:同CGI,是一种通信协议,但比CGI在效率上做了一些优化。同样,SCGI协议与FastCGI类似。
PHP-CGI:是PHP(Web Application)对Web Server提供的CGI协议的接口程序。
PHP—FPM:是PHP(Web Application)对Web Server提供的FastCGI协议的接口程序,额外还提供了相对智能一些任务管理。
反向代理
Apache允许将远程文档纳入本地服务器的网络空间中,因为Web服务器扮演一个代理服务器的角色(从远程服务器取得文档并返回给客户)
,所以这种机制被称为反向代理,不同于标准代理的是,在客户看来,他请求的文档似乎原本就位于这个反向代理服务器上。
负载均衡
路径别名
支持https协议(mod_ssl模块)
丰富的用户认证机制
支持基于IP或主机名的ACL
支持每目录的访问控制
支持URL重写
...
支持第三方模块
安装httpd:
rpm包
源码编译安装
httpd受Selinux控制
回顾:
MPM:
prefork:多进程模型,一个进程响应一个请求;
worker:多线程模型(多进程生成,一个进程生成多个线程),一个线程响应一个请求;
event:事件驱动模型,一个线程响应多个请求;
并发服务器响应请求:
单进程I/O模型;
多进程I/O模型;
复用的I/O模型;
多线程模型
事件驱动
利用的多进程I/O模型;
httpd(2)
CentOS 6: 2.2
CentOS 7: 2.4
安装方式:
rpm
编译
CentOS 6:
程序环境
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
主程序文件:
/usr/sbin/httpd (MPM:prefork)
httpd服务启动后,会有多个进程
root 属主/组的 为master进程,专门用来创建及销毁空闲进程。
apache进程 属主/组的 为工作进程,负责真正处理用户请求。
/etc/httpd:工作根目录,相当于程序安装目录
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日志文件目录:
/etc/httpd/logs---> /var/log/httpd
access_log: 访问日志
error_log:错误日志
站点文档目录:
/var/www/
html
cgi-bin
模块文件路径:
/etc/httpd/modules---->/usr/lib64/httpd/modules
配置文件的组成:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment 全局环境配置
### Section 2: 'Main' server configuration 主服务器配置
### Section 3: Virtual Hosts 虚拟主机配置
配置格式:directive value
directive: 不区分字符大小写;
value: 为路径时,是否区分字符大小写,取决于文件系统;
httpd -t 命令可检查配置文件语法是否正确
使用配置段(容器)限定指令的作用域:
主配置文件中的指令对整个服务器都有效。如果只想改变一部分的设置,你可以把指令嵌入到、
、、配置段(容器)中,这样就可以限制指令作用域为文件系统中的某些位置或特定的URL。
、、仅在启动和重新启动中起作用
和指令与其相应的正则表达式版本(,)一起作用于文件系统的特定部分
配置段中的指令作用于指定的文件系统目录极其所有子目录。
配置段中的指令作用于特定的文件名,而无论这个文件存在于哪个目录。
指令与其对应的正则表达式版本一起作用于网络空间的特定部分。
Apache具备同时支持多个站点的能力,称为虚拟主机,配置段中的指令仅对该段中的特定站点(虚拟主机)有效。
虽然大多数指令可以包含在任意的配置段中,但是某些指令仅在某些特定的范围内采用意义。比如,控制进程建立的指令仅在
服务器范围内有效。
LoadRunner :知名企业级压力测试工具
URL路径跟WEB服务器本地文件系统路径不是一回事,URL是相对于DocumentRoot的路径而言的
只能在特定配置段(容器)中使用的指令:
AllowOverride指令只能出现在中
Options中FollowSymlinks和SymLinksIfOwnerMatch只能出现在或.htaccess文件中
Options不能用于和
常用配置:
1、修改监听的IP和Port (/etc/httpd/conf/httpd.conf)
Listen [IP:]PORT
#Listen指令并不实现虚拟主机,它只是告诉主服务器去监听那些地址和端口。
如果没有指令,服务器将对所有请求一视同仁;但是如果有指令
则服务器会对不同的地址或端口作出不同的响应。要实现虚拟主机,首先必须告诉服务器需要
监听哪些地址和端口,然后为每个特定的地址和端口建立一个段来执行特定的响应。
如果将段设置为服务器没有监听地址和端口则此段无效。
省略ip表示监听本机所有IP; Listen可重复出现多次;
修改监听的地址和端口 只有重启进程方可生效
2、持久连接
Persistent Connection:TCP连接建立后,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成;
如何断开?
数量限制:100
时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应;
折衷:使用较短的持久连接时间;
httpd-2.4 支持毫秒级持久时间;
KeepAlive On|Off
MaxKeepAliveRequests #最大的请求资源数量
KeepAliveTimeout #超时时间(单位秒)
测试:
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3、MPM
Multipath Process Module:多道处理模块
prefork (一个请求用一个进程响应)
worker (一个请求用一个线程响应,启动多个进程,每个进程生成多个线程)
event (一个进程处理多个请求)
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持;确认方法:
# ps aux | grep httpd
默认为/usr/sbin/httpd, 其使用prefork
查看模块列表:
查看静态编译的模块
# httpd -l
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c
查看静态编译及动态装载的模块
# httpd -M
更换使用的httpd程序,已支持其他MPM机制:
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
重启服务生效;
prefork的配置:
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
#StartServers httpd进程启动时启动多少空闲进程
#MinSpareServers httpd最小空闲进程数
#MaxSpareServers httpd最大空闲进程数
#ServerLimit 最大在线进程数量
#MaxClients 最大并发响应进程数量
#MaxRequestsPerChild 每个进程最多可以处理多少请求,0表示不做限定
worker的配置:
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
#ThreadsPerChild 一个进程最多生成多少个线程
PV, UV
PV: Page View 页面访问
UV: User View 用户浏览量
独立IP量;
300*86400=40W+
4、DSO
通过配置指令实现模块加载
LoadModule
模块路径可使用相对地址
相对于ServerRoot(/etc/httpd)指向的路径而言;
/etc/httpd/modules/
5、定义'Main' server的文档页面路径
DocumentRoot
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置;
DocumentRoot "/var/www/html"
test/index.html --> http://HOST:PORT/test/index.html
6、站点访问控制
可基于两种类型的机制指明对哪些资源进行访问控制
文件系统路径:
#针对单个文件进行控制
#针对某类文件进行控制
URL路径:
...
访问控制机制:
基于来源地址;
基于账号;
7、Directory中“基于来源地址”实现访问控制
(1) Options 后跟一个或多个以空白字符分隔的选项列表
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None, All
None:不支持任何选项
Indexes: 索引(指定的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户);
(慎用,非常危险,除非做下载服务器使用)
FollowSymlinks:允许跟踪符号链接文件;(慎用,非常危险)
Includes:允许执行服务端包含(SSI)(慎用,非常危险)
ExecCGI :允许运行CGI脚本
(2) AllowOverride(允许覆盖)
与访问控制相关的那些指令可以放在.htaccess文件文件(每个目录下都可以有一个)中
.htaccess 将会降低网站访问性能
# AllowOverride None 表示不允许覆盖 , AllowOverride authconfig 表示允许
(3) 基于来源地址的访问控制机制
Order:定义生效次序,写在后面的表示默认法则
Order allow,deny 白名单
Order deny,allow 黑名单
Allow from 允许访问的来源地址
Deny from 不允许访问的来源地址
来源地址:
IP
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8、定义默认主页面
DirecotryIndex index.html index.html.var
9、日志设定
日志类型:访问日志和错误日志
错误日志:
使用ErrorLog logs/error_log 命令指定
LogLevel:(日志级别)
debug, info, notice, warn, error, crit, alert, emerg
错误级别,低------>高
访问日志:
使用CustomLog logs/access_log来指定访问日志
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
%h:客户端IP地址;
%l: Remote logname (from identd, if supplied).远程登录的用户名, -表示为空;
%u: Remote user, (from auth; may be bogus if return status (%s) is 401);远程用户,非为登录访问时,为一个"-"
%t:Time the request was received (standard english format),服务器收到请求的时间;
%r:First line of request,请求报文的首行信息(method url version);记录了此次请求的"方法",URL以及协议版本。
%>s: 响应状态码;
%b: 响应报文的大小,单位是字节,不包括响应报文首部;
%{Referer}i:请求报文当中"referer"首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值;即发出请求用到的应用程序;
详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路径别名
DocumentRoot "/www/htocs"
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /download/ "/rpms/pub/"
http://www.magedu.com/download/bash-4.4.2-3.e16.x86_64.rpm
--> /rpms/pub/bash-4.4.2-3.e16.x86_64.rpm
11、设定默认字符集
AddDefaultCharset UTF-8
GBK, GB2312, GB18030
12、基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过,则服务器发送响应的资源;
认证类型:
basic:明文
digest:消息摘要(需浏览器支持)
安全域:需要用户认证后方能访问的路径;
应该通过名称对其进行标识,并用于告知用户认证的原因;
用户的账号和密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
文本文件
SQL数据库
ldap目录存储
nis
basic认证:
(1) 定义安全域
Options None
AllowOverride AuthConfig
AuthType Basic #用户认证类型
AuthName "STRING" #指定使用认证的域,此域会出现在给用户的密码提问对话框中,其次也帮助客户端程序确定应该发送哪个密码
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" #指定用户认证文件
Require user username1 username2 ... #限定可以登录的用户
允许账号文件中的所有用户登录访问:
Require valid-user
(2) 提供账号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c: 自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
-m: md5加密用户密码;
-s: sha1加密用户密码;
-D: 删除指定用户
范例:
[root@localhost conf]# htpasswd -m /etc/httpd/conf/.htpasswd tom
New password: 输入密码
Re-type new password: 再输一回
Updating password for user tom
(3) 实现基于组进行认证
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" #指定密码文件
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" #指定组文件
Require group GROUP1 GROUP2 ... #限定可以登录的组
基于组账号进行认证要提供:用户账号文件和组文件;
组文件:每一行定义一个组
GRP_NAME:user1 user2 user3 ...
示例:
Options None
AllowOverride None
AuthType Basic
AuthName "Administator private"
AuthUserFile "/etc/httpd/conf.d/.htpasswd"
AuthGroupFile "/etc/httpd/conf.d/.htgroup"
Require group webadmin
13、虚拟主机
使用虚拟主机得先取消中心主机,注释中心主机的的DocumentRoot即可。
httpd -S 命令会输出解析配置文件的详细描述,仔细检查IP地址和主机名会有助于纠正配置错误。
建议在/etc/httpd/conf.d/下创建单独的虚拟主机配置文件
有三种实现方案:
基于ip:
为每个虚拟主机准备至少一个ip地址;
基于port:
为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:
为每个虚拟主机准备至少一个专用hostname;
Apache2.2 需要通过NameVirtualHost指令指定
可混合使用上述三种方式中任意方式;
注意:一般虚拟主机莫与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
SeverName
DocumentRoot ""
ServerAlias: 虚拟主机的别名;
ErrorLog
CustomLog
示例1:基于ip
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
示例2:基于port
Listen 8080
ServerName web2.magedu.com
DocumentRoot "/vhosts/web2/htdocs"
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
示例3:基于hostname
建议在/etc/httpd/conf.d/下使用单独的虚拟主机配置文件配置
NameVirtualHost 172.16.100.6:80 #为一个基于域名的虚拟主机指定一个IP地址(和端口)
注意:NameVirtualHost指令的参数和VirtualHost指令的参数必须完全匹配
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
ServerName web2.magedu.com #
DocumentRoot "/vhosts/web2/htdocs"
目录属性及权限
ServerName web3.magedu.com
DocumentRoot "/vhosts/web3/htdocs"
CustomLog /var/log/httpd/magedu.com/web1_access_log combined
范例:
在/etc/httpd/conf/httpd.conf 中注释中心主机的的DocumentRoot
创建/etc/httpd/conf.d/Virtualhost.conf
配置以下内容
NameVirtualHost 10.49.128.88:80
ServerName web1.magedu.com
DocumentRoot "/vhost/web1/htdocs"
CustomLog /var/log/httpd/magedu.com/web1_access_log combined
ErrorLog /var/log/httpd/magedu.com/web1_err_log
LogLevel warn
ServerName web2.magedu.com
DocumentRoot "/vhost/web2/htdocs"
CustomLog /var/log/httpd/magedu.com/web2_access_log combined
ErrorLog /var/log/httpd/magedu.com/web2_err_log
LogLevel warn
ServerName web3.magedu.com
DocumentRoot "/vhost/web3/htdocs"
CustomLog /var/log/httpd/magedu.com/web3_access_log combined
ErrorLog /var/log/httpd/magedu.com/web3_err_log
LogLevel warn
14、内置的status页面
得确保模块加载项中,有以下内容:
LoadModule status_module modules/mod_status.so
SetHandler server-status #SetHandler xxx 强制将所有匹配的文件通过xxx指定的处理器处理
Order deny,allow
Deny from all
Allow from 172.16
实现:基于账号实现访问控制
回顾:
httpd的配置:
Listen [IP:]PORT
KeepAlived {ON|Off}
MPM:
prefork, worker, event
DSO:
LoadModule
httpd -M
DocumentRoot
Options Indexes FollowSymLinks
Order
Allow from
Deny from
DirectoryIndex
ErrorLog
CustomLog
LogFormat
%{Referer}i: 引用Referer首部的值;
Alias /URL/ "/path/to/somedir/"
基于用户访问控制:
认证方式:basic, digest
AuthType Basic
AuthName ""
AuthUserFile
AuthGroupFile
Require user
Require group
Require valid-user
.htpasswd:
htpasswd
虚拟主机:IP, Port, FQDN
http协议和httpd的配置
URL:Unifrom Resource Locator
URL方案:scheme
服务器地址:ip:port
资源路径:
http://www.magedu.com:80/bbs/index.php,
https://
基本语法:
://:@:/;?#
params: 参数
http://www.magedu.com/bbs/hello;gender=f
query:条件
http://www.magedu.com/bbs/item.php?username=tom&title=abc
frag:片段
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86
相对URL
绝对URL
http协议:
http/0.9, http/1.0, http/1.1, http/2.0
http协议:stateless 无状态协议
服务器无法持续追踪访问者来源
cookie, session
http事务:
请求:request
响应:response
报文语法格式:
request报文
response报文
method: 请求方法,标明客户端希望服务器对资源执行的动作
GET、HEAD、POST
version:
HTTP/.
status:
三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况;
reason-phrase:
状态码所标记的状态的简要描述;
headers:
每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值;
entity-body:请求时附加的数据或响应时附加的数据;
method(方法):
GET:从服务器获取一个资源;
HEAD:只从服务器获取文档的响应首部;
POST:向服务器发送要处理的数据;
PUT:将请求的主体部分存储在服务器上;
DELETE:请求删除服务器上指定的文档;
TRACE:追踪请求到达服务器中间经过的代理服务器;
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;
协议查看或分析的工具:
tcpdump, tshark, wireshark
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 Modifile(没有发生修改)
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway
headers:
格式:
Name: Value
Cache-Control:public, max-age=600
Connection:keep-alive
Content-Type:image/png
Date:Tue, 28 Apr 2015 01:43:54 GMT
ETag:"5af34e-ce6-504ea605b2e40"
Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:access.redhat.com
If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT
If-None-Match:"5af34e-ce6-504ea605b2e40"
Referer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
首部的分类:
通用首部
请求首部
响应首部
实体首部
扩展首部
通用首部:
Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点
Cache-Control:控制缓存
Pragma:
请求首部:
Accept:通过服务器自己可接受的媒体类型;
Accept-Charset:接收的字符集
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-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-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:
Allow: 列出对此实体可使用的请求方法
Location:告诉客户端真正的实体位于何处
Content-Encoding:主体的编码格式
Content-Language:主体使用的语言
Content-Length: 主体的长度
Content-Location: 实体真正所处位置;
Content-Type:主体的对象类型
缓存相关:
ETag:实体的扩展标签;
Expires:实体的过期时间;
Last-Modified:最后一次修改的时间
httpd-2.2
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, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl [options] [URL...]
curl的常用选项:
-A/--user-agent 设置用户代理发送给服务器
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer 来源网址
--cacert CA证书 (SSL)
--compressed 要求返回是压缩的格式
-H/--header 自定义首部信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate 设置传输速度
-u/--user 设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
用法:curl [options] [URL...]
另一个工具:elinks
elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
16 使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;
SetOutputFilter DEFLATE #设置输出过滤器,只压缩符合条件的
# mod_deflate configuration
# 将会压缩的文件类型
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 #指明压缩级别
17、https
http over ssl = https 443/tcp
ssl: v3
tls: v1
https://
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;
(2) 服务器端发送证书以及选定的加密方式给客户端;
(3) 客户端取得证书并进行证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持https:
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA
(b) 在服务器创建证书签署请求
(c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书;
# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
18、httpd自带的工具程序
htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具;
apachectl:httpd自带的服务控制脚本,支持start, stop;
apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具;
rotatelogs:日志滚动工具;
access.log -->
access.log, access.1.log
access.log, access.1.log, access.2.log
suexec:
访问某些有特殊权限配置的资源时,临时切换至指定用户运行;
ab: apache benchmark
19、http压力测试工具
ab
webbench
http_load
jmeter
loadrunner
tcpcopy:网易开发,复制生产环境中的真实请求,并将之保存下来
ab [OPTIONS] URL
-n: 总的请求数
-c:模拟的并发数
-k: 以持久连接模式测试
ulimit -n #: 调整当前用户所同时打开的文件数;
20. user/group
http进程由root用户启动,但root用户不负责处理用户请求,而是创建子进程后,交由普通用户负责处理用户请求
具体交由那个普通用户来处理用户请求,通过配置文件中的 User 用户名 Group 组名 来指定
范例:
User apache
Group apache
练习题:
1、建立httpd服务器,要求:
提供两个基于名称的虚拟主机:
(a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;
(b)www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access;
(c)为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;
(d)通过www1.stuX.com/server-status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status);
2、为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(Beijing)、城市(Beijing)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为[email protected];
回顾:httpd协议基础,httpd的基础配置
http事务:请求<-->响应
request:
response:
请求方法:GET, HEAD, POST, PUT, DELETE, OPTIONS, TRACE, ...
响应状态码:
1xx: 额外信息
2xx: 成功类,200
3xx: 重定向类
4xx:客户端错误
5xx:服务器端错误
httpd的基本配置:
curl, https(ssl), ab
http的应用
httpd-2.4:
新特性:
(1) MPM支持运行DSO机制;以模块形式按需加载;
(2) 支持event MPM;
(3) 支持异步读写;
(4) 支持每模块及每个目录分别使用各自的日志级别;
(5) 每请求相关的单独配置;
(6) 增强版的表达式分析器;
(7) 支持毫秒级的keepalive timeout;
(8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令;
(9) 支持用户自定义变量;
(10) 新指令AllowOverrideList
(11) 更低的内存消耗
新模块:
(1) mod_proxy_fcgi
(2) mod_proxy_scgi
(3) mod_ratelimit
(4) mod_remoteip #新的访问控制机制
修改了一些配置机制:
不再支持使用Order, Deny, Allow来做基于IP的访问控制;
安装httpd-2.4
httpd依赖于apr-1.4+, apr-util-1.4+, [apr-icon]
apr: apache portable runtime
CentOS 6:
默认:apr-1.3.9, apr-util-1.3.9
编译安装步骤:
1.4+版的apr和apr-util
前提:
安装开发环境,安装pcre-devel
(1) apr
# ./configure --prefix=/usr/local/apr
# make && make install
(2) apr-util
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install
编译安装:httpd 2.4
# ./configure --prefix=/usr/local/apache24 --sysconf=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
# make && make install
启动服务:
/usr/local/apache24/bin/apachectl start
编译安装后配置:
1.cd /etc/profile.d/
创建文件 httpd24.sh
在httpd24.conf添加以下内容
export PATH=/usr/local/apache24/bin:$PATH
2.
ln -sv /usr/local/apache24/include /usr/include/httpd
3.
httpd 服务脚本(手工修改apache2.2服务脚本产生)(如httpd2.4编译安装的化,需手工创建)
#!/bin/bash
# Source function library.
. /etc/rc.d/init.d/functions
# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}
# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""
# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.
# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache24/bin/apachectl
httpd=${HTTPD-/usr/local/apache24/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/usr/local/apache24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}
# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure. So we just do it the way init scripts
# are expected to behave here.
start() {
echo -n $"Starting $prog: "
LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
# When stopping httpd, a delay (of default 10 second) is required
# before SIGKILLing the httpd parent; this gives enough time for the
# httpd parent to SIGKILL any errant children.
stop() {
status -p ${pidfile} $httpd > /dev/null
if [[ $? = 0 ]]; then
echo -n $"Stopping $prog: "
killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
else
echo -n $"Stopping $prog: "
success
fi
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
RETVAL=6
echo $"not reloading due to configuration syntax error"
failure $"not reloading $httpd due to configuration syntax error"
else
# Force LSB behaviour from killproc
LSB=1 killproc -p ${pidfile} $httpd -HUP
RETVAL=$?
if [ $RETVAL -eq 7 ]; then
failure $"httpd shutdown"
fi
fi
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status -p ${pidfile} $httpd
RETVAL=$?
;;
restart)
stop
start
;;
condrestart|try-restart)
if status -p ${pidfile} $httpd >&/dev/null; then
stop
start
fi
;;
force-reload|reload)
reload
;;
graceful|help|configtest|fullstatus)
$apachectl $@
RETVAL=$?
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload|status|fullstatus|graceful|help|configtest}"
RETVAL=2
esac
exit $RETVAL
编译安装的httpd,切换使用MPM
编辑/etc/httpd24/httpd.conf 文件
将#Include /etc/httpd24/extra/httpd-mpm.conf 前的#去掉
修改LoadModule mpm_prefork_module modules/mod_mpm_prefork.so 这条语句
根据需要将prefork字段修改为event或worker
最后重启httpd24服务
CentOS 7:
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
模块配置文件:/etc/httpd/conf.modules.d/*.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
mpm:以DSO机制提供,配置文件00-mpm.conf
服务控制:systemctl {start|stop|restart|status|reload} httpd.service
配置:
(1) 切换使用MPM
修改/etc/httpd/conf.modules.d/00-mpm.conf
中的:
每个模式分别有一条配置命令。去掉相应命令前的#即可
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME: prefork, event, worker
同时只能使用一种模式
(2) 修改'Main' server的DocumentRoot
(3) 基于IP的访问控制法则
允许所有主机访问: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
Require local #只允许本机访问
HOSTNAME:
FQDN: 特定主机
DOMAIN:指定域内的所有主机
#控制针对所有主机的访问,要包含在特定容器中 (如果仅是一句允许或禁止所有主机访问则不需要,当额外要加控制机制如那个主机可以访问那个主机不能访问时则需要包含在容器中)
Require all granted
Require not ip 10.252.46.165
(4) 虚拟主机
基于IP、Port和FQDN都支持;
基于FQDN的不再需要NameVirtualHost指令;
任意目录下的页面只有被显示授权才能被访问
虚拟主机配置文件模板:
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
定义默认虚拟主机
注意:任意目录下的页面只有显式授权才能被访问
范例:
ServerName web1.magedu.com
DocumentRoot "/vhosts/web1/htdocs"
CustomLog /var/log/httpd/magedu.com/web1_access_log combined
ErrorLog /var/log/httpd/magedu.com/web1_err_log
LogLevel warn
AllowOverride None
Require all granted #需要显示授权
(5) ssl
使用yum install mod_ssl 命令安装
安装后会在/etc/httpd/conf.modules.d/目录下,生成00-ssl.conf文件(模块配置文件)
以及/etc/httpd/conf.d/ssl.conf (ssl主配置文件)
启用模块(00-ssl.conf中配置):
LoadModule ssl_module modules/mod_ssl.so