• Linux_24 http和httpd


    Web Service

    应用层:http,https
    	实现某类具体应用
    
    	传输层协议:TCP,UDP,SCTP
    	
    	IANA:
    		0-1023:众所周知,永久地分配给固定的应用使用,特权端口;
    		1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用;3306/tcp,11211/tcp;
    		41952+:客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在/proc/sys/net/ipv4/ip_local_port_range;
    
    	BSD Socket:IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信;
    		Socket API(封装了内核中的socket通信相关的系统调用)
    			SOCK_STREAM:tcp套接字
    			SOCK_DGRAM:UDP套接字
    			SOCK_RAW:raw 套接字
    		
    		根据套接字所使用的地址格式,Socket Domain:
    			AF_INET:Address Family,IPv4
    			AF_INET6:ipv6
    			AF_UNIX:同一个主机上的不同进程间基于socket套接字通信使用的一种地址;Unix_SOCK 
    	
    	TCP FSM:CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESTABLISHED,FIN_WAIT1,CLOSE_WAIT,FIN_WAIT2,LAST_ACK,TIMEWAIT,CLOSED
    	
    	TCP协议的特性:
    		建立连接:三次握手;
    		将数据打包成段:校验和(CRC32)
    		确认、重传及超时;
    		排序:逻辑序号;
    		流量控制:滑动窗口算法;
    		拥塞控制:慢启动和拥塞避免算法;
    

    HTTP/httpd

    	http:hyper text transfer protocol,应用层协议,80/tcp
    		html:hyper text mark language,编程语言,超文本标记语言;
    			
    		<html>
    			<head>
    				<title>TITLE</title>
    			</head>
    			<body>
    				<h1></h1>
    					<p>hangneibiaoqian...<a href="http://www.sanzhang.com/download.html">asdf..</a>
    			</body>
             </html>
             
             css:Cascading Style Sheet
             js:JavaScript,客户端脚本;
             
             协议版本:
             	http/0.9:原型版本,功能简陋
             	http/1.0:cache,MIME,method,
             		MIME:Multipurspose Internet Mail Extension
             		method:GET,HEAD,PUT,DELETE,TRACE,OPTIONS
             	http/1.1:增强了缓存功能;
             		spdy
             	http/2.0:
             		rfc
             	
             
    		工作模式:
    			http请求报文:http request
    			http响应报文:http response
    				一次http事务:请求<-->响应
    				
    			web资源:web resource
    				静态资源(无需服务端做出额外处理):.jpg,.png,.gif,.html,txt,.js,.css,.pm3,.avi
    				动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序的运行结果):.php,.jsp
    				
    				注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求;
    				
    				资源的标识机制:URL
    					Uniform Resource Locator:用于描述服务器某特定资源的位置;
    						例如: http;//www.sina.com.cn/index.html
    							Scheme://Server[:Port][/PATH/TO?SOME_RESOURCE]
    		
    		一次完整的http请求处理过程:
    			(1)建立或处理连接:接收请求或拒绝请求;
    			(2)接收请求:结束来自于网络上的主机请求报文中对某特定资源的一次请求的过程;
    			(3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
    			(4)访问资源:获取请求报文中的请求的资源;
    			(5)构建响应报文:
    			(6)发送响应报文:
    			(7)记录日志;
    		
    			接收请求的模型:
    				并发访问响应模型:
    					单进程I/O模型:启动一个进程处理用户请求;这意味着,一次只能处理一个请求,多个请求被串行响应;
    					多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
    					复用的I/O结构:一个进程响应n个请求;
    						多线程模式:一个进程生成n个线程,一个线程处理一个请求;
    						事件驱动(event-driven):一个进程直接n个请求;
    					复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程;
    						响应的请求的数量:m*n
    			
    			处理请求:分析请求报文的http请求报文首部
    				http协议:
    					http请求报文首部
    					http响应报文首部
    				请求报文首部的格式:
    					<method><URL><VERSION>
    					HEADERS:(name:value)
    					<request body>
    			
    			访问资源:获取请求报文中请求的资源
    				web服务器:及存放了web资源的主机,负责向请求者提供对方请求的静态资源或动态资源运行生成的结果;这些资源通常应该放置于本地文件系统某路径下;此路径称为DocRoot;
    					/var/www/html:
    						images/logo.jgp
    						
    						http://www.sanzhang.com/images/logo.jpg
    					
    					web 服务器的资源路径映射方式:
    						(a)docroot
    						(b)alias
    						(c)虚拟主机的docroot
    						(d)用户家目录的docroot
    						
    http请求处理中的连接模式:
    	保持连接(长连接):keep-alive
    		时间:
    		数量:
    	非保持连接(短链接):
    	
    服务器程序:
    	httpd(apache)
    	nginx
    	lighttpd
    	
        应用程序服务器:
        	IIS:.net
        	tomcat:.jsp
        	
        www.netcraft.com
        
        httpd的安装和使用:
        	ASF:apache software foundation
        		httpd:apache
        			a patchy server =apache
        				httpd
        
        httpd的特性:
        	高度模块化:core + modules
        	DSO:dynamic shared object
        	MPM:Multipath processing Modules(多路处理模块)
        	
        		prefork:多进程模型,每个进程响应一个请求;
        			一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
        			n个子进程:每个子进程处理一个请求;
        			工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
        		worker:多进程多线程模型,每线程处理一个用户请求;
        			一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
        			多个子进程:每个子进程负责生成多个线程;
        			每个线程:负责响应用户请求;
        			并发响应数量:m*n
        				m:子进程数量
        				n:每个子进程所能创建的最大线程数量;
        		
        		event:事件驱动模型,多进程模型,每个进程响应多个请求;
        			一个主进程;负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
        			子进程:基于事件驱动机制直接响应多个请求;
    				
    				httpd-2.2:仍为测试使用模型;
    				httpd-2.4:event可生产环境中使用;
    				
    	httpd的程序版本:
    		httpd1.3:官方已经停止维护;
    		httpd 2.0:
    		httpd 2.2:
    		httpd 2.4:目前最新稳定版;
    	
    	httpd的功能特性:
    		CGI:Common Gateway Interface
    		虚拟主机:IP,PORT,FQDN
    		反向代理
    		负载均衡
    		路径别名
    		丰富的用户认证机制
    			basic
    			digest
    		支持第三方模块
    		......
    		
    	安装httpd:
    		rpm包:CentOS发行版中直接提供;
    		编译安装:定制新功能,或其他原因;
    		
    	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.event
    				/usr/sbin/httpd.worker
    			日志文件:
    				/var/log/httpd:
    					access_log:访问日志
    					error_log:错误日志
    			站点文档:
    				/var/www/html:
    			模块文件路径:
    				/usr/lib64/httpd/modules
    				
    			服务控制和启动:
                	chkconfig httpd on|off
                	service {start|stop|restart|status|configtest|reload} httpd
    	
    	CentOS7:httpd-2.4
    		程序环境:
    			配置文件:
    				/etc/httpd/conf/httpd.conf
    				/etc/httpd/conf.d/*.conf
    				模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf
    				systemd unit file:
    					/usr/lib/systemd/system/httpd.service
    				主程序文件:
    					/usr/sbin/httpd
    						httpd-2.4支持MPM的动态切换;
    				日志文件:
    					/var/log/httpd:
    						access_log:访问日志
    						error_log:错误日志
    				站点文档:
    					/var/www/html
    				模块文件路径:
    					/usr/lib64/httpd/modules
    				
    				服务控制:
    					systemctl enable|disable httpd.service
    					systemctl {start|stop|restart|status} httpd.service
    				
    	httpd-2.4的常用配置
    		主配置文件:/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 # 修改/etc/httpd/conf/httpd.conf文件的Listen参数 或如果是监听多个端口,可以在/etc/httpd/conf.d目录中定义一个以.conf结尾的配置文件,添加参数。比如:Listen 8080 ,然后重启httpd服务即可。
    				Listen [IP-address]portnumber [protocol]
    				
    					(1)省略IP标识为0.0.0.0;
    					(2)Listen指令可重复出现多次;
    						Listen 80
    						Listen 8080
    					(3)修改监听socket,重启服务进程方可生效;
    					(4)限制其必须通过ssl通信时,protocol需要定义为https;
    			
    			2.持久连接(保持连接,长连接)
    				Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行;
    					如何断开?
    						数量限制
    						时间限制
    						
    						副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
    						折衷:使用较短的持久连接时长,以及较少的请求数量;
    					#可以在/etc/httpd/conf.modules.d新建一个.conf结尾的文件,添加如下3行,使用httpd -t 检查语法是否错误
    					KeepAlive On | Off
    					KeepAliveTimeout 15
    					MaxKeepAliveRequests 100
    				
    				测试:
    					telnet WEB_SERVER_IP PORT
    					GET /URL HTTP/1.1
    					Host:WEB_SERVER_IP
    					# 连续回车两次
    				
    				注意:httpd-2.4的KeepAliveTimeout可以是毫秒级;
    					KeepAliveTimeout num[ms]
    		3.MPM
    			httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork),httpd.worker,httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的时那个程序文件的方法;
    				ps -aux | grep httpd
    			
    			默认使用的为/usr/sbin/httpd 其为prefork的MPM模块;
    				查看httpd程序的模块列表:
    					查看静态编译的模块:
    						# httpd -l
    					查看静态编译及动态编译的模块:
    						# httpd -M
    			
    			更换使用httpd程序,以支持其它MPM机制;
    				/etc/sysconfig/httpd
    					HTTPD=/usr/sbin/httpd.{worker,event}
    				
    				# service httpd.service restart; watch -n0.5 "ps -aux | grep httpd "
    			
    			注意:重启服务进程方可生效
    			
    			MPM配置:
    				prefork的配置:
    				  <IfModule prefork.c>
                        StartServers	8
                        MinSpareServers	5
                        MaxSpareServers	20
                        ServerLimit		256
                        MaxClients		256
                        MaxRequestsPerChild	4000
    				  </IfModule>
    				
    				worker的配置:
    				  <IfModule worker.c>
                        StartServers	4
                        MinSpareThreads	25
                        MaxSpareThreads	75
                        MaxClients		300
                        MaxRequestsPerChild	0
    				  </IfModule>	
    				
    		对于httpd2.4来说,将prefork和worker的配置添加到/etc/httpd/conf.modules.d/00-mpm.conf文件中,重启httpd服务即可。使用某个模型,可以取消00-mpm.conf中的注释即可。如下图2:
    				
    			PV,UV
                	PV:Page View
                	UV:User View
                	IP:
     
    		4.DSO(dynamic shared object)
    			配置指定实现模块加载
    				LoadModule <mod_name><mod_path>
    				
    				模块文件路径可使用相对路径:
    					相对于ServerRoot(默认/etc/httpd)
    			如果向卸载掉某个模块,可以在/etc/httpd/conf.modules.d中的某个文件中找到这个模块,直接注释掉。然后重启服务即可。
    		5.定义‘Main’ server的文档页面路径
    			ServerName
    				语法格式:ServerName [scheme://]fully-qualified-domain-name[:port]
    			DocumentRoot ""
    			
    			文档路径映射:
    				DocumentRoot指向的路径为URL路径的起始位置
    					其相当于站点URL的根路径;
    						(filesystem)/web/host1/index.html -->(URL)/index.html
    				
    				URL PATH 与FileSystem PATH 不是等同的,而是存在一种映射关系;
    					URL / -->FileSystem /var/www/html
    						/images/logo.jpg --> /var/www/html/images/logo.jpg
    				
    		6.站点访问控制常见机制
    			可基于两种机制指明对哪些资源进行何种访问控制
    				文件系统路径:
    					<Directory "">
    					...
    					</Directory>
    					
    					<File "">
    					...
    					</File>
    					
    					<FileMatch "PATTERN">
    					...
    					</FileMatch>
    				URL路径:
    					<Location "">
    					...
    					</Location>
    					
    					<LocationMatch "PATTERN">
    					...
    					</LocationMatch>
    			<Directory>中"基于源地址"实现访问控制:
    				
    				控制页面资源拒绝所有来源的主机可访问:
                            httpd-2.2
                                (1) AllowOverride
                                    与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
                                        All:
                                        None:
    
                               (2) order 和allow、deny
                                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
    					Options
    					后跟1个或多个以空白字符分割的“选项”列表;
    						Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
    						FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
    						None:
    						All:All options except for MultiViews.
    
                            httpd-2.4
                                基于IP控制: # 如下图3
                                    Require ip IP地址或网络地址
                                    Require not ip IP地址或网络地址
                                基于主机名控制:
                                    Require host 主机名或域名
                                    Require not host 主机名或域名
                              
    		7、定义站点主页面:
    			DirectoryIndex index.html index.html.var
    			
    		8.定义路径别名
    			格式:vim /etc/httpd/conf/httpd.conf
    				Alias /URL/ "/PATH/TO/SOMEDIR/"
    					Alias /images/ "/usr/share/backgrounds/" # 访问images目录下的内容,定位到/usr/share/backgrounds/目录下的内容
    				
    				然后还要对/usr/share/backgrounds/目录做访问控制的授权:
    					vim /etc/httpd/conf/httpd.conf 添加如下:
                            <Directory "/usr/share/backgrounds/">
                                Options Indexes FollowSymLinks
                                AllowOverride None
                                Require all granted
                            </Directory>			
    			
    			DocumentRoot "/www/htdocs"
    				http://www.sanzhang.com/download/bash-4.4.2-3.el6.x86_64.rpm
    				/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
    			
    			Alias /download "rpms/pub"
    				http://www/sanzhang.com/download/bash-4.4.2-3.el6.x86_64.rpm
    					/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
    				
    				http://www.sanzhang.com/images/logo.png
    					/www/htdocs/images/logo.png
    
    		9.设定默认字符集
    			AddDefaultCharset UTF-8
    			中文字符集:GBK,GB2312,GB18030
    		
    		10.日志设定
    			日志类型:访问日志和错误日志
    			错误日志:
    				ErrorLog logs/error_log
    				LogLevel warn
    					Possible values include:debug,info,notice,warn,error,crit,alert,emerg.
    			
    			访问日志:
    				LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent}i"" combined
        			Customlog logs/access_log combined
        			
        			LogFormat format strings:
        				http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
        				
        				%h:客户端IP地址;
        				%l:Remote User,通常为一个减号("-");
        				%u:Remote user(from auth;may be bogus if return status(%s)is 401);非为登录访问时,其为一个减号;
        				%t:服务器收到请求时的时间;
        				%r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;
        				%>s:响应状态码;
        				%b:响应报文的大小,单位是字节;不包括响应报文的http首部;
        				%{Referer}i:请求报文中首部"referer"的值;即从哪个页面中的超链接跳转至当前页面的;
        				%{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;
        	
        	11、基于用户的访问控制:
        		认证质询;
        			www-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
        			
        			认证方式有两种:
        				basic:明文
        				digest:消息摘要认证
        				
        			安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便告知用户认证的原因;
        			
        			用户的账号和密码存放于何处?
        				虚拟账号:仅用于访问某服务时用到的认证标识
        				
        				存储:
        					文本文件;
        					SQL数据库;
        					ldap目录存储;
        				
        				basic认证配置示例:
        					(1)定义安全域
        						<Directory "">
        							Options None
        							AllowOverride None
        							AuthType Basic
        						</Directory>
        						eg:
     								<Directory "/data/web/www/admin">
                                            Options None
                                            AllowOverride None
                                            AuthType Basic
                                            AuthName "Admin Area,plz enter username and password."
                                            AuthUserFile "/etc/httpd/conf.d/.htpasswd"
                                            Require user jerry obama  # 表示仅允许 jerry obama两个用户通过登录认证访问
    									Require valid-user # 表示合法的用户都可以通过登录认证并访问
    								</Directory>
    								
    								允许账号文件中的所有用户登录访问:
    									Require valid-user
    							
    							(2) 提供账号和密码存储(文本文件)
    								使用专用命令完成此类文件的创建即用户管理
    									htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
    										-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
    										-m:md5格式加密
    										-s:sha格式加密
    										-D:删除指定用户
    										-b:基于批模式添加用户
    											htpasswd -b [options] /PATH/TO/HTTPD_PASSWD_FILE username password
    							
    							另外:基于组账号进行认证;
    								(1)定义安全域
    									<Directory "">
    										Options None
    										AllowOverride None
    										AuthType Basic
    										AuthName "String"
    										AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
    										AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
    										Require group grpname1 grpname2...
    									</Directory>
    									
    									eg:
    								 	<Directory "/data/web/www/admin">
                                                Options None
                                                AllowOverride None
                                                AuthType Basic
                                                AuthName "Admin Area,plz enter username and password."
                                                AuthUserFile "/etc/httpd/conf.d/.htpasswd"
                                             	AuthGroupFile "/etc/httpd/conf.d/.htgroup"
    										Require group animals
    									</Directory>
    									
    								 (2)创建用户账号和组账号文件;
    								 	组文件:每一行定义一个组
    								 		GRP_NAME:username1 username2 ...
    								 		
    								 	
    
    		12、虚拟主机
    			站点标识:socket
    				IP相同,但端口不同
    				IP不同,但端口均为默认端口;
    				FQDN不同;
    					请求报文中首部
    					Host:www.sanzhang.com
    			
    			有三种实现方案:
    				基于ip:为每个虚拟主机准备至少一个ip地址;
    				基于port:为每个虚拟主机使用至少一个独立的port;
    				基于FQDN:为每个虚拟主机使用至少一个FQDN;
    			
    			注意(专用于httpd-2.2):一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用“main”主机
    				禁用方法:注释中心主机得DocumentRoot 指令即可;
    			
    			虚拟主机得配置方法:
    				<VirtualHost IP:PORT>
                    	ServerName FQDN
                    	DocumentROot ""
                      </VirtualHost>
                 其它可用指令:
                 	ServerAlias:虚拟主机的别名;可多次使用;
                 	ErrorLog:
                 	CustomLog:
                 	<Directory "">
                 		...
                 	</Directory>
                 	Alias
                 	...
                 	
                      eg:基于IP的虚拟主机示例:ip addr add 192.168.1.100/24
                      	<VirtualHost 192.168.1.7:80>
                      		ServerName www.ilinux.io
                      		DocumentRoot "/data/web/ilinux"
                      		<Directory "/data/web/ilinux">
                      			Options None
                      			AllowOverride None
                      			Require all granted
                      		</Directory>
                      		CustomLog "logs/ilinux_access_log" combined
                      	</VirtualHost>
                      	
                      	<VirtualHost 192.168.1.100:80>
                      		ServerName www.ilinux.io
                      		DocumentRoot "/data/web/ilinux"
                      		<Directory "/data/web/ilinux">
                      			Options None
                      			AllowOverride None
                      			Require all granted
                      		</Directory>
                      		CustomLog "logs/ilinux_access_log" combined
                      	</VirtualHost>
                      	
                      	基于端口的虚拟主机: 
                      		<VirtualHost 192.168.1.7:80>
                      			ServerName www.a.com
                      			DocumentROot "/www.a.com/htdocs"
                      		</VirtualHost>
                      		
                      		<VirtualHost 192.168.1.7:808>
                      			ServerName www.b.org
                      			DocumentRoot "/www/b.org/htdocs"
                      		<VirtualHost>
                      		
                      		<VirtualHost 192.168.1.7:8080>
                      			ServerName www.c.org
                      			DocumentRoot "/www/c.org/htdocs"
                      		<VirtualHost>
                      		
                      	基于FQDN的虚拟主机:
                      		NameVirtualHost 192.168.1.7:80
                      		
                      		<VirtualHost 192.168.1.7:80>
                      			ServerName www.a.com
                      			DocumentRoot "/www/a.com/htdocs"
                      		</VirtualHost>
                      		
                      		<VirtualHost 192.168.1.7:80>
                      			ServerName www.b.net
                      			DocumentRoot "/www/b.net/htdocs"
                      		</VirtualHost>
                      		
                      		<VirtualHost 192.168.1.7:80>
                      			ServerName www.c.net
                      			DocumentRoot "/www/c.net/htdocs"
                      		</VirtualHost>
                      		
                      		注意:如果是httpd-2.2,则使用基于FQDN的虚拟主机时,需要事先使用如下指令:
                      			NameVirtualHost IP:PORT
                      		
    		13、status页面
            	LoadModule status_module modules/mod_status.so
            	
            	httpd-2.2
                    <Location /server-status>
                        SetHandler server-status
                        Order allow,deny
                        Allow from 192.168.1
                    <Location>
    			
    			httpd-2.4
                    <Location /server-status>
                    	SetHandler server-status
                    	<RequireAll>
                    		Require ip 192.168.1
                    	</RequireAll>
                    <Location>			
    

    图1:

    图2:

    图3:

    http协议

    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部分发送;OK
    		301:请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
    		302:与301相似,但在响应报文中通过Location指明资源现在所处临时新位置;Found
    		304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified
    		401:需要输入账号和密码认证方能访问资源:Unauthorized
    		403:请求被禁止;Forbidden
    		404:服务器无法找到客户端请求的资源;Not Found
    		500:服务器内部错误;Internal Server Error
    		502:代理服务器从后端服务器收到了一条伪响应;Bad Gateway
    
    headers:
    	格式:
    		Name:Value
    		
    		Cache-Control:public,max-age=600
    		Connection:keep-alive
    		Content-type:image/png
    		Date:Tue,28 Apr 2018 09:43:54 GMT
    		ETag:"5af34e-ce6-504ea605b2e40"
    		Last-Modified:Wed,08 Oct 2017 14:46:09 GMT
    		
    		Accept:image/webp,*/*;q=0.8
    		Accept-Encoding:gzip,deflate,sdch
    		Accepy-Language:zh-CN,zh;q=0.8
    		Cache-Control:max-age=0
    		Connection:keep-alive
    		Host:access,redhat.com
    		if-Modified-Since:Wed,08 Oct 2017 14:46:09 GMT
    		if-None-Match:"5af34e-ce6-504ea605b2e40"
    		Frefer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html
    		User-Agent:Mozilla/5.0(Windows NT 6.1;WOW64)AppleWebKit/537.36(KHTML,like Gecko) Chrome/41.0.2272.101 Safari/537.36
    		
    	首部的分类:
    		通用首部
    		请求首部
    		响应首部
    		实体首部
    		扩展首部
    		
    		通用首部:
    			Date:报文的创建时间
    			Connection:连接状态,如keep-alive,close
    			Via:显示报文经过的中间节点
    			Cache-Control:控制缓存
    			Pragma:
    		
    		请求首部:
    			Accept:通知服务器自己可接受的媒体类型(MIME,text/html,aplication/javascript,images/jpeg);
    			Accept-Charset:
    			Accept-Encoding:接收编码格式,如gzip、deflate、sdch
    			Accept-Language:接受的语言
    			
    			Client-IP:
    			Host:请求的服务器名称和端口号
    			Rerfer:包含当前正在请求的资源的上一级资源;
    			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:实体真正所处的位置;
    			
    			缓存相关:
    				ETag:实体的扩展标签;
    				Expires:实体的过期时间;
    				Last-Modified:最后一次修改的时间
    

    httpd-2.4的常见配置(2)

    curl命令

    14. 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 is a command line tool for transferring data with URL syntax, supporting FTP, FTPS, HTTP, HTTPS, SCP, SFTP, TFTP, TELNET, DICT, LDAP, LDAPS, FILE, IMAP,SMTP, POP3 and RTSP.  curl supports SSL certificates, HTTP POST, HTTP PUT, FTP uploading, HTTP form based upload, proxies, cookies, user+password authentication (Basic, Digest, NTLM, Negotiate, kerberos...), file transfer resume, proxy tunneling and a busload of other useful tricks.
    
    MIME:major/minor,image/png,image/gif
    
    curl [options][URL...]
    
    curl的常用选项:
    	-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:[password]>设置服务器的用户和密码
    	-0/--http1.0使用HTTP 1.0
    	
    	用法:curl [options][URL...]
    	
    	另一个工具:elinks
    		Elinks is a text-based Web browser. Elinks does not display any images,but it does support frames, tables and most other HTML tags. Elinks' advantage over graphical browsers is its speed--Elinks starts and exits quickly and swiftly displays Web pages.
    		yum info elinks
    		yum install -y elinks
    		
    		elinks [OPTION]...[URL]...
    			elinks http://192.168.1.7  # 进入交互式界面 下图1
    			-dump:不进入交互式模式,而直接将URL的内容输出至标准输出; # 下图2
    

    图1:

    图2:

    15.user/group
    
        指定以哪个用户的身份运行httpd服务进程;
            User apache
            Group apache
    	
    	SUexec
    
    16.使用mod_deflate模块压缩页面优化传输速度 # httpd自带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)
    	DeflateCompressionLevel9
    	
    	# Netscape 4.x has some problems.
    	BrowserMatch ^Mozilla/4 gzip-only-text/html
    	
    	# Netscape 4.06-4.08 have some more problems
    	BrowserMatch ^Moxilla/4.0[678] no-gzip
    	
    	# MSIE masquerades as Netscape,but it is fine
    	BriwserMatch MSI[E] !no-gzip !gzip-only-text/html
    
    	vim /etc/httpd/conf.d/compress.conf
    		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
    
    17.https,http over ssl
        httpd -M | grep ssl # 并未出现ssl模块
        yum info mod_ssl # mod_ssl是一个单独的包,需要单独安装
        yum  install -y mod_ssl
        
        SSL 会话的简化过程
        	(1)客户端发送可供选择的加密方式,并向服务器请求证书;
        	(2)服务器端发送证书以及选定的加密方式给客户端;
        	(3)客户端取得证书并进行证书验证;
        		如果信任给其发证书CA:
        			(a)验证证书来源的合法性;用CA的公钥解密证书上数字签名;
        			(b)验证证书的内容的合法性:完整性验证
        			(c)检查证书的有效期限
        			(d)检查证书是否被吊销;
        			(e)证书中拥有者的名字,与访问的目标主机要一致;
        	(4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
        	(5)服务用此密钥加密用户请求的资源,响应给客户端;
        	注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;
    	
    	回顾几个术语:PKI,CA,CRL,X.509(v1,v2,v3)
    	
    	配置httpd支持https:
    		(1)为服务器申请数字证书;
    			测试:通过私建CA法证书
    				(a)创建私有CA
    				(b)在服务器创建证书签署请求
    				(c)CA签证
    		(2)配置httpd支持使用ssl,及使用的证书;
    			# yum -y install mod_ssl
    			
    			配置文件:/etc/httpd/conf.d/ssl.conf
    				DocumentRoot
    				ServerName
    				SSLCertificateFile
    				SSLCertificateKeyFile
    		(3)测试基于https访问相应的主机;
    			# openssl s_client [-connect host:port][-cert filename][-CApath directory][-CAfile filename]
    	
    18、httpd自带的工具程序
    	htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具;
    	apachectl:httpd自带的服务控制脚本,支持start和stop;
    	apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具;
    	rotatelogs:日志滚动工具;
    		access.log-->
    			access.log,access.1.log-->
    				access.log,access.1.log,access.2.log
    	suexec:访问某些由特殊权限配置的资源时,临时切换至指定用户身份运行;
    	ab:apache bench
    
    19、httpd的压力测试工具
    	ab,webbench,http_load,seige
    	jmeter,loadrunner
    	
    	tcpcopy:网易,复制生产环境中的真实请求,并将之保存下来;
    	
    	ab [OPTIONS] URL
    		-n:总请求数;
    		-c:模拟的并行数
    		-k:以持久连接模式测试;
    		
    		yum install -y httpd-tools
    		ab -n 100000 -c 100 http://192.168.1.7/messages.html
    

    httpd2.4新特性

    (1)MPM支持运行为DSO机制;以模块形式按需加载;
    (2) event MPM生产环境可用;
    (3) 异步读写机制;
    (4)支持每模块及每目录的单独日志级别定义
    (5)每请求相关的准用配置;
    (6)增强版的表达式分析式;
    (7)毫秒级持久连接时长定义;
    (8)基于FQDN的虚拟主机也不再需要NameVirtualHost指令;
    (9)新指令,AllowOverrideList;
    (10)支持用户自定义变量;
    (11)耕地的内存消耗;
    
    新模块:
    	(1)mod_proxy_fcgi
    	(2)mod_proxy_scgi
    	(3)mod_remoteip
    
    安装http-2.4
    	CentOS7:
    		# yum install httpd
    		
    		配置文件:
    			/etc/httpd/conf/httpd.conf
    			/etc/httpd/conf.modules.d/*.conf
    			/etc/httpd/conf.d/*.conf
    		
    		配置应用:
    			(1)切换使用的MPM
    				编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf,启用要启用的MPM相关的LoadModule指令即可。
                  (2)基于IP的访问控制
                  	允许所有主机访问:Require all granted
                  	拒绝所有主机访问:Require all deny
                  	
                  	控制特定的IP访问:
                  		Require ip IPADDR:授权指定来源的IP访问;
                  		Require not host HOSTNAME:拒绝
                  		
                  		HOSTNAME:
                  			FQDN:特定主机
                  			domin.tld:指定域名下所有主机
                  	
                  	<RequireAll>
                  		Require all granted
                  		Require not ip 172.16.100.2
                  	</RequireAll>
                  (3)虚拟主机
                  		基于FQDN的虚拟主机也不再需要NameVurtualHost指令;
                  			<VirtualHost*:80>
                  				ServerName www.b.net
                  				DocumentRoot "/apps/b.net/htdocs"
                  				<Directory  "/apps/b.net/htdocs">
                  					Options None
                  					AllowOverride None
                  					Require all granted
                  				</Directory>
                  			</VirtualHost>
                  			
                  			注意:任意目录下的页面只有显式授权才能被访问;
                (4) ssl
                (5) KeepAliveTimeout #ms
                	毫秒级持久连接时长定义;
                	
                  					
    

    练习题

    分别使用httpd-2.2和httpd-2.4实现;
    1.建立httpd服务,要求:
    	(1)提供两个基于名称的虚拟主机:
    		www1.stux.com,页面文件目录为/wev/vhosts/www1;错误日志为/var/log/httpd/www1/error_log,访问日志为/var/log/httpd/www1/access_log;
    		www2.stux.com,页面文件目录为/wev/vhosts/www2;错误日志为/var/log/httpd/www2/error_log,访问日志为/var/log/httpd/www2/access_log;
    		
    	(2)通过www1.stux.com/server-status输出其状态信息,且要求只允许提供账号的用户访问;
    	(3)www1不允许192.168.1.0/24网络中的主机访问;
    
    2.为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
    	(1)要求使用证书认证,证书中要求使用国家(CN),州(ShangHai),城市(ShangHai),组织为(sanzhang);
    	(2)设置部门为Ops,主机名为www2.stux.com;
    
  • 相关阅读:
    立即执行函数
    函数 闭包
    函数 预编译
    函数
    函数
    变量作用域
    保留字
    JavaScript 中的 算术运算
    图片上传效果
    HTML标签,元素类型 概览
  • 原文地址:https://www.cnblogs.com/zhangchaocoming/p/14892563.html
Copyright © 2020-2023  润新知