httpd服务
**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端口
指定监听地址及端口:
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:最后一次修改的时间
上一篇: HTML(二)
推荐阅读
-
mysql免安装版写入服务命令_MySQL
-
简单的社交应用的“状态”、“说说”功能,服务器端是怎么设计的。
-
用MySQL+HeartBeat实现MySQL主主自动切换来保证网站不中断服务
-
详解Spring Boot Admin监控服务上下线邮件通知
-
mssql自动备份及自动清除日志文件服务器设置
-
MySQL 服务器监听客户端连接源码
-
前两天麻烦两位斑竹了现在Linux服务器的升级工作已经全部完成,这里把整理过的升级后的文档共享给大家
-
Apache服务器配置全攻略(三)_PHP
-
可能是目前效果最好的Javascript(js)在线压缩优化服务 JavaScriptGAEGoogle
-
具有负载均衡功能MySQL服务器集群部署实现_MySQL