httpd服务

**http:**超文本传输协议(hyper text transfer protocol)80/tcp,是一个属于应用层面向对象的协议。
http协议特点:
1、支持C/S模式
2、允许传输任意类型的数据
3、无连接。无连接的含义是限制每次只处理一个请求,服务器处理完用户请求并收到客户的应答后会立即断开连接,
4、无状态。无状态指协议对事务的处理没有记忆,
四层及四层以下是工作在内核空间
四层以上是工作在应用层空间。

**html:**超文本标记语言,编程语言
MIME:(早期是为了stmp设计)Multipurpose Internet Mail Extesion(多功能互联网邮件扩展)这种机制我们可以基于文本传输协议发送非文本消息,这也就是如今web服务支持多媒体应用的原因。
http工作机制: http请求,http响应
http的工作过程:
服务器上存放着超文本信息,客户端主机基于user agent向服务端请求获取服务端的某文档
服务端分析客户端请求的文档是否存在,存在,则先发送给内核(http协议默认使用tcp服务,为网络通信),内核通过分析发现注册监听在80端口上的时web服务进程。
web服务进程收到请求,分析对方请求的应用层内容(例如请求为:http://www.wtt.com/xixi/haha.html)。此时应用程序可以看到对方要请求xixi/haha.html这个文档,它去找本地映射有没有xixi/haha.html这个文件,有,则把文件从磁盘上取到进程中并封装响应报文,响应给客户端。

User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。一些网站常常通过判断 UA 来给不同的操作系统、不同的浏览器发送不同的页面,因此可能造成某些页面无法在某个浏览器中正常显示,但通过伪装 UA 可以绕过检测。(百度百科)

web资源:被当成请求对象的内容。

静态资源:.jpg, .gif, .txt, .js , .css , .mp3, .avi
动态资源:.php, .jsp

媒体:
媒体类型(MIME类型):major/minor
text/html 超文本 
text/plain 纯文本
image/jpeg
image/gif 

URL: 同一资源定位符(uniform Resource Locator) ,用于描述某服务器某特点资源的位置。
Scheme://Serevr:Port/path/to/resource
http://www.wtt.com/xixi/haha.html)

http协议版本:

HTTP/0.9:原型版本,功能简陋,仅能实现简单的资源交互,不支持多媒体
HTTP/1.0:第一个广泛使用的版本,引入MIME机制
HTTP/1.1:增强了缓存功能
spdy:加速了http协议获取资源的性能
HTTP/2.0:

一次完整的http请求过程:

(1)建立或请求连接;接受请求或拒绝请求
(2)接受请求:接受来自于网络的请求报文中对某资源的一次请求过程;

网站允许多个用户同时访问,服务器如何响应?
并发访问响应模型(Web I/O):
(1)单进程I/O结构:启动一个进程处理用户请求,而且一次只能处理一个,多个请求被串行响应
(2)多进程I/O结构:并行启动多个进程,每个进程响应一个请求
(3)复用I/O模型:一个进程响应n个请求
	多线程模型:一个进程生成n个线程,每个线程响应一个请求
	事件驱动:event-driven
	目前大部分的UI编程都是事件驱动模型,如很多UI平台都会提供onClick()事件,这个事件就代表鼠标按下事件。事件驱动模型大体思路如下:
1. 有一个事件(消息)队列;
2. 鼠标按下时,往这个队列中增加一个点击事件(消息);
3. 有个循环,不断从队列取出事件,根据不同的事件,调用不同的函数,如onClick()、onKeyDown()等;
4. 事件(消息)一般都各自保存各自的处理函数指针,这样,每个消息都有独立的处理函数;
(4)复用的多进程I/O结构:启动多个进程,每一进程响应多个请求。

(3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息

元数据:请求报文地首部
<method> <URL> <VERSION>
HOST: www.wtt.com   请求的主机名称
Connection:

(4)访问资源:获取请求报文中请求的资源

Web服务器:即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统路径下,此路径通常称为DocRoot
(5)构建响应报文
URL重定向:web服务器构建的响应非客户端请求的资源,而是另一处访问路径
(6)发送响应报文
(7)记录日志

http服务程序: httpd(apache)、nginx,lighttpd

应用程序服务器: IIS、tomcat、jetty、jboss、resin。这些服务器自己就可以解析动态内容

httpd的特性:
高度模块化;模块地动态装载(DOS);多路数据模块(MPM)
MPM:(参考:http://www.bubuko.com/infodetail-574143.html)
prefork:多进程模型,每个进程响应一个请求。
主进程监听套接字,请求过来时,主进程先响应,但主进程不负责处理,而是生成一个子进程,让自己的子进程处理。随时等待接收连接的套接字成为监听套接字,主进程监听在80端口,其他进程监听在非80端口,连接断开,子进程被销毁。
如果服务器很繁忙,一下子来了100个请求,意味着一下子要创建100个进程,这样效率很底,怎么解决?
为了减少频繁创建和销毁进程的开销,Apache在启动之初,预先fork出多个子进程,然后等待请求进来。
worker: worker使用多个子进程,每个子进程有多个线程,每个线程在某个确定的时间只能维持一个连接,内存占用量比较小,适合高流量的http服务器。缺点是假如一个线程崩溃,整个进程就会连同其任何线程一起”死掉”,所以要保证一个程式在运行时必须被系统识别为”每个线程都是安全的”。
event: 与为每个请求创建一个线程,而不是为一个http连接创建一个线程

####httpd的配置

配置文件:
/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 :访问日志
error_log:错误日志
站点文档目录:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules/

配置文件组成:

[root@server1 httpd]# grep Section /etc/httpd/conf/httpd.conf 
### Section 1: Global Environment 全局配置
### Section 2: 'Main' server configuration 主服务器配置
### Section 3: Virtual Hosts  虚拟主机配置(一个为物理服务器用来提供多个站点)

一般Section2和Section3不要同时使用
常用配置:
1、修改监听的IP和Port
Listen [IP:]PORT
省略ip表示监听本机所有ip,Listen可出现多次
默认启动服务后会监听本机所有地址,默认为80端口
这里写图片描述
指定监听地址及端口:
这里写图片描述
这里写图片描述
2、持久连接
连接建立,每个资源获取完成后不会断开,而是继续等待其他的请求完成;
如何断开:数量限制,时间限制。
副作用:并发访问了较大的服务器,持久连接功能会使有的请求得不到响应。
折中:使用较短的连接时间,httpd-2.4支持毫秒级持久时间

KeepAlive Off :是否打开持久连接机制
MaxKeepAliveRequests 100 :最大连接数
KeepAliveTimeout 15

测试:
telnet IP PORT
GET /URL HTTP/1.1
Host: IP or HOSTNAME

默认情况下持久连接是关闭的,访问:
这里写图片描述
打开持久连接:
这里写图片描述
一次连接完成后会继续等待连接。

3、MPM:多道处理模块
prefork ,worker,event
http-2.2不支持同时编译多个模块,所以只能编译时选定一个,rpm安装包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持,确认方法:ps aux | grep httpd
默认为/usr/sbin/httpd,其使用prefork
查看静态模块列表:
这里写图片描述
查看静态编译及动态装载的模块:
这里写图片描述
模块的配置
这里写图片描述

<IfModule prefork.c>
StartServers       8 服务启动时启动多少个进程
MinSpareServers    5 最小空闲进程数
MaxSpareServers   20 最大空闲进程数
ServerLimit      256 服务端在线的最大进程数 一般与MaxClients相等
MaxClients       256 最多允许多少个客户端进行访问
MaxRequestsPerChild  4000 一个服务器进程最多响应多少次请求
</IfModule>

4、DSO:配置指令实现模块加载

LoadModule auth_digest_module modules/mod_auth_digest.so
LoadModule module_name  module_path

模块可以使用相对路径,相对于ServerRoot(/etc/httpd)指向的路径而言
这里写图片描述

5、定义‘Main‘ server的文档页面路径
这里写图片描述
文档映射路径:
DocumentRoot指向的路径为URL路径的起始位置:

DocumentRoot "/var/www/html"
test/index.html  ----> http://HOST:PORT/test/index.html

6、站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制。
文件系统路径:

<Directory ""> </Directory>
<File ""> </File>
<FileMatch> </FileMatch>

URL路径:

<Location ""> </Location>

7、问控制机制:
Directory“基于来源地址“实现访问控制
(1)Options
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews All None
Indexes:索引,找不到默认主页面,就把所有列出来供你选择。(很危险)
FollowSymLinks :允许跟踪符号链接文件

这里写图片描述
例如我们将定义的主页面移走,去访问,发现显示的是欢迎页面
这里写图片描述
欢迎页面时在/etc/httpd/conf.d/目录下的welcome下定义的,将欢迎页面也移走
这里写图片描述
再次访问。结果为forbidden
这里写图片描述
是因为我们并没有在重新定义的默认发布目录/wtt所对应的站点访问控制Directory里定义Indexes,所以在Directory里面加上Options
这里写图片描述
再次访问
这里写图片描述

例如给/etc/issue创建链接文件至默认发布目录下,重载服务
这里写图片描述

然后再去访问issue就可以正常访问
这里写图片描述
去掉FollowSymLinks,重载服务
这里写图片描述

再次访问就被forbidden了
这里写图片描述

(2)基于帐号
Order allow,deny 白名单(先拒绝所有,再允许定义的一些人)
Order deny,allow 黑名单(先允许所有,再拒绝定义的一些人)
定义访客名单:
Deny/Allow from

9、日志设定
错误日志:
ErrorLog logs/error_log
此路径是相对于ServerRoot而言,所以真实的路径为/etc/httpd/logs/error_log

而/etc/httpd/logs 目录被链接到了/var/log/httpd了
这里写图片描述
这里写图片描述
LogLevel warn
debug, info, notice, warn, error, crit, alert, emerg.
默认级别为warn。定义级别为warn,则意味着比warn高的级别(error,crit…)也会>被记录。

访问日志
CustomLog “logs/access_log” combined

combind为日志格式
格式还有common,referer,agent
combind包含了其他三种格式
这里写图片描述
%h:Remote hostname 客户端Ip地址
%l:Remote logname
%u:Remote user
%t:Time the request was received, 服务器收到请求的时间
%r: First line of request.请求报文的首行信息
%>s:响应状态码;
%b:响应报文的大小,单位字节,不包含响应报文首部
这里写图片描述
这里写图片描述
10、路径别名
如果:DocumentRoot “/www/htdocs”
访问:http://www.wtt.com/download/index.html
实际访问的是:/www/htdocs/download/index.html

路径别名定义方法:
Alias:/URL/ “/PATH/TO/SOMEDIR“
例如
Alias /bbs/ “/forum/htdocs”
访问:http://www.wtt.com/bbs/index.html
实际访问的是:/forum/htdocs/bbs/index.html

在配置文件中定义别名
这里写图片描述
并对/htdoc/bbs进行站点访问控制,否则访问的时候会被firbbiden
这里写图片描述
创建/forum/htdocs,并创建访问页面
这里写图片描述
重启服务,访问http://172.25.254.244/bbs/
这里写图片描述

11、设定默认字符集
AddDefaultCharset UTF-8

12、基于用户的访问控制
1)认证质询
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供帐号和密码;

认证:

Authorization:客户端用户添入帐号和密码后再次发送请求报文;认证通过,则服务器发送响应资源;
认证方法:
basic:明文
digest:消息摘要

安全域:需要用户认证后方能访问地路径。应该通过名称对其进行标识并用于告知用户认证的原因

用户的帐号密码存于何处:

虚拟帐号:仅用于访问某服务时用到的认证标识。
存储:
	文本文件
	SQL数据库
	ldap 
	nis 

basic认证:
(1)定义安全域

	<Directory "">
		Options None
		AllowOverride None
		AuthType Basic
		AuthName "STRING"
		AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
		Require user username1 username2 ...
	</Directory>
允许帐号中所有用户登录访问:
	Require valid-users

这里写图片描述

这里写图片描述

(2)定义帐号和密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c:自动创建passwordfile。因此,仅应该在添加第一个用户时使用
-m:md5加密用户密码
-s:sha1加密用户密码
-D:删除指定用户

这里写图片描述

创建完成后,就可以使用用户名及密码进行访问了
这里写图片描述

仅运行jerry进行访问
这里写图片描述

(3)基于组进行认证

<Directory "">
		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 ...
	</Directory>
要提供用户帐号文件和组文件“
	组文件:每一行定义一个组
		GRP_NAME:user1 user2 user3 ...

示例:
这里写图片描述
这里写图片描述
这里写图片描述

13、虚拟主机

<VirtualHost ip:port>
	ServerName
	DocumentRoot " "
</VirtualHost> 
ServerAlias:虚拟主机别名
ErrorLog
CustomLog
<Directory "">
	...
</Directory>

【注意】虚拟主机不要与中心主机混用,所以,要使用虚拟主机主机,先禁用中心主机,禁用方法:注释掉DocumentRoot

有三种实现方案
基于ip
这里写图片描述
这里写图片描述
这里写图片描述

基于port
httpd -t 检查配置是否存在语法错误
这里写图片描述

这里写图片描述
当然得保证我们的主机监听了8080端口

这里写图片描述
这里写图片描述
这里写图片描述

基于主机名:
打开这一项
这里写图片描述
这里写图片描述
做好解析
这里写图片描述
访问
这里写图片描述
而这时候基于ip访问只是访问第一个虚拟主机
这里写图片描述

虚拟主机的日志
这里写图片描述
这里写图片描述

14、内置的status页面
这里写图片描述
这里写图片描述

15、URL基本语法:

<Scheme>://<user>:<password>@<host>:<port>/<patch>;<param>?<query>#<frag>
      scheme:获取资源使用的协议,例如http、ftp等,没有默认值
      user:password:用户名与密码,这个是一个特殊的存在,一般访问ftp时会用到,他显示的表明了访问资源的用户名与密码。但是这个可以不写,不写的话可能会让你输入用户名密码
      host:主机,访问那台主机,有时候可以是IP,有时候是主机名,例如www.baidu.com
      port:端口,访问主机时的端口,如果http访问默认80,可以省略。
      path:通过host:port我们能找到主机,但是主机上文件很多,通过path则可以定位具体文件。例如www.baidu.com/file/index.html。则path是/file/index.html,表示我们访问/file/index.html这个文件,他很像linux上的路径。
      params:这个很少见,主要作用就是像服务器提供额外的参数,用来表示本次请求的一些特性。例如ftp传输模式有两种,二进制和文本,你肯定不希望使用文本形式传输二进制图片,这样你的图片下载下来后可能没法看了。为了向应用程序提供更丰富的信息,URL中有个专门的部分来表示这种参数。例如ftp://file.qiandu.com/pub/guid.pdf;type=d其中的type=d就是params
      query:通过get方式请求的参数,例如:www.qiandu.com/index.html?username=dgh&passwd=123
      frag:例如www.qiandu.com/index.html#1。当html页面比较长时,我们通常会将其分为好几段,#1就可以 快速定位到某一段。

16、http事务

	请求:request
	响应:response
		
	报文的语法格式:
		request报文:
			<method><request-URL><version>
			<headers>

			<entity-body>
		response报文:
			<version><status><reason-phrase>
			<header>

			<entity-body>

	method:请求方法 GET, HEAD,POST
	version:
		HTTP/<major>.<minor>
	status:
		三位数,如200,301,302,500...  用于标记请求处理过程中发生的情况;
	reason-phrase:
		状态码所标记的状态的简要描述;
	headers:
		每个请求或响应报文可以包含任意个首部,每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着 是一个值。
	Entity-body:请求时附加的数据或响应时附加的数据

method(方法):
	GET:从服务器获取一个资源;安全
	HEAD:从服务器获取文档的响应首部;超安全
	POST:向服务器发送要处理的数据,危险
	PUT:将请求的主体部分存储在服务器上,超危险
	DELETE:请求删除服务器上的指定文档
	TRACE:追踪请求到达服务器中间经过的代理服务器。
	OPTIONS:请求服务器返回对指定资源支持使用的请求方法。

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
		客户端到服务器端可能有多级代理,代理服务器之间发生了错误

headers:
	Name:Value

	首部的分类:
		通用首部
		请求首部
		响应首部
		实体首部
		扩展首部


		通用首部:
				Date:报文的创建时间,
				Connection:连接方式,keep-alive, close
				Via:显示报文经过的中间节点
				Cache-Control:控制缓存
		请求首部:
				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:

				安全请求首部:
				Authorization:向服务器发送认证信息,如账号密码
				Cookie:客户端向服务器端发送cookie
				代理请求首部:
				Proxy-Authorization:向代理服务器认证
		响应首部:
				信息性:
				Age:响应持续时长
				Server:服务器程序软件的名称和版本

				协商首部:某资源有多种表示方法时使用
				Accept-Ranges:服务器可接受的请求范围类型
				Vary:服务器查看其它首部列表
				
				安全响应首部:
				Set-Cookie:向客户端设置cookie
				WWW-Authencate:来自服务端的对客户端的质询认证表单
				
		实体首部:
				Allow:列出对此实体可使用的方法
				Location:告诉客户端真正的实体位于何处

				Content-Encoding:主体编码格式
				Content-language:主体使用的语言
				Content-Length:主体长度
				Content-Location:实体所处位置
				Content-Type:主体的对象类型
				
		缓存相关:
				ETag:实体扩展标签
				Expires:实体的过期时间
				Last-Modified:最后一次修改的时间
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值