Web Service 之 http基础原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web Service 之 http基础原理相关的知识,希望对你有一定的参考价值。
Web Service 之 http基础原理
=========================================================================
概述:
网络通信基础
★进程间通信:IPC
Socket(套接字):ip:port
★Client <--> Server
Server: listen(监听状态,表示服务器正在等待新的传输链接进入)
Client:
★客户端与服务器间通信实际上是客户端套接字和服务器端套接字间通信
IP:PORT(Clint) <--> IP:PORT(Server)
★IANA定义的服务所使用的port(端口)信息:
0-1023:
永久地分配给固定的应用使用,80/http, 443/https,21/ftp, 25/smtp, 110/pop3, 143/imap4;仅root有权限使用,特权端口。并且这些默认的端口是可以省略的,协议自身回去识别;
1024-41951:
注册端口,但不严格,3306/mysql, 11211/memcached,
41952+:
客户端程序使用的随机端口,动态端口,或称为私有端口;
其范围定义在:/proc/sys/net/ipv4/ip_local_port_range
★BSD Socket :
IPC的一种实现,允许位于不同主机(也可以是同一主机)上进程间的通信;
Socket API(封装了内核中的socket通信相关的系统调用)
SOCK_STREAM:tcp套接字
SOCK_DGRAM: UDP套接字
SOCK_RAW : raw(裸)套接字(应用层直接发往IP层中间不经过传输层)
根据套接字所使用的地址格式:Socket Domain
IPv4: AF_INET
IPv6: AF_INET6
Unix_Sock:AF_UNIX(不使用地址加端口这种方式进行通信,而是使用一个文件进行通信)
★TCP FSM(有限状态机)
★TCP协议的特性:
建立链接:三次握手;
将数据打包成段:校验和(CRC32)
确认、重传及超时;
排序:逻辑序号;
流量控制:滑动窗口算法;
拥塞控制:慢启动和拥塞避免算法
http协议
1)相关介绍
★ http协议是一种应用层协议,80/tcp,
核心作用:解决超文本传输;
★ 协议版本:
http/0.9:原型版本,功能简陋;
http/1.0:Cache,MIME,method
MIME: multipurpose internet mail extension(多用途互联网邮件扩展协议)
method(资源的传递方法):GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
http/1.1:缓存功能,条件式请求
speedy:SPDY
http/2.0
rfc
★html:hyper text mark language 编程语言,超文本标记语言
HTML是一种纯文字的文本信息,通过所谓的标签来规范所要显示的内容格式,在客户端通过浏览器可以对HTML及多媒体资源进行解析,然后呈现在各个终端之上。
格式:分两部分:<head>和<body>
<html> <head> # 头 <title>MageEdu</title> # 标题 </head> <body> # 内容 ... </body> </html>★注意:
http是一种协议,而html是一种语言,是两种不同的东西;但二者又有联系,即:
http协议是用来传送html这种语言开发的文档的。
http协议除了传送html之外还可以传送css,js,image...
css:Cascading Style Sheet(层叠样式表)
js:java Script:客户端脚本
类型数据 (通过MIME识别数据传送的类型)
major/minor:(主/次类型)
images/
images/jpeg, images/png, images/gif, ...
text/
text/plain, text/html, text/js, ...
application/
...
★ http协议的实现(开源实现)
1)常见服务器程序:
httpd(apache)
lighttpd
2)web服务器的工作是基于C/S结构的
C: browser(浏览器), user agent(用户代理)
chrome, ie, firefox, safari, opera, ...(图形化的浏览器)
elinks, curl, wget, ...(文本的浏览器)
S:httpd(apache), nginx, lighttpd, ...
3)通信模型:
请求/响应
stateless(无状态协议):任何请求和访问之间没有任何关系
cookie机制:追踪用户身份
★ http协议的主要特点:
支持客户/服务器模式;
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有:GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快;
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记;
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间;
无状态:HTTP协议是无状态协议。无状态协议是指对于事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时他的应答就较快。
2)一次完整的http请求的处理过程
★过程如下:
(1)建立或处理连接请求;
(2)接受请求;
(3)解析请求,处理请求;
(4)加载用户请求的资源;
(5)构建响应报文;
(6)发送响应报文;
(7)记录日志信息。
◎接受请求的模型
并发访问响应模型(Web I/O)
单进程I/O模型:启动一个进程处理用户请求;这意味着一次只能处理一个请求;多个请求被串行响应;
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用I/O结构:一个进程响应n个请求;
多线程模式:一个进程生成n个线程,每个线程响应一个用户请求;
事件驱动(event-driven):一个进程直接n个请求;
复用多进程I/O结构:启动多个(m)进程,每个进程响应n个请求;
响应的请求数量:m*n
◎处理请求:
对请求报文进行解析,并获取请求的资源及请求的方法等相关信息,解析后的报文信息首部称为元数据。
http协议:
http请求报文的首部
http响应报文的首部
请求报文首部格式:
<method><URL><VERSION>
HEADERS:(name:value)
<request body>
资源传递的方法(method)
GET:从服务器获取一个资源;
HEAD:只从服务器获取文档的响应首部;
POST:向服务器发送要处理的数据;
PUT:将请求的主体部分存储在服务器上;
DELETE:请求删除服务器上指定的文档;
TRACE:追踪请求到达服务器上中间经过的代理服务器;
OPTIONS:请求服务器返回对指定资源支持使用的请求方法;
◎访问资源:获取请求报文中请求的资源。
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或者运行后生成的资源;这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot(发布目录):
如: /var/www/html其中有个子目录及文件 /images/logo.jgp,
那么其对应的URL为:
http://www.magedu.com/images/logo.jgp
web服务器的资源路径映射方式:
docroot:发布目录;
alias:路径别名;
虚拟主机docroot:虚拟主机的发布目录;
用户家目录docroot:系统用户的家目录;
★ 事务:request和response
服务器在接受请求和解释请求消息后,会像客户端返回一个HTTP响应消息,因此HTTP是存在事务的,也就是说HTTP有请求(request)报文和响应(response)报文。
request:报文
<method> <request-URL> <version>
HEADERS
<entity-body>
response:报文
<version> <status状态码> <reason-phrase原因短语>
HEADERS
<entity-body>
<method>:
请求方法,标明客户端希望服务器对资源执行的动作,就是上面说的
GET,HEAD,POST, PUT, DELETE, OPTIONS, TRACE, ...
<status>:
三位数字,如200,301,302,404,502;标记请求处理过程中发生的情况
1xx: 信息提示
2xx: 成功响应
3xx: 重定向响应
4xx: 客户端错误
5xx: 服务器端错误
HEADERS:每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值,即:Name:Value格式。如下图所示:
打开浏览器,按F12就可进入
version:HTTP/<major>.<minor>HTTP的版本号;
reason-phrase:状态码所标记的状态的简要描述;
entity-body:请求是附加的数据或响应时附加的数据
httpd
httpd是著名的http协议的实现
1)介绍及基础配置
★httpd
httpd官方站点:http://httpd.apache.org
httpd早期叫做apache--a patchy server=apache,属于Apache软件基金会(ASF:apache software foundation)的一个项目,后来apache更名为httpd,因此这样更符合http server这个含义了。
★http所具有的特性
高度模块化设计:core modules + standard modules + 3rd party module
动态链接库DSO: Dynamic Shared Object
多模块处理MPM:multipath process modules
prefork:process
多进程模型,每进程响应一个请求;
(两级架构:主控进程接受请求,子进程响应请求)
worker: thread
多线程模型,每线程响应一个请求;
(为三级结构,主进程生成子进程,子进程生成线程)
event: thread
事件驱动模型,每线程响应n个请求;
★httpd的功能特性:
CGI:通用网管接口,可实现动态网站;
虚拟主机:IP,PORT,ServerName
反向代理:http, fcgi, wsgi, ajp, ...
负载均衡:
路径别名;
丰富的用户认证机制,如:basic和digest
支持第三方模块
...
★httpd的版本
httpd-1.x
httpd-2.0
httpd-2.2 CentOS 6
httpd-2.4 CentOS 7
★安装使用httpd
httpd的安装和其他软件安装方式一样,可以通过rpm包和源码编译的方式进行安装
rpm包的方式可通过yum命令来进行:# yum install httpd -y
通过rpm包安装的httpd其默认的工作目录(根目录):/etc/httpd
注意:我们在安装时首选base源(如阿里云中centos的os),其次选择epel源
[[email protected] ~]# yum info httpd Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Installed Packages Name : httpd Arch : x86_64 Version : 2.4.6 Release : 40.el7.centos Size : 9.4 M Repo : installed From repo : base Summary : Apache HTTP Server URL : http://httpd.apache.org/ License : ASL 2.0 Description : The Apache HTTP Server is a powerful, efficient, and : extensible web server.★程序环境:以CentOS 7为例即:httpd 2.4版本
主程序文件:
/usr/sbin/httpd
模块文件:
/usr/lib64/httpd/modules/*.so
主配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
/etc/httpd/conf.modules.d/*.conf
站点文档路径:
/var/www/html
日志文件路径:
/var/log/httpd/
access_log:访问日志
error_log:错误日志
Unit File:
/usr/lib/systemd/system/httpd.service
自带脚本:
/usr/sbin/apachectl
★启动http服务,检查端口,及配置相关文件
启动http服务:
# systemctl start httpd.service
使http服务开机自启:
# systemctl enable httpd.service
检测是否监听在80端口
# ss -tnlp | grep ":80\>"
[[email protected] ~]# systemctl start httpd [[email protected] ~]# ss -tnlp |grep ":80\>" LISTEN 0 128 :::80 :::* users:(("httpd",pid=1773,fd=4),("httpd",pid=1772,fd=4),("httpd",pid=1771,fd=4),("httpd",pid=1770,fd=4),("httpd",pid=1769,fd=4),("httpd",pid=1768,fd=4)) [[email protected] ~]# ps aux # 查看进程是否有httpd apache 1769 0.0 0.6 228364 6332 ? S 16:34 0:00 /usr/sbin/httpd -DFOREGROUND apache 1770 0.0 0.6 228364 6332 ? S 16:34 0:00 /usr/sbin/httpd -DFOREGROUND apache 1771 0.0 0.6 228364 6332 ? S 16:34 0:00 /usr/sbin/httpd -DFOREGROUND apache 1772 0.0 0.6 228364 6332 ? S 16:34 0:00 /usr/sbin/httpd -DFOREGROUND apache 1773 0.0 0.6 228364 6332 ? S 16:34 0:00 /usr/sbin/httpd -DFOREGROUND启动完成之后我们就可以在浏览器中输入IP地址打开http服务,如下:
如上图,首次打开是一个测试页面,我们需要在配置文件(/etc/httpd/conf.d)中把welcome.conf修改成不易.conf结尾即可,然后重载
[[email protected]os7 ~]# cd /etc/httpd/conf.d [[email protected] conf.d]# ls autoindex.conf README userdir.conf welcome.conf [[email protected] conf.d]# mv welcome.conf {,.bak} # 修改为.bak结尾 [[email protected] conf.d]# ll total 16 -rw-r--r-- 1 root root 2926 Nov 20 2015 autoindex.conf -rw-r--r-- 1 root root 366 Nov 20 2015 README -rw-r--r-- 1 root root 1252 Nov 20 2015 userdir.conf -rw-r--r-- 1 root root 824 Nov 20 2015 welcome.conf.bak [[email protected] conf.d]# systemctl reload httpd.service # 重载重新刷新之后如下图:
接下来我们就可以编辑 /var/www/html 文件自己提供一个网页文件了
[[email protected] ~]# vim /var/www/html/test.html # 编辑文件,新建一个test.html的网页 1 <html> 2 <head> 3 <title>Test Page</title> 4 </head> 5 <body> 6 <h1>My Test Page</h1> 7 </body> 8 </html>再次刷新如下:
如上,我们就完成了一些基本的配置...
httpd-2.4基础配置
1)定制http服务的工作特性
★配置文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
/etc/httpd/conf.modules.d/*.conf
可以修改这些以.conf结尾的配置文件来完成配置,也可以自己手动添加以.conf结尾的配置文件完成相应的配置
★配置文件语法格式:
DIRECTIVE VALUE
DIRECTIVE(指令):不区分字符大小写;例如ServerRoot;
VALUE(值):除了文件系统路径,大多数也不区分字符大小写;
通过grep命令来获取配置文件分哪些段落:(CentOS 6)
[[email protected] ~]# grep "Section" /etc/httpd/conf/httpd.conf ### Section 1: Global Environment ### Section 2: ‘Main‘ server configuration ### Section 3: Virtual Hosts注意:‘Main‘ server和Virtual Hosts不能同时启用;默认启用的是‘Main‘ server
★配置修改完成后:
(1)测试语法;
(2)让服务程序重载配置文件:
~]# service httpd reload
~]# systemctl reload httpd.service
2)http常见配置的修改
1.指定监听地址和端口
Listen [IP:]port
1)Listen指令可以重复使用多次,用于指明多个不同的监听端口或套接字;
2)IP省略时表示监听本机上所有可用的IP地址;
示例:
[[email protected] ~]# cd /etc/httpd/ # 进入主配置文件 [[email protected] httpd]# ls conf conf.d conf.modules.d logs modules run [[email protected] httpd]# cp conf/httpd.conf{,.bak} # 为了保证之后可以还原,首先备份 [[email protected] httpd]# cd conf [[email protected] conf]# ls httpd.conf httpd.conf.bak # 备份的文件 magic [[email protected] conf]# cd .. [[email protected] httpd]# vim conf/httpd.conf # 编辑配置文件保存退出后并重载:systemctl reload httpd
查看端口如下:
[[email protected] httpd]# ss -tnl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 127.0.0.1:6010 *:* LISTEN 0 128 :::8080 :::* LISTEN 0 128 :::80 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 128 :::8088 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 ::1:6010 :::* [[email protected] httpd]#
注意:在使用浏览器访问时,默认的是80端口,所以不用输入端口地址,但如果访问非标准端口就要输入端口
2.保持链接
persistent connection:
tcp连接建立后,资源获取完成之后不会断开连接,而是继续等待请求其它资源;
如何断开?
数量限制
时间限制
保持连接相关的参数:
KeepAlive On|Off
MaxKeepAliveRequests 100 (表示一次请求连接最多允许请求多少个资源)
KeepAliveTimeout 10 (表示持久时长为10秒钟,也可以定义毫秒)
可以通过telnet命令来进行保持连接的测试
测试保持连接:
[[email protected] ~]# telnet 10.1.252.161 80 Trying 10.1.252.161... Connected to 10.1.252.161. Escape character is ‘^]‘. GET /test.html HTTP/1.1 # 获取的资源 Host:10.1.252.161 # 服务器主机 # 这里要载敲一次回车换行 HTTP/1.1 200 OK Date: Sat, 08 Oct 2016 11:56:52 GMT Server: Apache/2.4.6 (CentOS) Last-Modified: Sat, 08 Oct 2016 09:00:41 GMT ETag: "8b-53e56c2e88652" Accept-Ranges: bytes Content-Length: 139 Content-Type: text/html; charset=UTF-8 <html> <head> <title>Test Page</title> </head> <body> <h1>My Test Page</h1> </body> </html> Connection closed by foreign host.
关闭保持连接
# 在/etc/httpd/conf.d下添加一个以.conf结尾的文件,并写上KeepAlive Off即可 [[email protected] httpd]# vim conf.d/keepalive.conf KeepAlive Off [[email protected] httpd]# systemctl reload httpd
定义数量限制和时间限制
[[email protected] httpd]# vim conf.d/keepalive.conf 1 KeepAlive On 2 MaxKeepAliveRequests 20 3 KeepAliveTimeout 5 [[email protected] httpd]# systemctl reload httpd
3.DSO机制
DSO:配置指令模块加载,卸载
httpd命令:获取模块
-t -D DUMP_MODULES : show all loaded modules
-M : a synonym for -t -D DUMP_MODULES (表示已装载的模块)
如果某个模块不想用的话,只需要注释掉即可
加载模块,格式如下:
LoadModule mod_name modules/mod_file_name
相对路径
相对于ServerRoot指令的值来说:/etc/httpd/
[[email protected] httpd]# ll total 0 drwxr-xr-x 2 root root 56 Oct 8 19:11 conf drwxr-xr-x 2 root root 103 Oct 8 20:10 conf.d drwxr-xr-x 2 root root 139 Oct 8 20:28 conf.modules.d lrwxrwxrwx 1 root root 19 Aug 25 14:37 logs -> ../../var/log/httpd lrwxrwxrwx 1 root root 29 Aug 25 14:37 modules -> ../../usr/lib64/httpd/modules # 软链接
修改完之后要重载:
# systemctl reload httpd
注释掉不需要的模块 文件:/etc/httpd/conf.modules.d/00-base.conf
[[email protected] httpd]# ls conf conf.d conf.modules.d logs modules run [[email protected] httpd]# cd conf.modules.d/ [[email protected] conf.modules.d]# ls 00-base.conf 00-dav.conf 00-lua.conf 00-mpm.conf 00-proxy.conf 00-systemd.conf 01-cgi.conf [[email protected] conf.modules.d]# vim 00-base.conf LoadModule substitute_module modules/mod_substitute.so 57 LoadModule suexec_module modules/mod_suexec.so 58 LoadModule unique_id_module modules/mod_unique_id.so 59 LoadModule unixd_module modules/mod_unixd.so 60 LoadModule userdir_module modules/mod_userdir.so 61 LoadModule version_module modules/mod_version.so 62 LoadModule vhost_alias_module modules/mod_vhost_alias.so 63 64 #LoadModule buffer_module modules/mod_buffer.so 65 #LoadModule watchdog_module modules/mod_watchdog.so 66 #LoadModule heartbeat_module modules/mod_heartbeat.so [[email protected] httpd]# systemctl reload httpd
3.定义站点默认的主页面
可以定义多个值,自左向右,找到首次匹配到的文件,就将其作为默认主页面返回
DirectoryIndex filename1 filename2 ...
在/etc/httpd/conf/httpd.conf中修改添加
3.Main Server 中心服务器相关配置
1) DocumentRoot 指令,站点文档文路径
文档路径的映射;
DocumentRoot 指向的路径为URL起始的位置
2) ServerName 服务器名称
★站点文档访问授权及众多服务特性的配置:
基于文件系统路径:
<Directory "/PATH/TO/DIR">
</Directory>
或:
<File "">
</File>
....
基于URL进行:
<Location "URL">
...
</Location>
或:
<LocationMatch ~ "URL_PATTERN"> 正则表达式通配
...
</LocationMatch>
在真正的生产环境中,网页文件并不一定放置在/var/www/html中,很有可能是自己规划的一个专用位置,怎么实现呢?只需修改DocumentRoot即可,如下:
1)首先修改/etc/httpd/conf/httpd.conf中DocumentRoot指令
[[email protected] httpd]# mkdir -pv /web/htdocs # 在根下创建指定目录 mkdir: created directory ‘/web’ mkdir: created directory ‘/web/htdocs’ [[email protected] ~]# ls /web/ # 创建的目录已经生成 htdocs [[email protected] ~]# vim /web/htdocs/test.html # 创建html文件 /web/htdocs/test.html # 随便添加一行 [[email protected] ~]# systemctl reload httpd # 重载
刷新页面如下:
3)我们需要对站点文档访问授权,站点路径和访问授权路径必须要相同
4.Directory中的访问控制定义
Options
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None
All
Indexes:索引
FollowSymLinks:允许跟踪符号链接 ExecCGI:允许执行CGI脚本
(4) AllowOverride
httpd的访问控制配置,允许每目录单独进行;在每个目录下建立一个.htaccess文件;
AllowOverride表示是否允许目录中的.htaccess文中的配置来覆盖当前配置段中的配置;
Options FileInfo AuthConfig Limit
All
None
(5) 基于源地址的访问控制
允许所有地址访问:Require all granted
拒绝所有地址访问:Require all denied
<RequireAll>
</RequireAll>
基于IP控制:
Require ip ADDRESS
Require not ip ADDRESS
ADDRESS:
ip
network:
10.1.0.0/255.255.0.0
10.1.0.0/16
10.1
基于主机名控制:
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN
DOMAIN.TLD
以上是关于Web Service 之 http基础原理的主要内容,如果未能解决你的问题,请参考以下文章