http:hyper text transfer protocol超文本传输协议
一、http简介
我们在浏览网页时,一定见过以html结尾的网页,这里html(hyper text mark language超文本标记语言)是一种编程语言,由html编写出来的文档即为超文本文档。
在早期,http只能传输超文本信息,而不能传输音视频等其他格式的文件,后来http协议中引入了MIME(mutipurpose Internet Mail Extesion)的机制,MIME可以将非文本文件编码成文本文件,并从一方发送到对方,再通过反向还原,将文本还原成非文本文件,简单说来就是基于文本的形式发送非文本数据。所以说现在的http协议已经支持多媒体了。
http是一种无状态连接,就是服务器端无法持续追踪访问者来源,后来引入了URL重写机制和cookie机制,通过此种机制追踪访问者来源。
下面介绍一下http工作原理:
http协议是基于TCP传输的应用层协议,http协议的最主要目的是实现跨主机发送文档。
下图为http协议的简单工作流程:
客户端基于http协议向服务器端发送请求,服务器内核收到请求后判断为该主机上web服务进程的请求,如过是,则把请求发送给该进程,然后,运行在服务器端的进程判断客户端请求的文件是什么文件,并从硬盘中调用此文件,封装成http响应报文后,通过网络送达给客户端。所以说,http的工作机制大体上分为http请求(图中123)和http响应(图中456)。
这些请求得来的超文本文件或音视频文件就是我们平常所说的web资源,web服务器就是存放了web资源的服务器,这些资源分为静态文件和动态文件两类:
(1)静态资源:客户端发送请求到服务器端,服务器调用资源直接响应,常见的静态文件格式:.jpg .gif .html .txt .js .mp3等等;
(2)动态资源:服务器端接收到客户端请求,并在服务器端通过特定的响应程序运行后得到某文件,再把这个文件响应给客户端,常见的动态文件格式:.php .jsp。
url(uniform resourcelocator统一资源定位符):用于描述服务某服务器某特定资源的位置(任何资源有且仅有一个位置)。
我们在访问页面的时候,请求的资源貌似仅仅是一个资源,但很多情况下不是这样,因为一个网页中会含有很多图片或一些音视频等等,其中每一个图片就是一个资源,每一个音视频也是一个资源,还可以通过一些其他的方式实现盗链等等。这些资源所在的位置是通过url来定位的。
url的格式:scheme://server:port/path/to/resource
举例:http://www.hao123.com/images/logo.jpg
上述例子中,端口号默认是80端口,/images/logo.jpg对应的是服务器本地的一个路径的图片资源。
一次完整的http请求处理过程分为以下7步:
(1) 建立或处理连接:接收客户端请求或拒绝请求;
(2) 接收请求:接收来自于网络的请求报文中对某资源的一次请求的过程;
如果多个客户端同时请求服务器,那么就涉及到了服务器的I/O并发响应模型:
1)单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;多个请求被串行响应;
举例:两个客户端访问web服务器,该服务器只能接收处理第一个客户端请求,待处理完毕连接断开后,再接收处理第二个客户端的请求。
2)多进程I/O结构:并行启动多个进程,每个进程响应一个请求;(缺点:各个进程间切换消耗的时间长,耗费的内存大,启动进程数量上限较低)
3)复用I/O结构:一个进程响应N个请求;(实现了每个进程可以处理多个请求)
多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
事件驱动:一个进程生成M个进程,每个进程响应N个请求;
4)复用的多进程I/O结构:启动多个(M)进程,每个进程响应M个请求;
(3) 处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息;
(4) 访问资源:获取请求报文中请求的资源;
Web服务器负责向请求者提供对方请求的静态资源,或动态运行后生成的资源;这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot,当访问www.hao123.com/images/1.jpg时,/images/1.jpg是在/var/www/html/路径下,所以实际访问的资源就是www.hao123.com所在服务器的/var/www/html/images/1.jpg
(5) 构建响应报文;当web服务器找到资源,将封装此报文并标记报文封装的内容格式或类型
(6) 发送响应报文;
(7) 记录日志;把用户请求资源的结果和时间记录的日志文件中。
http协议所支持的程序:
http是一种协议,需要通过软件来实现,常见的软件有:httpd (apache)、nginx 、lighttpd,但这三种只能响应静态文件,对动态文件束手无策.
http的特性
(1) 高度模块化设计:core+modules,每一个模块单独运作,其工作与否不影响其他模块运行;
(2) DSO机制:支持动态装卸载;
(3) MPM机制:多路处理模块;实现多种不同并发响应模型(I/O并发响应模型);
1)prefork:多进程模型,每个进程响应一个请求;(较早期的模型,最大的优势就是非常稳定)
一个主进程,主进程不负责响应请求,只负责监听套接字:负责生成n个子进程,子进程也称为工作进程,负责连接套接字,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
2)worker:多线程模型,每个线程响应一个请求;(类似复用多路I/O模型,由于使用线程响应,相对于prefork模型要轻量些,但并没有显著提升)
一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;m进程,n线程:响应的请求数为m*n
3)event:事件驱动模型,每个线程响应n个请求;
一个主进程:生成m个子进程,每个进程响应n个请求;响应的请求数为m*n
http的功能特性
(1) 支持虚拟主机:基于IP、port、FQDN、CGI(通用网关接口);
(2) 支持正反向代理;
(3) 支持负载均衡;
(4) 支持路径别名;
(5) 支持用户认证机制;
(6) 支持第三方模块;
二、http基本配置及应用
1、安装:
(1)rpm安装
配置好yum仓库后,直接执行命令yum install httpd
安装完成后直接运行即可service httpd start
其中rpm包安装的httpd的默认工作目录(根目录):/etc/httpd
程序环境
配置文件:
主配置文件:/etc/httpd/conf/httpd.conf
分段配置文件:/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本的配置文件:/etc/sysconfig/httpd
模块文件目录:
/etc/httpd/modules(符号链接) -->/usr/lib64/httpd/modules(真正文件目录)
主程序文件:
/usr/sbin/httpd(prefork模型)
/usr/sbin/httpd.worker(worker模型)
/usr/sbin/httpd.event(event模型)
日志文件目录:
/var/log/httpd
access_log:访问日志文件
error_log:错误日志
站点文档目录:
/var/www/html
欢迎页面配置文件
/etc/httpd/conf.d/welcome.conf
下面仔细分析一下httpd的主配置文件/etc/httpd/conf/httpd.conf
首先使用grep命令查看配置文件的总体段落分层;
1)Global Environment全局环境配置
2)‘Main‘server configuration中心服务器配置
3)Virtual Hosts虚拟主机配置
注意:‘Main‘ server configuration和Virtual Hosts不能同时启用,默认启用‘Main‘server
下是几种常见的配置:
1)修改监听地址和端口
在section1中,找到Listen 80的字样
正确用法应该是Listen [IP:]80,省略地址表示监听本机上所有可用的IP地址;
也可使用多个地址和端口,如本机上有两个IP地址172.16.50.2,172.16.50.4,那么此处可写成
表示,监听在这两个地址的80端口上;
也可以使用相同地址和不同端口,如:
用户访问时默认访问服务器的80端口,如需要访问其他端口,要在地址后面加上端口号。
2)持久连接相关配置
首先要明确的是:当用户访问页面时,经过4个步骤:1、DNS解析;2、TCP连接建立;3、传输数据;4、拆除连接
其中只有3是真正获得数据的阶段,其他步骤都有一部分时间浪费。我们知道一个页面上有很多个资源,那访问此页面时就要建立和拆除多个连接,如果只建立一次连接,拆除一次连接(持久连接),而不是每次访问都建立和拆除连接(非持久连接),这样就减少了很多不必要的时间浪费。
持久连接:连接建立后,每个资源获取结束不会断开连接,而继续等待其它资源请求并完成传输,优点是在大量资源传输时提高效率。但如果一直处于连接状态,则会占用带宽。所以,就需要在连接一段时间后断开,这里有两个断开的方式,1、时间;2、请求数量;,这两个值无论那个达到峰值,则此次连接立即断开。缺点是:对并发访问量较大的服务器,开持久连接会有些请求得不到服务。
上图是配置持久连接的相关信息。
3)配置MPM(多路处理模块)
1查看现在是prefork or work or event? vim/etc/sysconfig/httpd
其中,work模块被注释掉了。所以现在使用的是prefork模型,如要使用work模型,直接去掉注释即可。
2用命令查看:httpd –l
3用ps命令查看:确定httpd服务启动后,使用ps –aux查看
上图中结尾都是以httd结尾,而没有.work结尾,则现在使用的是prefork的默认模型
httpd 命令的简单使用方法:httpd –h
图中列出了httpd的一些常见用法。
使用httpd –M查看httpd模块
有很多,不一一列出
上图中标注static的是静态模块,是程序自带的,标注shared的模块可以动态装卸载。
这三种模块的工作模式可以在主配置文件里更改参数vim /etc/httpd/conf/httpd.conf
在section1中,找到如下画面:
# preforkMPM
#StartServers: number of server processes to start
#MinSpareServers: minimum number of server processes which are kept spare
#MaxSpareServers: maximum number of server processes which are kept spare
#ServerLimit: maximum value for MaxClients for the lifetime of the server
#MaxClients: maximum number of server processes allowed to start
#MaxRequestsPerChild: maximum number of requests a server process serves
<IfModuleprefork.c>
StartServers 8 服务启动时默认启动空闲进程数
MinSpareServers 5 最少空闲进程数
MaxSpareServers 20 最大空闲进程数
ServerLimit 256 最多启动的进程数
MaxClients 256 最大客户端并发请求连接数
MaxRequestsPerChild 4000 每个子进程最多响应的请求数
</IfModule>
# workerMPM
#StartServers: initial number of server processes to start
#MaxClients: maximum number of simultaneous client connections
# MinSpareThreads:minimum number of worker threads which are kept spare
#MaxSpareThreads: maximum number of worker threads which are kept spare
#ThreadsPerChild: constant number of worker threads in each server process
#MaxRequestsPerChild: maximum number of requests a server process serves
<IfModuleworker.c>
StartServers 4 启动的子进程数
MaxClients 300 最大并发连接数
MinSpareThreads 25 最少空闲线程数
MaxSpareThreads 75 最大空闲线程数
ThreadsPerChild 25 每个子进程最多生成的线程数
MaxRequestsPerChild 0 每个线程处理的请求数(为0则表示不限制)
</IfModule>
模块的装卸载
在主配置文件中找到LoadModule,开启和关闭只需要在前面加上或删除注释即可。
定义文档页面路径
在配置文件中找到Document Root字样
将/var/www/html替换成想要设定的路径即可。
定义默认的主页面
DirectoryIndexindex.html index.html.var
自左而右,找到首次匹配到的文件;就将其做为默认主页面返回。
路径别名
例:定义Alias /bbs/"/web/bbs/htdocs/"
则访问的URL:http://www.hao123.com/bbs/index.html -->实际上就是访问/web/bbs/htdocs/index.html
配置文件修改位置如下:
基于站点路径访问控制
简单来说就是允许哪些用户或IP地址可以访问页面,哪些用户或IP地址是不可以访问页面的。定义访问控制的方法有两种,一种是通过文件系统路径(Directory)定义的,一种是通过URL路径定义的:
文件系统路径定义的格式:
<Directory"/PATH/TO/SOMEDIR">
...
</Directory>
如上图所示,在Directory定义路径中还有其他选项:
1)Options
Indexes:当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用;
FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容,一般也不建议使用;
None:none
All:所有的都启用;
2)基于来源地址访问控制(图中Require的选项)
Order:检查次序
OrderAllow Deny:只有明确Allow的来源地址,才允许访问,其它的均为Deny
OrderDeny Allow: 只有明确Deny的来源地址,才禁止访问,其它的均为Allow
Allowfrom:允许访问的来源地址
Denyfrom:拒绝访问的来源地址
from后可跟上的地址格式:
IP地址;
网络地址:以下都表示172.16网段
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
举例:我把/etc/httpd/conf.d/welcome.conf删掉后,就没有欢迎页面了,再在/var/www/html/中添加一个a.html文件,将主配置文件按下面方式设定
由于Options中的Indexes被我去掉了,所以所有主机都访问172.16.50.1时不能直接访问a.html,而是需要输入172.16.50.1/a.html才可以访问,另外访问控制限制了IP地址,所以得到的结果中会看到除了172.16.50.2访问不了,172.16.0.0内的主机都可以访问172.16.50.1的页面。
URL路径定义的格式:
<Location"/URL">
...
</Location>
基于用户的访问控制
通过限制用户的访问权限来控制访问结果,经由质询(提示用户输入账号密码)、认证(客户端输入账号密码后判断是否正确),授权用户通过认证。
http的认证方式有两种:
BASIC基本认证, 基于BASE64编码后发送,但该认证方式中,账号和密码通过铭文发送,较不安全,但常用;
Digest摘要认证,但很多浏览器不支持此中认证方式。
举例:BASIC认证的实现
(1)在/var/www/html下建立一个employee文件夹,并在此文件夹中创建一个html文件,设定employee文件夹基于用户认证的访问控制,在/etc/httpd/conf/httpd.conf中单独顶一个一个Directory
<Directory"/var/www/html/employee">在父域下面单独定义的子域
Options None
AllowOverride None
AuthType Basic认证类型
AuthName "Employee Infomation,only for employee"认证域的名字
AuthUserFile /etc/httpd/users/.htpasswd认证用户账号密码文件(这里的用户是虚拟用户,不是登陆系统的用户)
Require User tom jerry(可填valid-user或user1,user2)
</Directory>
提供用户的账号文件
使用htpasswd –c(创建添加第一个用户时,添加文件) –m(使用MD5格式加密用户密码) –D(删除指定用户) passwdfile username
首先创建目录mkdir/etc/httpd/users –pv
为tom创建用户账号文件htpasswd–c –m /etc/httpd/users/.passwd tom
为jerry创建密码htpasswd–m /etc/httpd/users/.passwd jerry
接下来检查语法错误httpd –t
无问题后启动服务查看效果
success!
一般这种访问机制会对部分路径下的文件进行访问控制,比如,服务器上有三个文件,有两个完全对外开放,一个需要输入用户名密码认证才能访问。这也就是一个安全域。
(2)基于组认证
<Directory"/data/web/html/employee">
Options None
AllowOverride None
AuthType Basic
AuthName "Employee Infomation, only for employee"
AuthUserFile /etc/httpd/users/.htpasswd
AuthGroupFile /etc/httpd/users/.htgroup组文件存放位置
Require group 1组名
</Directory>
提供组文件vim/etc/httpd/users/.htgroup,添加
保存退出,重新载入service httpdreload,打开网页查看效果。
虚拟主机
一个物理器可以服务于多个站点,每个站点可通过一个或多个虚拟主机来实现;
httpd三种类型的虚拟主机:基于IP;基于Port;基于FQDN(最常用的类型);
注意:得首先关闭‘Main‘server,注释DocumentRoot指令即可;
定义虚拟主机:
<VirtualHost"IP:PORT">指明IP地址和端口
ServerName
ServerAlias
DocumentRoot
</VirtualHost>
举例1:定义基于端口的虚拟主机(实现访问一个IP地址的不同端口得到不同的主页)
#<VirtualHost*: 80>基于80端口的所有IP地址
# ServerName www.a.com主机名称
# DocumentRoot /vhost/a.com/文档页面路径
#<VirtualHost>
注意:这里定义的端口要在section1中的Listen选项中都监听上才可以!
全部配置完毕后保存退出;
创建htdoc并在其中分别创建页面a.html、b.html,内容分别为www.a.com、www.b.org
重启httpd服务,测试访问
举例2:定义基于IP的虚拟主机(实现访问不同的IP地址得到不同的主页)
由于我们一般的主机上都是一个IP地址,所以首先要给主机添加一个IP地址
接下来就可以更改httpd的配置文件
注意:section1中的Listen改成监听在80端口即可,千万不要忘记!
重新启动httpd服务并测试
举例3:基于FQDN的虚拟主机(实现不同的主机名访问不同的页面)
下面VirtualHost的配置全部配置成一个IP地址,但是最上面的虚拟主机名一定要打开,并修改成响应的IP地址,否则会报错。
这样就可以访问FQDN来访问想得到的主页面了,但是在没有DNS的情况下,需要修改一下/etc/hosts文件
添加:
172.16.50.1 www.a.com
172.16.50.1 www.b.org
更改完毕后重启httpd服务,测试访问
以上为三种类型的实现。^_^三种是可以混用的哦
内置的status页面
是http自带的纯文本的状态页面,记录了连接数,处理的连接数等等信息。
启用status页面就是把Location的所在的内容去掉注释即可,status页面通常作为监控使用,所以要尽量在内网基于IP做访问控制。
保存后重启服务,在指定IP的主机上访问172.16.50.1/server-status即可。
更多问题可查询官方文档来了解http://httpd.apache.org/
以上内容如有偏颇请及时指正。