magelinux(0111)

Web Service

应用层: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: CLOSED, LISTEN,SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIMEWAIT, CLOSED

TCP协议的特性:
建立连接:三次握手;
将数据打包成段:校验和(CRC32)
确认、重传及超时;
排序:逻辑序号;
流量控制:滑动窗口算法;
拥塞控制:慢启动和拥塞避免算法;

http:hyper text transfer protocol, 应用层协议, 80/tcp, 文本协议
html:hyper text mark language, 编程语言,超文本标记语言;

<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1></h1>
<p> blabla... <a href="http://www.magedu.com/download.html"> bla... </a> </p>
<h2> </h2>
</body>
</html>

css: Cascading Style Sheet
js:JavaScript, 客户端脚本;

协议版本:
http/0.9:原型版本,功能简陋
http/1.0: cache, MIME, method,
MIME:Multipurpose Internet Mail Extesion
method:GET, POST, HEAD,PUT, DELETE,TRACE, OPTIONS
http/1.1:增强了缓存功能;
spdy
http/2.0:
rfc

工作模式:
http请求报文:http request
http响应报文: http response
一次http事务:请求<-->响应

web资源:web resource
静态资源(无须服务端做出额外处理): .jpg, .png, .gif, .html, txt, .js, .css, .mp3, .avi
动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序的运行结果): .php, .jsp

注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求;

资源的标识机制:URL
Uniform Resource Locator:用于描述服务器某特定资源的位置;
例如: http://www.sina.com.cn/index.html
Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]

一次完整的http请求处理过程:
(1) 建立或处理连接:接收请求或拒绝请求;
(2) 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程;
(3) 处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
(4) 访问资源:获取请求报文中请求的资源;
(5) 构建响应报文:
(6) 发送响应报文:
(7) 记录日志:

接收请求的模型:
并发访问响应模型:
单进程I/O模型:启动一个进程处理用户请求;这意味着,一次只能处理一个请求,多个请求被串行响应;
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
复用的I/O结构:一个进程响应n个请求;
多线程模式:一个进程生成n个线程,一个线程处理一个请求;
事件驱动(event-driven):一个进程直接n个请求;
复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程;
响应的请求的数量:m*n

处理请求:分析请求报文的http请求报文首部
http协议:
http请求报文首部
http响应报文首部

请求报文首部的格式:
<method> <URL> <VERSION>
HEADERS: (name: value)
<request body>

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

web服务器,即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果;这些资源通常应该放置于本地文件系统某路径下;此路径称为DocRoot;

如果rpm包安装的,默认的位置是/var/www/html/:这个可在配置文件中更改
images/logo.jgp

http://www.magedu.com/images/logo.jpg

web服务器的资源路径映射方式:
(a) docroot
(b) alias
(c) 虚拟主机的docroot
(d) 用户家目录的docroot

http请求处理中的连接模式:
保持连接(长连接):keep-alive
时间:
数量:
非保持连接(短连接):

三次握手是,第一次客户端请求连接,第二次服务器端相应并请求连接,第三次客户端请求。四次挥手是,第一次客户端请求,第二次服务器端响应,第三次服务器端请求,第四次客户端响应。第二次握手是把请求和响应合二为一了,而四次挥手确分开了,有的服务器会阻塞在第二次服务器响应这个阶段,就是不想分手,不想断开,以保证如果客户端在请求断开的过程中又要请求数据了,还可以传数据,不用再重新建立连接

一次完整的连接不一定仅仅发送一个资源。如果就这样一个资源耗费一次连接,那这叫短连接。比如一个网页有5个图片,5个图片就是5个资源,客户要访问这个网页,就要走5次这样的三次握手-传输数据-4此挥手的过程。

还有一种模式叫长连接,或者叫保持连接(keep alive),比如一次连接最多能发送5个资源,或者最多能保持几秒钟,时间一到,连接断开。第一条说的情景其实就是这样的模型http服务器程序:httpd (apache)nginxlighttp

应用程序服务器:
IIS: .Net
tomcat: .jsp

www.netcraft.com

httpd的安装和使用:
ASF: apache software foundation
httpd:apache
a patchy server = apache
httpd

httpd的特性:
高度模块化: core + modules
DSO:dynamic shared object
MPM:Multipath processing Modules (多路处理模块)
prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求;
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
worker:多进程多线程模型,每线程处理一个用户请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求;
并发响应数量:m*n
m:子进程数量
n:每个子进程所能创建的最大线程数量;

 

event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
子进程:基于事件驱动机制直接响应多个请求;
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 发行版中直接提供;
编译安装:定制新功能,或其它原因;

CentOS 6:httpd-2.2(不支持支持MPM的动态切换)
程序环境:
配置文件:
/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.modules.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

服务控制:
systemctl enable|disable httpd.service
systemctl {start|stop|restart|status} httpd.service


0111-3     
回顾:
并发服务响应模型:
单进程模型;
多进程模型;
复用的I/O的模型;
多线程模式
事件驱动;
复用的多进程多线程模型

MPM:
prefork:多进程模型,一个进程响应一个请求;
worker:多进程多线程模型,一个线程响应一个请求;
event:事件驱动模型,一个进程响应n个请求;

Web service(2)

httpd-2.2的常用配置

主配置文件分三段,其中第二段和第三段只能有一个生效:/etc/httpd/conf/httpd.conf
### Section 1: Global Environment(全局环境)
### Section 2: 'Main' server configuration(中心主机)
### Section 3: Virtual Hosts(虚拟主机)

配置格式:
directive value
directive(配置指令):不区分字符大小写;
value:为路径时,是否区分字符大小写,取决于文件系统;

常用配置:
1、修改监听的IP和PORT
Listen [IP:]PORT

(1) 省略IP表示为0.0.0.0;
(2) Listen指令可重复出现多次;
Listen 80
Listen 8080
(3) 修改监听socket,重启服务进程方可生效;

2、持久连续
Persistent Connection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行;
如何断开?
数量限制
时间限制

副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常 响应;
折衷:使用较短的持久连接时长,以及较少的请求数量;

KeepAlive On|Off
KeepAliveTimeout 15
MaxKeepAliveRequests 100

测试:
telnet WEB_SERVER_IP PORT
GET /URL HTTP/1.1
Host: WEB_SERVER_IP
输入以上后连续输入回车两次



如果是短连接的话,获取到了一个资源以后就立即断开,如果是长连接就不会立即断开,只有等到数量或时间限制以后才会断开

3、MPM

httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,

分别用于实现对不同的MPM机制的支持;确认现在使用的是哪下程序文件的方法:
ps aux | grep httpd

上图可看到是prefork模式,并且刚开机会启动八个子进程

默认使用的为/usr/sbin/httpd,其为prefork的MPM模块 ;
查看httpd程序的模块列表:
查看静态编译的模块:
# httpd -l
查看静态编译及动态编译的模块:
# httpd -M

更换使用httpd程序,以支持其它MPM机制;
编辑脚本配置文件/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}



注意:重启服务进程方可生效
对于linux来讲,用线程模式取代进程模式所带来性能方面的提升是非常有限的,也就是用worker取代prefork
而对于centos6的apache2.2来讲,event还是测试阶段,不建议在生产环境中使用

MPM配置:在主配置文件中
prefork的配置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>


在这个配置文件中,maxrequestsperchild为4000表示一个进程最多能处理4000个请求,处理到了上显就
必须销毁
maxclients可以理解为最大并发数量(最大请求数量),serverlimit是最多的进程,所以serverlimit要大于等于max
clients
pv 和uv。pv是页面访问数量
假设一个进程一秒钟能发5个资源,那么256个*5就是1280个,也就是一台服务器一秒钟能发1280个资源,而假设一个页面
有100个资源,那么这个服务器最大能支持每秒12.8的pv


worker的配置:
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
在这个配置文件中,maxrequestsperchild为0表示无限,就是一个线程可以无限制的处理请求,而不被销毁

在worker和prefork模式,都是有唯一一个以root身份运行的主进程在运行,这个主进程负责把接收到的请求分配
给子进程或线程,而线程或进程都是以apache身份运行的。上述两个配置中的startserver指的是子进程,
上面这个worker模式的服务器启动时会打开4个子进程,每个子进程启动25个线程(threadsperchild)那么一共启动了
100个线程,但是他配置的maxsparethreads为75个,这个是最大空闲线程,所以砍掉了一个子进程,也就是刚启动有三个
子进程。为什么要这个配,马哥也表示难以理解
PV,UV
PV:Page View
UV: User View

4、DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>

模块文件路径可使用相对路径:
相对于ServerRoot(默认/etc/httpd)

5、定义'Main' server的文档页面路径
DocumentRoot ""

文档路径映射:
DoucmentRoot指向的路径为URL路径的起始位置
其相当于站点URL的根路径;

(FileSystem) /web/host1/index.html --> (URL) /index.html

6、站点访问控制常见机制

可基于两种机制指明对哪些资源进行何种访问控制,一种是文件系统路径,一种是URL路径

文件系统路径:
<Directory "">(针对目录)
...
</Directory>

<File "">(针对单个文件)
...
</File>
 
<FileMatch "PATTERN">(正则表达式)       ( 但是要让这个配置文件生效需要额外
                        启动正则表达式引擎,而这个引擎是效率较低的
                        相较于普通的字符匹配。所以能不用这个就不用这个)
...
</FileMatch>

 

URL路径:
<Location "">
...
</Location>

<LocationMatch "">
...
</LocationMatch>

<Directory>中“基于源地址”实现访问控制:
(1) Options
后跟1个或多个以空白字符分隔的“选项”列表;
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:
All:

(2) AllowOverride(这个不常用)
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
All:
None:

(3) order和allow、deny
order:定义生效次序;写在后面的表示默认法则;

Allow from, Deny from
来源地址:
以下格式都是合法的并且都是相同的效果:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0

7、定义站点主页面:
DirectoryIndex index.html index.html.var

8、定义路径别名
格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"

DocumentRoot "/www/htdocs"
http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm

Alias /download/ "/rpms/pub/"
              如果设置了上述别名,则访问http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
                                                 就会跳转到/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm


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

中文字符集:GBK, GB2312, GB18030

0111-04

10、日志设定
日志类型:访问日志 和 错误日志

 

posted @ 2017-11-10 16:34  扫驴  阅读(412)  评论(0编辑  收藏  举报