Web Service学习笔记1
应用层:http,https;实现某类具体应用;
传输层协议:TCP、UDP、SCTP
-
IANA:
- 0-1023:众所周知,永久地分配给固定的应用使用,特权端口;
- 1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用;如:3306/tcp,11211/tcp;
- 41952+ :客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在/proc/sys/net/ipv4/ip_local_port_range;
-
BSD Socket:IPC的一种实现,运行位于不同主机(也可以是同一主机)上的进程之间进行通信;
-
Socket API(封装了内核中的socket通信相关的系统调用)
- SOCK_STREAM:tcp套接字
- SOCK_DGRAM:udp套接字
- SOCK_RAW:raw套接字
-
根据套接字所使用的地址格式,Socket Domain
- AF_INET:Address Family,IPv4
- AF_INET6:ipv6
- AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址;Unix_SOCK
-
TCP FSM:(有限状态机Finite State Machine)
CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESTABLISHED,FIN_WAIT1,CLOSE_WAIT,FIN_WAIT2,LAST_ACK,TIMEWAIT,CLOSING;-
TCP协议的特性:
- 建立连接:三次握手;
- 将数据打包成段:校验和(CRC32);
- 确认、重传及超时;
- 排序:逻辑序号;
- 流量控制:滑动窗口算法;
- 拥塞控制:慢启动和拥塞避免算法;
http:hyper text transfer protocol
超文本传输协议;应用层协议,C/S架构,默认端口:80
html:hyper text mark language:
超文本标记语言,是一种编程语言。
- 格式:
TITLE
blabla... bla...
- css:Cascading Style Sheet
- js:JavaScript,客户端脚本
协议版本:
http/0.9:原型版本,功能简陋;
-
http/1.0:cache,MIME,method
method:GET POST HEAD PUT DELETE TRACE OPTIONS
-
MIME:Multipurpose Internet Mail Extesion,基于文本编码传输非文本数据的机制
- 功能:能够实现把非文本信息编码成文本格式的数据,并且传输到对端以后还能还原回原有的格式;
http/1.1:增强了缓存功能;spdy
http/2.0:rfc 7540
工作模式:
http请求报文:http request
-
http响应报文:http response
- 一次http事务: 请求<- - ->响应
-
web资源:web response
静态资源(无需server做出额外处理):如 .jpg, .png, .gif, .html, .txt, .js, .css, .mp3, .avi;
-
动态资源(server需要通过执行程序做出处理,发送给client的是程序的运行结果):如 .php, .jsp;
- 注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求;
-
资源的标识机制:URL(Uniform Resource,统一资源定位符)
- locator:用于描述服务器某特定资源的位置
例如:http://www.sina.com.cn/index.html
格式:Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
- locator:用于描述服务器某特定资源的位置
一次完整的http请求处理过程:
建立或处理连接:接受请求或拒绝请求;
-
接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求过程;
并发访问响应模型:[1] 单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;多个请求被串行响应;
[2] 多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
-
[3] 复用I/O结构:一个进程响应N个请求
- 多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
- 事件驱动:event-driven,一个进程直接处理N个请求;
[4] 复用的多线程I/O结构:启动M(多个)个进程,每个进程响应N个请求;响应的请求数量M*N
-
处理请求:对请求报文进行分析,获取客户端请求的资源及请求方法等相关信息;
解析后的报文信息首部称为元数据,格式如下:
Host:www.magedu.com
请求的主机名
Connection:
连接状态-
method(资源传递方法):
- GET:从服务器获取一个资源
- HEAD:只从服务器获取文档的响应首部
- POST:向服务器发送要处理的数据
- PUT:将请求的主体部分存储在服务器上
- DELETE:请求删除服务器上指定的文档
- TRACE:追踪请求到达服务器中间经过的代理服务器
- OPTIONS:请求服务器返回对指定资源支持使用的请求方法;访问资源:获取请求报文中请求的资源
-
http请求处理中的连接状态(connection):
- keep-alive:保持连接,长连接
- close:非保持连接,短连接
-
访问资源:获取请求报文中的资源;
web服务器,即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果;这些资源通常应该放置于本地文件系统某路径下;此路径称为DocRoot;
例:在/var/www/html/路径下的:images/logo.jgp
http://www.magedu.com/images/logo.jgp-
web服务器的资源路径映射方式:
- [1] docroot
- [2] alias
- [3] 虚拟主机的docroot
- [4] 用户家目录的docroot
构建响应报文:根据用户请求的资源MIME类型以及URL重定向进行报文响应;
发送响应报文;
记录日志
http服务程序
常见的服务程序:
httpd(Apache):功能丰富、稳定性能极佳;
nginx
lighttpd应用程序服务器:
IIS:.Net
tomcat:.jsp-
httpd的安装和使用:
ASF:Apache software foundation,阿帕奇软件基金会;- httpd是基于HTTP协议的服务软件,是由伊利诺大学的国家超级电脑应用中心开发的
- apache是一个改良过的httpd软件,是由一群志同道合的技术爱好者发起修改,寓意为A path server(一个修改过的服务器);并且是开源的,属于Apache 软件基金会的一个项目,后来更名为httpd。
httpd的特性:
高度模块化:Core + modules
动态链接库DSO:dynamic shared object
-
多路处理模块MPM:Multipath Processing Modules
prefork :多进程模型,每个进程响应一个请求;一个主进程辅助生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,所示等待请求到达;最大不会超过1024个;
-
worker:多进程多线程模型,每个线程响应一个请求;
- 一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程处理;
- 多个子进程:每个子进程辅助生产多个线程;
- 每个线程:负责响应用户请求;
- 并发响应数量:M*N; M:子进程数量;N:每个子进程所能创建的最大线程数量
-
event:事件驱动模型,多进程模型;每个线程响应N个请求;
- 一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程处理;
- 子进程:基于事件驱动机制直接响应多个请求;
httpd-2.2:仍为测试使用模型;
httpd-2.4:event可生成环境中使用
httpd的程序版本:
- httpd 1.3:官方已经停止维护
- httpd 2.0:
- httpd 2.2:
- httpd 2.4:目前最新稳定版;
httpd的功能特性:
- CGI:Common Gateway Interface,通用网关接口;
- 虚拟主机:基于IP、Port、FQDN的虚拟主机;
- 反向代理
- 负载均衡
- 路径别名
- 丰富的用户认证机制:如basic和 digest
- 支持第三方模块
安装httpd:
- rpm包:CentOS发行版中直接提供;
yum install -y httpd
- 编译安装:定制新功能,或其他原因;
CentOS 6:httpd-2.2
-
程序环境:
-
配置文件:
/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
-
服务控制和启动:
chkconfig httpd on | off
service {start | stop | restart | status | configtest | reload} httpd
-
CentOS 7 :httpd-2.4
-
程序环境:
-
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
- 模块相关的配置文件:
/etc/httpd/conf.modiles.d/*.conf
-
systemd unit file:
/usr/lib/.systemd/system/httpd.service
-
主程序文件:
-
/usr/sbin/httpd
httpd-2.4支持MPM的动态切换;
-
-
日志文件:
-
/var/log/httpd:
- access_log:访问日志
- error_log:错误日志
-
-
站点文档:
/var/www/html
-
模块文件路径:
- /usr/lib64/httpd/modules
- /usr/lib64/httpd/modules
- 服务控制:
- systemctl enable | disable httpd.service
- systemctl {start | stop | restart | status} httpd.service`
- systemctl enable | disable httpd.service
-
httpd-2.2的常用配置
主配置文件:/etc/httpd/conf/httpd.conf
使用grep命令获取配置文件分段:
[root@localhost ~]# 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
常用配置:
-
修改监听的IP和PORT
Listen [IP:]PORT
- [1] 省略IP表示为0.0.0.0;
- [2] Listen 指令可重复出现多次;
Listen 80
Listen 8080 - [3] 修改监听socket,重启服务进程方可生效;
-
持久连接相关:
- Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行;但是总归要断开,如何断开?可以通过对连接数量和时间限制来控制;比如:限制100个连接,超过100个后会断开最先的连接;限制连接60秒后没有进行任何操作则断开;
- 副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
- 折衷的改进办法:使用较短的持久连接时长,以及较少的请求数量;
- 持久连接的相关参数:
KeepAlive Off|On #关闭或打开持久连接
MaxKeepAliveRequserts 100 #最大持久连接请求数量
KeepAliveTimeout 15 #连接时长,单位秒;httpd-2.4支持毫秒
测试:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host:WEB_SERVER_IP
-
MPM:多路处理模块,并发请求响应的不同实现,三种模式:prefork、 worker、 event;
httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包专门提供了3个应用程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现对不同的MPM机制的支持
-
确认现在使用的是那个程序文件的方法:
-
ps aux | grep httpd
#默认是用的为/usr/sbin/httpd,其为prefork的模块
-
-
查看httpd程序的模块列表:
- 查看静态编译的模块:
httpd -l
- 查看静态编译及动态编译的模块:
httpd -M
- 查看静态编译的模块:
更换使用httpd程序,以支持其他MPM机制:
vim /etc/sysconfig/httpd
修改此行:HTTPD=/usr/sbin/httpd.{worker,event}
注意:重启服务进程方可生效
httpd.conf配置文件当中对prefork和worker进行了选项和参数的描述,如下:
MPM配置:
profork的配置
StartServers 8 #进程启动时创建多少个子进程等待访问
MinSpareServers 5 #最小空闲进程数
MaxSpareServers 20 #最大空闲进程数
ServerLimit 256 #生命周期内最多允许存在多少个子进程
MaxClients 256 #最多允许创建的子进程数,与ServerLimit等同
MaxRequestsPerChild 4000 #每个子进程最多处理多少个请求后就得强制关闭
worker配置
StartServer 4
MaxClients 300 #最大并发客户端连接数
MinSpareThreads 25 #最小空闲线程
MaxSpareThreads 75 #最大空闲线程
ThreadsPerChild 25 #每个服务器进程中工作线程的常数
MaxRequestPerChild 0 #服务器进程服务的最大请求数
DOS:配置指定实现模块加载,格式如下:
LoadModule
模块路径:可使用相对路径;相对于ServerRoot指令只想的位置而言
注意:建议使用service httpd reload
重新装载配置文件-
定义‘Main’Server 的文档页面路径
DocumentRoot " "
- 文档路径映射:DoucmentRoot指向的路径为URL路径的起始位置;其相当于站点URL的根路径;
(FileSystem) /web/host1/index.html --> (URL) /index.html
- 文档路径映射:DoucmentRoot指向的路径为URL路径的起始位置;其相当于站点URL的根路径;
-
站点路径访问控制
可基于来源地址或者基于账号两种访问控制机制;定义的方式有两种:文件系统路径:
... URL路径:
...
-
Directory中“基于来源地址”的访问控制定义
-
[1] Options:
- Indexes:当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用。
- FollowSymLinks:如果某页面文件是指向DocumentRoot之外的路径上的其他文件时,将直接显示目标文件的内容;
- None:none;
- All:所有的都启用;
AllowOverride:与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中; None: All:
-
order和allow、deny
Order:定义生效次序;写在后面的表示默法则;
Order Allow Deny:只有明确Allow的来源地址,才允许访问,其他的均为Deny
-
Order Deny Allow:
- Allow from:允许访问的来源地址
- Deny from:拒绝访问的来源地址
-
例:
Order Allow Deny
Deny from 172.16.100.2
Allow from 172.16.0.0/16
from后面可跟的地址格式:
IP地址:
网络地址:
172.16
172.16.0.0
172.16.0.0、16
172.16.0.0/255.255.0.0
定义默认的主页面
DirectoryIndex index.html index.html.var
自左而右,找到首次匹配到的文件;就将其作为默认主页返回。-
定义路径别名
格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
例如:
DocumentRoot “/var/www/html”
我们访问:http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
那么我们的文件路径为:/var/www/html/download/bash-4.4.2-3.el6.x86_64.rpm
设置别名:Alias /download/ "/rpms/pub/"
在访问就变成:http://www.magedu.com/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
- 定义默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, BG2312,GB18030 - 日志设定
* 日志类型:访问日志 和 错误日志
* 错误日志
`ErrorLog logs/error_log`
`LogLevel warn`
`Possible values include : debug,info,notice,warn,error,crit,alert,emerg`
* 访问日志;通过关键字LogFormat来定义一个日志格式
`LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined`
该格式还有一个名称叫combined,一次在后面引用格式的时候直接引用改格式的名称,通过关键字Customlog来设置访问日志的存放路径及格式信息
`CustomLog logs/access_log combined`
* %h:Remote host,客户端主机ip地址
* %l:Remote logname(from identd,if supplied).客户用户通过identd登录时使用名称;一般为-
* %u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
* %t:服务器收到请求时的时间;
* %r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
* %>s:响应状态码;
* %b:响应报文的大小,单位是字节;不包括响应报文的http首部;
* %{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;
* %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
- 基于用户的访问控制
* 认证质询:
WWW-Authenticate : 响应码为401,拒绝客户端请求, 并说明要求客户端提供账号和密码;
* 认证:
Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
* 认证方式有两种:
* basic:明文
* digest:消息摘要认证
* 安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;
* 用户的账号和密码存放于何处?
* 虚拟账号:仅用于访问某服务时用到的认证标识
* 存储:文本文件、SQL数据库、ldap目录存储
* basic认证配置示例:
* [1]定义安全域
`
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFIle “/PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 ...
`
允许账号文件中的所有用户登录访问:
`Require valid-user`
* [2]提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理
`htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c: 自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密
-s:sha格式加密
-D:删除指定用户`
* 另外:基于组账号进行认证;
* [1]定义安全域
`
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group grpname1 grpname2 ...
`
* [2] 创建用户账号和组账号文件;
组文件:每一行定义一个组
`GRP_NAME:username1 username2 ...`
- 虚拟主机
* 站点标识:socket
* IP相同,但端口不同
* IP不同,但端口均为默认端口
* FQDN不同;
* 请求报文中首部
* Host:www.magedu.com
* httpd三种类型的虚拟主机:
* 基于IP:为每个虚拟主机准备至少一个ip地址;
* 基于port:为每个虚拟主机使用至少一个独立的port;
* 基于FQDN:为每个虚拟主机使用至少一个FQDN;
* 注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用‘Main’主机;
* 禁用方法:注释中心主机的DocumentRoot指令即可
* 虚拟主机的配置方法:
`
server Name FQDN
DocumentRoot ""
`
* 其他可用指令:
`serverAlias:虚拟主机的别名;可多次使用
Errorlog:错误日志
CustomLog:访问日志
...
Alias
...`
* 基于IP的虚拟主机示例:后续web service 学习笔记2中记录