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通信相关的系统调用)
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 languge,编程语言,超文本标记语言
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1>TEST</h1>
<p>blabla…<a href="http://www.gm.com/download.html">bla….</a></p>
<h2>TEST</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资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果;这些资源通常应该放置于本地文件系统某路径下,此路径称为DocumentRoot
web服务器的资源路径映射方式:
(a)docroot
(b)alias
(c)虚拟主机的docroot
(d)用户家目录的docroot
http请求处理中的连接模式:
保持连接(长连接):keep-alive
通过2个资源进行限制:
时间,数量<空间>
非保存连接(短连接):close
http服务器程序:
httpd(apache)
nginx
lighttpd
应用程序服务器:
IIS:.Net
tomcat:.jsp
httpd的安装和使用:
ASF:apache software foundation
httpd:apache
a patchy server = apache
httpd的特性;
高度模块化:core+modules
DSO:dynamic shared object
MPM:Multipath processing Modules(多路处理模块)
prefork:多进程模型,每个进程响应一个请求
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程处理
n个子进程:每个子进程处理一个请求
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲
worker:多线程模型:每个进程生成多个线程
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程处理
n个子进程:每个子进程内部生成多个线程
每个线程:负责响应一个请求
并发响应数量:m*n
m;子进程数量
n:每个子进程所能创建的最大线程数量
event:基于事件驱动模型,多进程模型,每个进程响应多个请求
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程处理
n个子进程:基于事件驱动机制直接响应多个请求
httpd-2.2:仍为测试使用模型
httpd-2.4:event可生产环境中使用
httpd的程序版本:
httpd 1.3:官方已经停止维护
httpd 2.0:
httpd 2.2:CentOS6系列上的默认http版本
httpd 2.4:CentoS7系列上的默认http版本
httpd的功能特性:
CGI:Common Gateway Interface
虚拟主机:IP,PORT,FQDN
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
……
安装httpd:
rpm包:CentOS发行版中直接提供
编译安装:定制新功能,或其他原因
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.worker
/usr/sbin/httpd.event
日志文件:
/var/log/httpd/:
access_log:访问日志
error_log:错误日志
站点文档:
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
服务控制和启动:
chkconfig httpd on|off
service {start|stop|status|restart|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
http-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|reload} httpd.service
httpd-2.2的常用配置:
主配置文件;/etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
注意:第2段和第3段不能同时生效
配置格式:
directive value
directive:不区分字符大小写
value:为路径时,是否区分字符大小写,取决于文件系统;其他的不区分大小写
常用配置:
1、修改监听的IP和PORT
Listen [IP:]PORT
(1)省略IP表示监听在所有可用的IP上
(2)Listen指令可重复出现多次,表示监听在多个socket上
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
http-2.2不支持同时编译多个MPM模块,所有只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork),httpd.worker,httpd.event。分别用于实现对不同的MPM机制的支持;确认现在使用的是那个程序文件的方法:
ps aux | grep httpd
默认使用的为/usr/sbin/httpd,其为prefork的MPM模块
查看httpd程序的模块列表:
查看静态编译的模块:
# httpd -l
查看静态编译及动态编译的模块:
# httpd -M
更换使用http程序,以支持其他MPM机制
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker.event}
注意:重启服务进程方可生效
MPM配置:
prefork的配置:
<IfModule prefork.c>
StartService 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClient 256
MaxRequestPerChild 4000
</IfModule>
worker的配置:
<IfModule worker>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestPerChild 0
</IfModule>
PV ,MV
PV:Page View
MV:User View
4、DSO
配置指定实现模块加载
LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径
相对于ServerRoot(默认/etc/httpd)
5、定义'Main'server的文档网页路径
DocumentRoot ""
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置
相当于站点URL的根路径
eg:(FileSystem)/var/httpd/web/index.html –> (URL)/index.html
6、站点访问控制
可基于两种机制指明对那些资源进行何种访问控制
文件系统路径:
<Directory "">
…
</Directory>
<File "">
…
</File>
<FileMatch "PATTERN">
…
</FileMatch>
URL路径:
<Location "">
…
</Location>
<LocationMatch "">
…
</LocationMatch>
<Direcroty>中“基于源地址”实现访问控制
(1)Options
后跟1个或多个空白字符分隔的“选项”列表
Indexes:指明的URL路径下不存在与定义的页面资源相符的资源文件时,返回索引列表给用户
FollowSymLinks:运行跟踪符号连接文件所指向的源文件
None
All
(2)AllowOverride
与访问控制相关的那些指令可以放在.htaccess文件(每个目录下都可以有一个)中
All
None
(3)order和allow、deny
order:定义生效次序;写在后面的表示默认法则;多条命令有重复,以最后一次出现问准
Allow form
Deny form
来源地址:
IP
NetAddr
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
以上4中表达式等价
7、定义站点主页面:
DirecrotyIndex index.html index.php
8、定义路径别名
格式:
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias:中前后必须匹配,前面文件名后有/后面“”中文件名后面也的有/
DocumentRoot "/www/htdocs"
http://www.gm.com/download/file
/www/htdocs/download/file
Alias /download "/test/"
http://www.gm.com/download/file
/test/file
http://www.gm.com/images/file.png
/www/htdocs/images/file.png
9、设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK、GB2312、GB18030
10、日志设定
日志类型:访问日志和错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
Possible values include:debug,info,notice,warn,error,crit,alert,emerg
访问日志:
LogFormat "%h %i %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
LogFormat format strings:
http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
%h:客户端IP地址
%i:Remote User,通常为一个减号("-")
%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"的值;即发出请求的应用程序
11、基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供帐号和密码
认证:
Authorization:客户端用户填入帐号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
认证方式有两种:
basic:明文
digest:消息摘要认证
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
用户的帐号和密码存放于何处?
虚拟帐号:仅用于访问某服务器时用到的认证标识
存储:
文本文件
SQL数据库
ldap目录存储
basic认证配置示例:
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PAHT/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2
</Directory>
允许帐号文件中的所有用户登录访问:
Require valid-user
(2)提供帐号和密码存储(文本文件)
使用专门命令完成此类文件的创建以及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
-m:md5格式加密
-s:sha格式加密
-D:删除指定用户
-b:可以指定用户密码,不用交互式
另外:基于组帐号进行认证
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "String"
AuthUserFile "/PAHT/TO/HTTPD_USER_PASSWD_FILE"
AuthGroupFile "/PAHT/TO/HTTPD_GROUP_FILE"
Require group grpname1 grpname2
</Directory>
(2)提供帐号和密码存储(文本文件)
组文件:每一行定义一个组
GRP_NAME:username1 username2 …
12、虚拟主机
站点标识:socket
IP相同,但端口不同
IP不同,但端口均为默认端口
FQDN不同:
请求报文中首部
Host:www.gm.com
有三种实现方案:
基于IP:
为每个虚拟主机准备至少一个ip地址
基于port:
为每个虚拟主机使用至少一个独立的port
基于FQDN:
为每个虚拟主机使用至少一个FQDN
注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用'main'主机
禁用方法:注释中心主机的DocumentRoot指令即可
虚拟主机的配置方法:
<VirtualHost IP:FQDN>
ServerName FQDN
DocumentRoot ""
</VirtualHost>
其他可用指令:
ServerAlias:虚拟主机的别名;可多次使用
ErrorLog:
Customlog:
<Directory "">
…
</Direcroty>
Alias
…
基于IP的虚拟主机示例:
<VirtualHost 10.1.43.3:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.4:80>
ServerName www.b.com
DocumentRoot "/www/b.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.5:80>
ServerName www.c.com
DocumentRoot "/www/c.com/htdocs"
</VirtualHost>
基于端口的虚拟主机示例:
<VirtualHost 10.1.43.3:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:808>
ServerName www.b.com
DocumentRoot "/www/b.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:8080>
ServerName www.c.com
DocumentRoot "/www/c.com/htdocs"
</VirtualHost>
基于FQDN的虚拟主机示例:
NameVirtualHost 10.1.43.3
<VirtualHost 10.1.43.3:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:80>
ServerName www.b.com
DocumentRoot "/www/b.com/htdocs"
</VirtualHost>
<VirtualHost 10.1.43.3:80>
ServerName www.c.com
DocumentRoot "/www/c.com/htdocs"
</VirtualHost>
13、status页面
LoadModule status_module modules/mod_status.so
<Location /server-status>
SetHandler server-status
Order allow,deny
allow from 10.1.43
</Location>
14、curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
MIME:major/minor,image/png,image/gif
curl [options] [URL…]
curl的常用选项:
-A/–user-agent <string> 设置用户代理发送给服务器
–basic 使用HTTP基本认证
–tcp-nodelay 使用TCP_NODELAY选项
-e/–referer <URL> 来源网址
–cacert <file> CA证书 (SSL)
–compressed 要求返回是压缩的格式
-H/–header <line>自定义首部信息传递给服务器
-I/–head 只显示响应报文首部信息
–limit-rate <rate> 设置传输速度
-u/–user <user[:password]>设置服务器的用户和密码
-0/–http1.0 使用HTTP 1.0
用法:curl [options] [URL…]
另一个工具:elinks
elinks [OPTION]… [URL]…
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
15、user/group
指定以哪个用户的身份运行http服务进程
User apache
Group apache
SUexec
16、使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源,例如文件文件;
SetOutputFilter DEFLATE
# mod_deflate configuration
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
# Level of compression (Highest 9 – Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
17、https, http over ssl
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式,并向服务器请求证书;
(2) 服务器端发送证书以及选定的加密方式给客户端;
(3) 客户端取得证书并进行证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性;用CA的公钥解密证书上数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持https:
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA
(b) 在服务器创建证书签署请求
(c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书;
# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
18、httpd自带的应用程序
htpasswd:basic认证基于文件实现,用于生成账号和密码的程序;
htdbm
htdigest
apachectl:httpd自带的服务控制脚本,支持start和stop等子命令;
apxs:- APache eXtenSion tool
rotatelogs:日志滚动工具
access.log –>
access.log ,access.1.log –>
access.log ,access.1.log ,access.2.log
suexec:访问某些有特殊权限的资源时,临时切换至指定用户身份运行
ab:apache benchmark web服务器的压力测试工具
webbench, httpload, …
loadrunner, jmeter (ASF)
tcpcopy:网易,复制生产环境中的真实请求,并将之保存下来
19、ab – web service的压力测试工具
命令行工具:ab, webbench, httpload, seige, …
GUI:loadrunner, jmeter
tcpcopy
ab [options] [http[s]://]hostname[:port]/path
请求数:-n requests
并发数:-c concurrency
长连接模式测试:-k
原创文章,作者:megedugao,如若转载,请注明出处:http://www.178linux.com/50426