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:不进入交互模式,把文档输出到标准输出
  • 相关阅读:
    Spring Boot学习——AOP编程的简单实现
    Spring Boot学习——表单验证
    Spring Boot学习——数据库操作及事务管理
    Spring Boot学习——Controller的使用
    Spring Boot学习——Spring Boot配置文件application
    Spring Boot学习——第一个Spring Boot程序
    Spring Boot学习——Spring Boot简介
    activeMQ队列模式和主题模式的Java实现
    Markdown语法格式
    Java基础知识系列——Exception
  • 原文地址:https://www.cnblogs.com/sjie0224/p/9154551.html
Copyright © 2011-2022 走看看