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  \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:不进入交互模式,把文档输出到标准输出
posted @ 2018-06-08 11:01  孤鸟的悲歌丶  阅读(694)  评论(0编辑  收藏  举报