欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

httpd服务

程序员文章站 2022-06-12 12:49:06
...

**http:**超文本传输协议(hyper text transfer protocol)80/tcp
**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/

配置文件组成:

[aaa@qq.com 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端口
httpd服务
指定监听地址及端口:
httpd服务
httpd服务
2、持久连接
连接建立,每个资源获取完成后不会断开,而是继续等待其他的请求完成;
如何断开:数量限制,时间限制。
副作用:并发访问了较大的服务器,持久连接功能会使有的请求得不到响应。
折中:使用较短的连接时间,httpd-2.4支持毫秒级持久时间

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

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

默认情况下持久连接是关闭的,访问:
httpd服务
打开持久连接:
httpd服务
一次连接完成后会继续等待连接。

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

<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)指向的路径而言
httpd服务

5、定义‘Main‘ server的文档页面路径
httpd服务
文档映射路径:
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 :允许跟踪符号链接文件

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

例如给/etc/issue创建链接文件至默认发布目录下,重载服务
httpd服务

然后再去访问issue就可以正常访问
httpd服务
去掉FollowSymLinks,重载服务
httpd服务

再次访问就被forbidden了
httpd服务

(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了
httpd服务
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包含了其他三种格式
httpd服务
%h:Remote hostname 客户端Ip地址
%l:Remote logname
%u:Remote user
%t:Time the request was received, 服务器收到请求的时间
%r: First line of request.请求报文的首行信息
%>s:响应状态码;
%b:响应报文的大小,单位字节,不包含响应报文首部
httpd服务
httpd服务
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

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

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

httpd服务

httpd服务

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

httpd服务

创建完成后,就可以使用用户名及密码进行访问了
httpd服务

仅运行jerry进行访问
httpd服务

(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 ...

示例:
httpd服务
httpd服务
httpd服务

13、虚拟主机

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

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

有三种实现方案
基于ip
httpd服务
httpd服务
httpd服务

基于port
httpd -t 检查配置是否存在语法错误
httpd服务

httpd服务
当然得保证我们的主机监听了8080端口

httpd服务
httpd服务
httpd服务

基于主机名:
打开这一项
httpd服务
httpd服务
做好解析
httpd服务
访问
httpd服务
而这时候基于ip访问只是访问第一个虚拟主机
httpd服务

虚拟主机的日志
httpd服务
httpd服务

14、内置的status页面
httpd服务
httpd服务

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:最后一次修改的时间