zoukankan      html  css  js  c++  java
  • httpd软件详解

    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_range

    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  MSI[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:不进入交互模式,把文档输出到标准输出
  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/sjie0224/p/9154551.html
Copyright © 2011-2022 走看看