Web Service
传输层:提供进程地址
port number:
tcp:传输控制协议,面向连接的协议,通信前需要建立虚拟链路,结束后拆除链路;端口:0-65535
udp:user datagram protocol,无连接的协议;端口:0-65535
IANA:
0-1023:特权端口,永久分配给固定应用使用
1024-41951:注册端口,但要求并不是特别严格,分配给程序员注册为某应用使用。
41952+:客户端程序随机使用的端口;其范围的定义:/proc/sys/net/ipv4/ip_local_port_range
socket:IPC(进程间通信)的一种实现,允许位于不同主机(甚至同一主机)上不同进程间进行通讯,数据交换;socket API(应用程序编程接口)
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW:裸套接字
IPv4分类:
A:1-127
B:128-191
C:192-223
D:224-239
E:240-254
私有地址:
A:10.0.0.0/8
B:172.16.0.0/16-172.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24
TCP协议的特性:
建立连接,三次握手
将数据打包成段,校验和(CRC-32)
确认、重传以及超时
排序:逻辑序号
流量控制:滑动窗口算法
拥塞控制:慢启动和拥塞避免算法
http:Hyper Text Transfer Protocol超文本传输协议,80/tcp
html:编程语言,Hyper Text Markup Language超文本标记语言
工作机制:
http请求
http响应
URL:统一资源定位符(uniform resource locator)
URL方案:scheme
服务器地址:ip:port
资源路径:
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<querry>#<frag>
params:参数;提示符为;
querry:查询条件;提示符为?
frag:片段;提示符为#
http协议:stateless无状态连接:
追踪访问者来源得借助其他手段:cookie、session。
web资源:web resource
静态文件:.jpg,.gif,.html
动态文件:.jsp,.jsp
并发访问响应模型:(web I/O)
一、单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应;
二、多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
三、复用I/O结构:一个进程响应n个请求;
1、多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;在linux效果不佳
2、事件驱动:event-driven
四、复用的多进程I/O结构:启动多个(m)进程,每个进程响应n个请求;
http服务器程序:
httpd(apache)
nginx
lighttpd
应用程序服务器:IIS、tomcat、jetty、jboss、resin、webshpere、weblogic、oc4j
查看市场份额:www.netcraft.com
报文语法格式:
request报文:
<method> <request-URL> <version>
<headers>
<entity-body>
response报文:
<version> <status> <reason-phrase>
<headers>
<entity-body>
http方法:
GET:请求获取一个资源,需要服务器发送
HEAD:跟GET近似,但其不需要服务响应请求的资源,而返回响应首部
POST:基于HTML表单向服务器提交数据,服务器通常需要存储此数据;(位置:通常为关系型数据库)
PUT:与GET相反,向服务器发送资源;服务器通常需要存储此资源;(位置:通常为文件系统)
DELETE:删除URL指向的资源
OPTIONS:探测服务器端对请求的URL所支持使用的请求方法
TRACE:跟一次请求中间所经过的代理服务器、防火墙或网关等
http状态码:
1XX:信息性状态码
2XX:成功状态码
200:OK
201:CREATED
3XX: 重定向类的状态码
301: Moved Permanently, 永久重定向
302: Found, 临时重定向,会在响应报文中使用“Location: 新位置”;
304: Not Modified
4XX:客户端类错误
403:Forbidden
404: Not Found
405: Method Not Allowed
5XX:服务器类的错误
500:Internal Server Error, 服务器内部错误
502:Bad Gateway, 代理服务器从上游服务器收到一条伪响应;
503:Service Unavailable, 服务暂时不可用
http协议首部:
通用首部
请求首部
响应首部
实体首部
扩展首部:非标准首部,可由程序员自行创建;X-Forward-For, X-Via
通用首部:
Date:报文的创建时间
Connection:连接状态,如Keep-alive,close
Via:显示报文经过的中间节点
Cache-Control:缓存控制
Pragma
请求首部:
Accept: 通知服务器自己可接受的媒体类型
Accept-Charset:接受的字符集
Accept-Encoding:接受编码格式
Accept-Language:接受的语言
Client-IP:客户端ip
Host: 请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源
User-Agent:客户端代理,即浏览器类型
条件时请求首部:
Expect:
If-Modified-Since:自从指定的时间之后,请求的资源是否发生修改;
If-Unmodified-Since:
If-None-Match:本地缓存中存储的Etag标签是否与服务器文档的Etag不匹配;
If-Match:
安全请求首部:
Authorization:向服务器发送认证信息,如账号和密码
Cookie:客户端向服务器发送cookie
Cookie2:
代理请求首部:
Proxy-Authorization:向代理服务器认证
响应首部:
信息性:
Age:响应持续时长
Server:服务器程序软件的名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其他首部列表;
安全响应首部:
Set-Cookie:向客户端设置cookie
Set-Cookie2:
WWW-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:
Allow:列出对此实体可使用的请求方法
Location:告诉客户端真正的实体位于何处
Content-Encoding:
Content-Language:
Content-Length:实体长度
Content-Location:实体真正所处位置
Content-Type:主体的对象类型
缓存相关:
ETag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间
httpd的安装配置和使用:
httpd:apache
特性:
高度模块化:core + modules;
DSO:dynamic shared object:动态共享目标
MPM:Multi-Processing Modules:多处理模块
(a)prefork:多进程模型,每个进程响应一个请求;一个主进程负责生成n个子进程,每个子进程处理一个请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
(b)worker:多线程模型(多进程生成,一个进程生成多个线程),启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求;
(c)event:事件驱动模型;启动多个线程,每个线程响应n个请求;
httpd的功能特性:
丰富用户认证:基本认证和摘要认证
CGI:原生支持perl CGI
虚拟主机:
基于端口、IP、主机名
反向代理:
负载均衡
用户站点:
路径别名:
支持第三方模块
安装方式:
rpm包
源码编译
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
模块目录:
/etc/httpd/modules: 链接文件
/usr/lib64/httpd/modules
常用配置:
1、持久连接:persistence connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其他请求的完成。httpd-2.4支持毫秒级的持久连接。
KeepAlive {On|Off}
MaxKeepAliveRequests #:最大持久请求数量
KeepAliveTimeout #:最大持久时长;
测试:
telnet HOST PORT
GET /URL HTTP/1.1
Host:HOSTNAME or IP
2、MPM参数:
确认方法:# ps aux | grep httpd
查看静态编译的模块: # httpd -l
查看静态编译及动态装载的模块: # httpd -M
更换MPM的方法:编辑/etc/sysconfig/httpd中的HTTPD=,重启服务生效;
<IfModule prefork.c>
StartServers 8 :启动时启动的进程数
MinSpareServers 5 :最小空闲进程数
MaxSpareServers 20 :最大空闲进程数
ServerLimit 256
MaxClients 256 :最大并发请求量
MaxRequestsPerChild 4000
</IfModule>
<IfModule worker.c>
StartServers 4 :启动时启动的进程数
MaxClients 300 :最大并发请求量
MinSpareThreads 25 :最小空闲线程
MaxSpareThreads 75 :最大空闲线程
ThreadsPerChild 25 :每个进程启动的线程数
MaxRequestsPerChild 0
</IfModule>
3、指定监听的地址和端口
Listen [IP:]PORT
此指令可重复指定多次;
4、DSO(动态共享对象)机制装载的模块
查看静态编译及动态装载的模块
# httpd -M
模块路径可使用相对路径:相对于ServerRoot(/etc/httpd)指向的路径而言;/etc/httpd/modules/;
LoadModule Module_Name /path/to/Module_File
5、定义“Main” server的文档页面路径
DocumentRoot “/path/to/somewhere”
6、站点路径访问控制
基于本地文件系统路径:
<Directory “/path/to/somewhere”> </Directory>
<File “”> </File>
<DirectoryMatch “”> </DirectoryMatch>
<FileMatch “”> </FileMatch>
基于URL访问路径做访问控制
<Location “/path/to/URL”> </Location>
<LocationMatch “/path/to/URL”> </LocationMatch>
7、于Directory中可用的访问控制
(1) Options
Indexes:索引;当访问的路径下无默认的主页面,将所有资源以列表形式呈现给用户;危险,慎用;
FollowSymlinks:允许跟踪符号链接文件;
(2) AllowOverride
支持在每个页面目录下创建.htaccess用于实现对此目录中资源访问时的访问控制功能。
(3)基于来源地址的访问控制机制
Order:检查次序,后者为默认法则;
Allow from
Deny from
8、定义默认主页面:DirectoryIndex
9、日志设定:
错误日志:
ErrorLog “/path/to/error_log”
LogLevel {debug|info|notice|warn|error|crit|alert|emerg}
访问日志:
CustomLog “/path/to/access_log” LogFormat_Name
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
%h: 客户端ip地址
%l: 远程登录名,通常为-
%u: 认证时输入用户名,没有认证时为-
%t: 服务器收到 用户请求时的时间
%r:请求报文的首行信息
%>s: 响应状态码
%b: 响应报文的大小,单位是字节,不包含响应报文首部
%{Referer}i:请求报文当中“Referer”首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中“User-Agent”首部的值;即发出请求用到的应用程序;
%{HEADER_NAME}i: 记录指定首部对应的值
10、路径别名:
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录;
Alias /URL/ “/path/to/somewhere/”
11、设定默认字符集
AddDefaultCharset UTF-8
国标中文编码:GB2312, GB18030, GBK
12、基于用户的访问控制
认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号密码;
认证:Authenrization:客户端用户填入账号密码后再次发送请求报文,认证通过,则服务器发送响应资源;
认证类型:
basic:明文
digest:消息摘要,通过md5加密发送;
安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,并用于告知用户认证的原因;
用户的账号密码存储于何处?
虚拟账号:仅用于访问某服务时用到的认证标识;
存储:
1、文本文件:
2、SQL数据库
3、ldap轻量目录访问协议
4、nis
basic认证:
(1)定义安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “”
AuthUserFile “”
Require user username1 username2…
</Directory>
允许账号文件中的所有用户登录访问:Require valid-user
(2)提供账号密码存储(文本文件)
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c:自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
-m:md5加密用户密码;
-s:sha1加密用户密码;
-D:删除指定用户
(3)实现基于组进行认证:
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “”
AuthGroupFile “”
Require group group1 group2…
</Directory>
需提供用户文件和组文件
组文件:每一行定义一个组
GRP_NAME:user1 user2 user3…
13、虚拟主机
配置文件语法检查:
httpd -t
service httpd configtest
三种实现方案:
1、基于ip:为每个虚拟主机准备至少一个ip地址;
2、基于port:为每个虚拟主机准备至少一个专用port;
3、基于hostname:为每个虚拟主机准备至少一个专用hostname;需开启NameVirtualHost *:80
注意:一般虚拟主机不要与中心主机混用,所以,要使用虚拟主机,先禁用中心主机:注释DocumentRoot;
每个虚拟主机都有专用配置:
<VirtualHost “IP:PORT”>
ServerName
DocumentRoot
</VirtualHost>
ServerAlias:虚拟主机的别名
ErrorLog:错误日志
CustomLog:访问日志
<Directory “”> </Directory>
<Location “”> </Location>
14、内置的status页面
ExtendedStatus On:显示扩展的详细信息
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.20
</Location>
15、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服务器等等,功能十分强大。
curl [options] [URL…]
curl的常用选项:
-A/–user-agent <string> 设置用户代理发送给服务器
–basic 使用HTTP基本认证
-u/–user <user[:password]>设置服务器的用户和密码
–tcp-nodelay 使用TCP_NODELAY选项
-e/–referer <URL> 来源网址
–cacert <file> CA证书 (SSL)
–compressed 要求返回是压缩的格式
-H/–header <line>自定义头信息传递给服务器
-I/–head 只显示响应报文首部信息
–limit-rate <rate> 设置传输速度
-0/–http1.0 使用HTTP 1.0
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
httpd: ssl
ssl模块
单独成包
ssl握手要完成的工作:
交换协议版本号
选择双方都支持的加密方式
客户端对服务器端实现身份验正
密钥交换
SSL会话的简化过程:
(1)客户端发送可供选择的加密方式,并向服务器请求证书;
(2)服务器端发送证书以及选定的加密方式给客户端;
(3)客户端取得证书并进行证书验证;
如果信任给其发证书的CA:
(a)验证证书来源的合法性:用CA的公钥解密证书上数字签名;
(b)验证证书的内容的合法性:完整性验证;
(c)检查证书的有效期限;
(d)检查证书是否被吊销;
(e)证书中拥有者的名字,与访问的目标主机要一致;
(4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5)服务器用此密钥加密用户请求的资源,响应给客户端;
注意:ssl会话基于IP地址创建,所以,每一个IP仅创建一个SSL会话;单IP的主机上,仅可以使用一个https虚拟主机;
配置httpd支持https:
(1)为服务器申请数字证书;
测试:通过私建CA发证书
(a)创建私有CA
# cd /etc/pki/CA/
# touch index.txt
# echo 01 > serial
# (umask 077;openssl genrsa -out private/cakey.pem 2048)
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3655
# mkdir -pv /etc/httpd/ssl
# cd /etc/httpd/ssl
# (umask 077; openssl genrsa -out httpd.key 1024)
# openssl req -new -key httpd.key -out httpd.csr -days 3655
# openssl ca -in httpd.csr -out /etc/pki/CA/certs/httpd.crt -days 3655
# scp
(2) 配置httpd支持使用ssl,及使用的证书:
# yum install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
(3) 测试基于https访问相应的主机:
# openssl s_client [-connect IP:PORT] [-cert filename] [-CApath filename] [-CAfile filename]
18、httpd自带的工具程序
htpasswd:basic认证基于文件实现时,用到的账号密码生成工具;
apachectl:httpd自带的服务控制脚本,支持start、stop、restart;
apxs:有httpd-devel包提供的,扩展httpd使用第三方模块的工具;
rotatelogs:日志滚动工具;
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行;
ab:apache benchmark:自带的http压力测试工具
19、http压力测试工具
ab
webbench
http_load
jmeter
loadrunner
tcpcopy
ab [options] URL
-n:总的请求数
-c:模拟的并发数
-k:以持久连接模式测试
ulimit -n #:调整当前用户所同时打开的文件数;
httpd-2.4的新特性:
1)MPM支持在运行时装载(即DSO机制);
2)支持event mpm
3)异步读写
4)支持每模块及每目录分别使用不同的日志级别
5)每请求的配置;<If>
6)增强版的表达式分析器
7)毫秒级的keep alive的timeout
8)基于FQDN的虚拟主机不再需要NameVirtualHost指令;
9)支持用户使用自定义变量
新模块:
(1)mod_proxy_fcgi
(2)mod_ratelimit
(3)mod_remoteip
修改了一些配置机制:
不再支持使用order, allow, deny定义基于ip的访问控制;改为require
安装httpd-2.4
centos 6:apr-1.3
httpd程序依赖于apr-1.4+和apr-util-1.4+、[apr-icon]
apr: apache portable runtime
centos6安装httpd-2.4编译安装步骤:
安装1.4+的apr和1.4+的apr-util
前提:安装开发环境,pcre-devel
# yum groupinstall “development tools” “server plantform development”
# yum install pcre-devel
# yum install expat-devel
# yum install openssl-devel
(1)apr
# ./configure –prefix=/usr/local/apr
# make && make install
(2)apr-util
# ./configure –prefix=/usr/local/apr-util –with-apr=/usr/local/apr
# make && make install
(3)编译安装httpd-2.4
# useradd -r apache
# cp -r /root/apr-1.6.3 /root/httpd-2.4.33/srclib/apr
# cp -r /root/apr-util-1.6.1 /root/httpd-2.4.33/srclib/apr-util
./configure –prefix=/usr/local/apache –sysconfdir=/etc/httpd24 –enable-so –enable-ssl –enable-cgi –enable-rewrite –with-zlib –with-pcre –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util/ –enable-mpms-shared=all –with-mpm=event –enable-modules=most –with-included-apr
# make && make install
centos 7:httpd-2.4
主配置文件:/etc/httpd/conf/httpd.conf
模块配置文件:/etc/httpd/conf.modules.d/*.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
mpm:以DSO机制提供,配置文件/etc/httpd/conf.modules.d/00-mpm.conf
服务控制:systemctl {start|stop|restart|status} httpd.service
配置:
(1)切换使用MPM;编辑/etc/httpd/conf.modules.d/00-mpm.conf
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME:prefork、event、worker
(2)修改‘Main’server的DocumentRoot
(3)基于IP的访问控制法则
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制指定ip访问:
Require ip IPADDR:授权指定ip访问
Require not ip IPADDR:拒绝指定ip访问
控制指定hostname访问:
Require host HOSTNAME:授权
Require not host HOSTNAME:拒绝
示例:
<RequireAll>
Require all granted
Require not ip 127.0.0.1
</RequireAll>
(4)虚拟主机
基于IP、PORT、FQDN都支持
基于FQDN的不再需要NameVirtualHost指令;
(5)ssl
安装mod_ssl:yum install mod_ssl
启用模块:编辑/etc/httpd/conf.modules.d/00-ssl.conf
LoadModule ssl_module modules/mod_ssl.so
(6)centos6的httpd-2.4脚本;参考rpm安装后的脚本修改
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/96964