Web Service
传输层:提供进程地址
Port Number:
tcp:传输控制协议,面向链接的协议:通讯钱须要创建虚拟链路,结束后拆除链路
0-65535
udp:User Datagram Protocol,无链接的协议
0-65535
IANA:
0-1023:特权端口,这些端口永久分配给固定的应用使用,22/tcp(ssh),80/tcp(http),443/tcp(https)
1024-41951:亦为注册端口,但要求并非特别严格,分配给程序注册的某应用使用,11211/tcp,11211/udp(memcache),3306/tcp(mysql)
41952+:客户端程序随机使用的端口:动态端口或私有端口,其范围的定义: /proc/sys/net/ipv4/ip_local_port_rangejavascript
Socket:IPC的一种实现,运行位于不一样主机(甚至同一主机)上不一样进程之间进行通讯:数据交换,Socket API SOCK_STREAM:tcp套接字 SOCK_DGRAM:UDP套接字 SOCK_RAW:裸套接字 Socket Domain(根据其所使用的地址) AF_INET:Address Family,ipv4 AF_INET:Address Family,ipv6 AF_UNIX:同一主机不一样进程之间通讯时使用 每类套接字都至少提供了两种socket;流,数据报 流:可靠地传递、面向链接、无边界 数据包:不可靠地传递、有边界、无链接 套接字相关的系统调用: socket():建立一个套接字 bind():绑定 listen():监听 accept():接收请求 connect():请求链接创建 write():发送 read():接收数据 send(),recv(),sendto(),recvfrom() IPV4: 分类: A:1-127 B:128-191 C:192-223 D:224-239 E:240-254 私有地址: A:10.0.0.0/8 B:127.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 html:编程语言,超文本标记语言 <html> <head> <title> TITLE </titlet> </head> <body> <h1></h1> <p>test..<a href="http://www.sjie.com/logo.jpg">sjie</a></p> <h2></h2> </body> </html> CSS:层叠样式表(cascading Style Sheet) JS:JavaScript MIME:Multipurpose Internet Mail Extesion 工做机制: http请求 http响应 web资源:web resource 静态文件:.jpg .gif .html .txt .css .js .mp3 .avi 动态文件:.php .jsp 媒体: 媒体类型(MIME类型):major/minor text/html text/plain image/jepg image/gif URI:Uniform Resource Identifier URL:uniform Resource Locator,用来描述某服务器某特定资源的位置 Scheme://Server:Port/path/to/resource http://www.sjie.com/images/logo.jpg URN:Uniform Resource Naming Http协议版本: HTTP/0.9:原型版本 HTTP/1.0: 第一个普遍使用的版本,支持MIME HTTP/1.1:加强了缓存功能 spdy:Google研发的 HTTP/2.0: 一次完整的HTTP请求: (1)创建或处理请求:接收请求或拒绝请求 (2)接收请求: 接收来自于网络的请求报文中对某资源的一次请求的过程 并发访问响应模式(web I/O): 单进程I/O结构:启动一个进程处理用户请求,并且一次只处理一个,多个请求被串行响应 多进程I/O结构:并行启动多个进程,每一个进程响应一个请求 复用I/O结构:一个进程响应n个请求: 多线程模型:一个进程生成N个线程,每一个线程响应一个用户请求 事件驱动:event-driver 复用的多进程I/O结构:启动多个进程,每一个进程响应N个请求 (3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息 元数据:请求报文首部 <method> <URL> <VERSION> Host:www.sjie.com 请求的主机名称 Connection: (4)访问资源:获取报文中请求的资源 web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,此路径一般称为DocRoot web服务器资源路径映射方式: (a) docroot (b) alias (c) 虚拟主机docroot (d) 用户家目录docroot (5)构建响应报文: 资源的MIME类型: 显式分类 魔法分类 协商分类 URL重定向: web构建的响应并发客户端请求的资源,而是资源另一个访问路径 (6)发送响应报文 (7)记录日志 HTTP服务器程序: httpd(apache) nginx lighttpd 应用程序服务器: IIS tomcat,jetty,jboss,resin webshpere,weblogic,oc4j HTTPD的安装配置和使用 httpd:apache httpd的特性: 高度模块化:core + modules DSO:Dynamic Shared Object MPM:Multipath Processing Modules perfork:多进程模型,每一个进程响应一个请求: 一个主进程,负责生产n个子进程,子进程也称为工做进程,每一个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个 worker:多线程模式(多进程生成的,一个进程生成多个线程),一个线程响应一个请求 event:事件驱动模型,一个线程响应多个请求 HTTPD安装: 安装方式: rpm 编译 程序环境: 配置文件: /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf 服务脚本: /etc/rc.d/init.d/httpd 配置文件:/etc/sysconfig/http 主程序文件: /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 配置文件的组成: grep "Section" /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 省略IP表示监听本机全部IP;Listen可重复出现屡次 2,持久链接 Persistent Connection:链接创建,每一个资源获取完成后不会断开链接,而是继续等待其余的请求完成 若是断开? 数量限制:100 时间限制:可配置 反作用:对并发访问量较大的服务器,持久链接功能会使用有些请求得不到响应 折中:使用较短的持久链接时间 httpd-2.4 支持毫秒级持久时间 非持久链接 KeepAlive On|Off MaxKeepAliveRequests KeepAliveTimeout 3,MPM Multipath Process Module:多信道处理模块 prefork,worker,event httpd-2.2不支持同时编译多个模块,因此只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不一样MPM机制的支持,默认为prefork httpd -l : 查看编译的模块 更换httpd启动程序 修改/etc/sysconfig/httpd中的HTTPD= prefork的配置 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> worker的配置 <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> 4,DSO 配置指令实现模块加载 LoadModule <mod_name> <mod_path> 模块路径可以使用相对地址 相对于ServerRoot指向的路径而言: /etc/httpd/module 5,定义'Main' server的文档页面路径 DocumentRoot 文档路径映射: DocumentRoot指向的路径为URL路径的起始位置: DocumentRoot "/var/www/html" test/index.html -->http://HOST:PORT/test/index.html 6,站点访问控制 可基于两种类型的路径指明对哪些资源进行访问控制 文件系统路径: <Directory ""></Directory> <File ""></File> <FileMatch ""></FileMatch> URL路径: <Location ""></Location> 访问控制机制 基于来源IP: 基于帐号: 7,Directory中基于来源地址实现访问控制 (1)Options 全部可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews Indexes:索引; FollowSymlinks:容许跟踪符号连接文件 (2)基于来源地址的访问控制机制 Order:检查次序 Allow from Deny from 来源地址: IP NetAddr: 172.16 172.16.0.0 172.16.0.0/16 172.16.0.0/255.255.0.0 8,定义默认主页面 DirectoryIndex index.html index.html.var 9,日志设定 错误日志: ErrorLog logs/error.log LogLevel warn 级别:debug info notice warn error crit alert emerg CustomLog logs/access_log combined LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined %h:客户端IP地址; %l:Remote logname(from identd,if supplied) -表示为空; %u:Remote user (from auth) -表示为空; %t:服务器收到请求的时间; %r:请求报文的首行信息(method url version); %>s:响应状态码 %b:响应报文的大小,单位是字节,不包括响应报文的首部 %{Referer}i:请求报文当中的"referer"首部的值,当前资源的访问人口,即从哪一个页面中的超连接跳转而来; %{User-Agent}i:请求报文当中"User-Agent"首部的值:即发出请求用到的应用程序 10,路径别名 Alias /URL/ "/PATH/TO/SOMEDIR/" Alias /bbs/ "/forum/htdocs" http://www.sjie.com/bbs/index.html --> /forum/htdocs/bbs/ 11,设定默认字符集 AddDefaultCharset UTF-8 12,基于用户的访问控制 认证质询: WWW-Authenticate:响应码是401,拒绝客户端请求,并说明要求客户提供帐号和密码 认证: Authentization:客户端用户填入帐号和密码后再次发送请求报文,认证经过,则服务器发送响应的资源 认证类型: basic:明文 digest:消息摘要 安全域:须要用户认证后方能访问的路径: 应该经过名称对其进行标识,并用户告知用户认证的缘由 用户帐号和密码存储于何处 虚拟帐号:仅用于访问某服务时用到的认证标识 存储: 文本文件 SQL数据库 ldap nis basic认证: (1)定义安全域 <Directory ""> Options None AllowOverride None AuthType Basic AuthName "STRING" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" Require user username1 username2 #容许文件中的全部用户 Require valid-user </Directory> (2)提供帐号和密码存储(文本文件) 使用htpasswd命令进行管理 htpasswd [options] passwordfile username -c:自动建立passwordfile,所以仅在建立第一个用户时使用 -m:使用MD5加密用户密码文件 -s:sha1加密用户密码 -D:删除指定用户 (3)实现基于组认证 <Directory ""> Options None AllowOverride None AuthType Basic AuthName "STRING" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE" Require group GROUP1 GROUP2 </Directory> 须要用户帐号文件和组文件: 组文件:每一行定义一个组 GROUP_NAME:user1 user2 user3 ... 13,虚拟主机 有三种实现方案: 基于IP: 为每一个虚拟主机只是一个IP地址; 基于port: 为每一个虚拟主机准备至少一个专用port;实践中不多使用; 基于hostname: 为每一个虚拟主机准备只是一个专用的hostname; 注意:通常虚拟主机莫与中心主机混用,要使用虚拟主机,先禁用中心主机: 禁用中心主机:注释DocumentRoot 每一个虚拟主机都有专用配置: <VirtualHost "IP:PORT"> ServerName DocumentRoot "" </VirtualHost> SeverAlias:虚拟主机的别名 ErrorLog CustomLog <Directory> </Directory> 基于IP地址的虚拟主机: <VirtualHost 192.168.1.1:80> ServerName web1.sjie.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 192.168.1.2:80> ServerName web2.sjie.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> 基于端口的虚拟主机: <VirtualHost 192.168.1.1:80> ServerName web1.sjie.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 192.168.1.1:8080> ServerName web2.sjie.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> 基于主机名的虚拟主机: <VirtualHost 192.168.1.1:80> ServerName web1.sjie.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 192.168.1.1:80> ServerName web2.sjie.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> 14,内置的status页面 <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 192.168.1.1 </Location> 15,使用mod_deflate模块压缩页面优化传输速度 适用场景: (1) 节约带宽,额外消耗CPU,同事有些老的浏览器不支持 (2) 压缩适于压缩的资源,例如文件 SetOutputFilter DEFLATE #压缩的资源类型 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 DeflateCompressionLevel 9 BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html 16,https http over ssl = https 443/tcp ssl:v3 tls:v1 ssl会话简化: (1)客户端发送可供选择的加密方式,并向服务器请求证书 (2)服务器端发送整数以及选定的加密方式给客户端 (3)客户端取得整数并进行证书验证 若是信任给其发证书的CA (a)验证证书来源的合法性:用CA的公钥解密证书上数字签名 (b)验证证书的内容的合法性 (c)检查证书的有效期限 (d)检查整数是否被吊销 (e)证书中拥有者的名字,与访问的目标主机要一致 (4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换 (5)服务用此密钥加密用户请求的资源,响应给客户端 注意:SSL会话是基于IP地址建立,因此单IP仅可使用一个HTTPS拟主机 配置httpd支持https (1)为服务器申请数字证书 测试:经过私有CA发证书 建立私有CA 在服务器建立证书签署请求 CA签证 (2) yum install -y mod_ssl 配置文件:/etc/httpd/conf.d/ssl.conf DocumentRoot ServerName SSLCertificateFile SSLCertificateKeyFile 17,httpd自带的工具程序 htpasswd:basic认证基于文件实现时,用到的帐号密码文件生成工具 apachectl:httpd 自带的服务控制脚本,支持start,stop apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具 rotatelogs:日志滚动工具 suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行 ab:Apache Benchmark ab [options] URL -n:总的请求数 -c:模拟的并发数 -k:以持久链接模式测试 Http协议和HTTPD的配置 URL:Uniform Resource Locator URL方案:scheme 服务器地址:ip:port 资源路径: 基本语法: <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag> params:参数 http://www.sjie.com/bbs/hello;gender=f query:查询 http://www.sjie.com/bbs/item.php?username=tom&title=abc frag:锚定 http://www.sjie.com/doc/install/index.html#rpm HTTP协议: HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2.0 HTTP协议,stateless 服务器没法持续追踪访问者来源 cookie,session 报文语法格式: request报文 <method><request-url><version> <headers> <entity-body> response报文: <vsersion><status><reason-phrase> <headers> <entitiy-body> method:请求方法,标明客户端但愿服务器对资源执行的动做 GET,HEAD,POST version: HTTP/<major>.<minor> status: 三位数字,如200,301,302,404,502;标记请求处理过程当中发生的状况 reason-phrase: 状态码所标记的状态的简要描述 headers: 每一个请求或响应报文可包含任意个首部,每一个首部都有首部名称,后面跟一个冒号,然后跟上一个可选空格,接着就是一个指 entity-body:请求时附加的数据或响应时附加的数据 method方法: GET:从服务器获取一个资源 HEAD:只从服务器获取文档的响应首部 POST:向服务器发送要处理的数据 PUT:将请求的主体部分存储在服务器上 DELETE:请求删除服务器的某个文档 TRACE:追踪请求到达服务器中间通过的代理服务器 OPTIONS:请求服务器返回对指定资源支持使用的请求方法 协议查看或分析工具: tcpdump,tshark,wireshark status(状态码) 1xx 100-101 信息提示 2xx 200-206 成功 3xx 300-305 重定向 4xx 400-415 错误类信息,客户端错误 5xx 500-505 错误类信息,服务器端错误 经常使用状态码: 200:成功,请求的全部数据经过响应报文的entity-body部分发送 301:请求的URL指向的资源以及被删除,但在响应报文中经过首部Location指明了资源如今所处的新位置:Moved Per 302:与301类似,但在响应报文中经过Location指明资源如今所处临时新位置:Found 304:客户端发出了条件式请求,但服务器上的资源未发生改变,则经过响应此响应码经过客户端:Not Modified 401:须要输入帐号和密码认证方能访问资源:Unauthorized 403:请求被禁止:Forbidden 404:服务器没法找到客户端请求的资源:Not Found 500:服务器内部错误:Internal Server Error 502:代理服务器从后端服务器收到了一条伪响应:Bad Gateway 首部分类: 通用首部: Date:报文的建立时间 Connection:链接状态,如keep-alive,close Via:显示报文通过的中间节点 Cache-Control:控制缓存 请求首部: Accept:经过服务器本身可接受的媒体类型 Accept-Charset: Accept-Encoding:接受编码格式,如gzip Accept-Language:接受的语言 Client-IP Host:请求的服务器名称和端口号 Referer:包含当前正在请求的资源的上一级资源 User-Agent:客户端代理 响应首部: 信息性: 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:最后一次修改的时间 扩展首部 Curl命令用法: Curl是基于URL语法在命令行方式下工做的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELENT,DIVCT,FILE及LDAP等协议。curl支持HTTPS的认证,并HTTP的POST,PUT等方法。 curl [options] [URL] -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[:passwd]> 设置服务器的用户和密码 -0/--http1.0 使用HTTP1.0 elinks [OPTIONS] [URL] --dump:不进入交互模式,把文档输出到标准输出