Http协议及其实现httpd

1、端口号分配规则

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:IPv4 Address Family,AF_INET6:ipv6 Address Family,AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址,Unix_SOCK。

2、TCP

(1)TCP的有限状态机: CLOSED,LISTEN,SYN_SENT,SYN_RECV,ESTABLISHED,FIN_WAIT1,CLOSE_WAIT,FIN_WAIT2,LAST_ACK,TIMEWAIT,CLOSED。
(2)TCP协议的特性:
建立连接:三次握手;
将数据打包成段:校验和(CRC32);
确认、重传及超时;
排序:逻辑序号;
流量控制:滑动窗口算法;
拥塞控制:慢启动和拥塞避免算法;

3、HTTP

(1)术语
http:hyper text transfer protocol,超文本传输协议,应用层协议,监听于TCP的80端口,是一种文本协议;
html:hyper text mark language,超文本标记语言。
css:Cascading Style Sheet,级联样式表;
js:JavaScript,一种客户端脚本。
(2)协议版本
http/0.9:原型版本,功能简陋;
http/1.0:在http/0.9的基础上增加了cache,MIME和method。
MIME:Multipurpose Internet Mail Extesion,多用途因特网邮件扩展;
method:GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS;
http/1.1:增强了缓存功能;
(3)工作模式
http请求报文:http request,http响应报文:http response,一次http事务:一次请求响应过程。
web资源(web resource):
静态资源(无须服务端做出额外处理):.jpg,.png,.gif,.html,.txt,.js,.css,.mp3,.avi;
动态资源(服务端需要通过执行程序做出处理,发送给客户端的是程序的运行结果):.php,.jsp
一个页面中展示的资源可能有多个,每个资源都需要单独请求。
资源的标识机制URL(Uniform Resource Locator):用于描述服务器某特定资源的位置,格式:Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE],例如: http://www.sina.com.cn/index.html
(4)一次完整的http请求处理过程
1)建立或处理连接:接收请求或拒绝请求;
2)接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程;
3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
4)访问资源:获取请求报文中请求的资源;
5)构建响应报文;
6)发送响应报文;
7)记录日志。

接收请求的模型:并发访问响应模型
1)单进程I/O模型:启动一个进程处理用户请求,这意味着,一次只能处理一个请求,多个请求被串行响应;
2)多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
3)复用的I/O结构:一个进程响应n个请求;
4)多线程模式:一个进程生成n个线程,一个线程处理一个请求;
5)事件驱动(event-driven):一个进程直接响应n个请求;
6)复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程,响应的请求的数量:m*n。

处理请求:分析请求报文的http请求报文首部。
http协议分为http请求报文首部和http响应报文首部。
请求报文首部的格式:

<method> <URL> <VERSION>
HEADERS: (name: value)
<request body>

访问资源:获取请求报文中请求的资源。
web服务器,即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果,这些资源通常应该放置于本地文件系统某路径下,此路径称为DocRoot;例如,DocRoot为/var/www/html/,而/var/www/html/下有文件images/logo.jgp,URL则为:http://www.magedu.com/images/logo.jpg。
web服务器的资源路径映射方式:
(a) docroot
(b) alias
© 虚拟主机的docroot
(d) 用户家目录的docroot

http请求处理中的连接模式:
保持连接(长连接)(keep-alive,在请求的时间和数量上控制连接时长)和非保持连接(短连接)。
(5)报文语法格式
request报文:

<method> <request-URL> <version>
<headers>

<entity-body>

response报文:

<version> <status> <reason-phrase>
<headers>

<entity-body>

method:请求方法,标明客户端希望服务器对资源执行的动作:GET、HEAD、POST;
version:HTTP/.
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部分发送;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 2015 01:43:54 GMT
ETag:"5af34e-ce6-504ea605b2e40"
Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT

Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-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 2014 14:46:09 GMT
If-None-Match:"5af34e-ce6-504ea605b2e40"
Referer: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

首部的分类:
通用首部,请求首部,响应首部,实体首部,扩展首部;
1)通用首部:
Date:报文的创建时间;
Connection:连接状态,如keep-alive,close;
Via:显示报文经过的中间节点;
Cache-Control:控制缓存;
Pragma:参数;
2)请求首部:
Accept:通过服务器自己可接受的媒体类型;
Accept-Charset:接受的字符集;
Accept-Encoding:接受编码格式,如gzip;
Accept-Language:接受的语言;
Client-IP:客户端IP;
Host:请求的服务器名称和端口号;
Referer:包含当前正在请求的资源的上一级资源;
User-Agent:客户端代理;
条件式请求首部:
Expect:期望值;
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改;
If-Unmodified-Since:自从指定的时间之后,请求的资源是否未发生过修改;
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配;
If-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag匹配;
安全请求首部:
Authorization:向服务器发送认证信息,如账号和密码;
Cookie: 客户端向服务器发送cookie;
Cookie2:cookie第二版;
代理请求首部:
Proxy-Authorization:向代理服务器认证;
3)响应首部:
信息性:Age:响应持续时长,Server:服务器程序软件名称和版本;
协商首部:某资源有多种表示方法时使用;
Accept-Ranges:服务器可接受的请求范围类型;
Vary:服务器查看的其它首部列表;
安全响应首部:
Set-Cookie:向客户端设置cookie;
Set-Cookie2:向客户端设置cookie2;
WWW-Authenticate:来自服务器的对客户端的质询认证表单;
4)实体首部:
Allow:列出对此实体可使用的请求方法;
Location:告诉客户端真正的实体位于何处;
Content-Encoding:内容的编码格式;
Content-Language:内容的语言;
Content-Length:主体的长度;
Content-Location:实体真正所处位置;
Content-Type:主体的对象类型;
5)缓存相关:
ETag:实体的扩展标签;
Expires:实体的过期时间;
Last-Modified:最后一次修改的时间;

4、httpd

(1)http的服务器程序有:httpd (apache)、nginx、lighttpd;
http的应用程序服务器:IIS(.Net应用)、tomcat(.jsp应用);
httpd是ASF(apache software foundation)的顶级项目,apache(a patchy server)。
(2)httpd的特性
高度模块化: core + modules;
DSO:dynamic shared object;
MPM:Multipath processing Modules(多路处理模块);
prefork:多进程模型,每个进程响应一个请求;一个主进程:负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理;n个子进程:每个子进程处理一个请求;工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求,存在最大空闲进程数和最小空闲进程数。
worker:多进程多线程模型,每线程处理一个用户请求;一个主进程:负责生成子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理;多个子进程:每个子进程负责生成多个线程;每个线程:负责响应用户请求;并发响应数量:m* n;m:子进程数量,n:每个子进程所能创建的最大线程数量。
event:事件驱动模型,多进程模型,每个进程响应多个请求;一个主进程 :负责生成子进程,负责创建套接字,负责接收请求,并将其派发给某子进程进行处理;子进程:基于事件驱动机制直接响应多个请求。event模型在httpd-2.2中仍为测试使用模型,而在httpd-2.4中,event可用于生产环境中。
(3)httpd的程序版本
httpd 1.3:官方已经停止维护;
httpd 2.0;
httpd 2.2:用于CentOS 6系统中;
httpd 2.4:用于CentOS 7系统中,是目前的最新稳定版。
(4)httpd的功能特性
支持CGI(Common Gateway Interface);虚拟主机(IP方式,PORT方式, FQDN方式);
反向代理;负载均衡;路径别名;丰富的用户认证机制(basic认证和digest认证),还支持第三方模块。
(5)安装httpd
rpm包:CentOS 发行版中直接提供;
编译安装:定制新功能,或其它原因;
(6)配置文件
1)httpd-2.2
程序环境:CentOS 6
配置文件:/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
2)httpd-2.4
程序环境:CentOS 7
配置文件:/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
(7)httpd-2.2的常用配置
主配置文件:/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
(a) 省略IP表示为0.0.0.0;
(b) Listen指令可重复出现多次:Listen 80,Listen 8080;
© 修改监听socket,重启服务进程方可生效;
(8)持久连接
Persistent Connection:TCP连接建立后,每个资源获取完成后不会断开连接,而是继续等待其它资源请求的进行; 通过数量限制和时间限制控制连接时长。
副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;折衷办法:使用较短的持久连接时长,以及较少的请求数量。

KeepAlive  On|Off
KeepAliveTimeout  15
MaxKeepAliveRequests  100

测试:

telnet  WEB_SERVER_IP  PORT
GET  /URL  HTTP/1.1
Host: WEB_SERVER_IP

(9)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}
注意:重启服务进程方可生效。
MPM配置:
1)prefork的配置

<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      256
MaxClients       256
MaxRequestsPerChild  4000
</IfModule>		

2)worker的配置

<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>	

(10)DSO
配置指定实现模块加载:LoadModule <mod_name> <mod_path>
模块文件路径可使用相对路径,相对于ServerRoot(默认/etc/httpd)。
(11)定义’Main’ server的文档页面路径
DocumentRoot ""
文档路径映射:DoucmentRoot指向的路径为URL路径的起始位置,其相当于站点URL的根路径;
(FileSystem) /web/host1/index.html --> (URL) /index.html
(12)站点访问控制常见机制
可基于两种机制指明对哪些资源进行何种访问控制:
1)文件系统路径

<Directory  "">
...
</Directory>
						
<File  "">
...
</File>
						
<FileMatch  "PATTERN">
...
</FileMatch>

2)URL路径

<Location  "">
...
</Location>
						
<LocationMatch "">
...
</LocationMatch>

中“基于源地址”实现访问控制:
(a) Options
后跟1个或多个以空白字符分隔的“选项”列表;
Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
None:没有选项;
All:全部选项;
(b) AllowOverride
与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
All:所有指令;
None:没有指令;
© 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几种形式。
(13)定义站点主页面:
DirectoryIndex index.html index.html.var
(14)定义路径别名
格式:Alias /URL/ "/PATH/TO/SOMEDIR/"
例:

DocumentRoot "/www/htdocs"
http://www.magedu.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.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 
/rpms/pub/bash-4.4.2-3.el6.x86_64.rpm

(15)设定默认字符集
AddDefaultCharset UTF-8
中文字符集:GBK, GB2312, GB18030
(16)日志设定
日志类型:访问日志和错误日志。
错误日志:

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”的值;即发出请求的应用程序;
(17)基于用户的访问控制
认证质询:www-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
认证方式有两种:basic明文认证和digest消息摘要认证。
安全域:需要用户认证后方能访问的路径,应该通过名称对其进行标识,以便于告知用户认证的原因;
用户的账号和密码存放于何处?文本文件、SQL数据库,或ldap目录存储;
虚拟账号:仅用于访问某服务时用到的认证标识。
1)basic认证配置示例
(a) 定义安全域

<Directory "">
	Options None
	AllowOverride None
	AuthType Basic
	AuthName "String“
	AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
	Require  user  username1  username2 ...
</Directory>

允许账号文件中的所有用户登录访问:Require valid-user
(b) 提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建及用户管理:
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
-m:md5格式加密;
-s:sha格式加密;
-D:删除指定用户;

2)基于组账号进行认证
(a) 定义安全域

<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>

(b) 创建用户账号和组账号文件;
组文件中每一行定义一个组:GRP_NAME: username1 username2 ...
(18)虚拟主机
站点标识: socket
1)IP相同,但端口不同;
2)IP不同,但端口均为默认端口;
3)FQDN不同;
有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机使用至少一个独立的port;
基于FQDN:为每个虚拟主机使用至少一个FQDN;
注意:一般虚拟主机不要与中心主机混用。因此,要使用虚拟主机,得先禁用’main’主机,禁用方法:注释中心主机的DocumentRoot指令即可。
1)虚拟主机的配置方法:

<VirtualHost  IP:PORT>
	ServerName FQDN
	DocumentRoot  ""
</VirtualHost>

2)其它可用指令
ServerAlias:虚拟主机的别名,可多次使用;
ErrorLog;
CustomLog;
<Directory “”>

</ Directory>
Alias
3)基于IP的虚拟主机

<VirtualHost 172.16.100.6:80>
	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.7:80>
	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.8:80>
	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"
</VirtualHost>

4)基于端口的虚拟主机

<VirtualHost 172.16.100.6:80>
	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:808>
	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:8080>
	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"
</VirtualHost>

5)基于FQDN的虚拟主机

NameVirtualHost 172.16.100.6:80

<VirtualHost 172.16.100.6:80>
	ServerName www.a.com
	DocumentRoot "/www/a.com/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
	ServerName www.b.net
	DocumentRoot "/www/b.net/htdocs"
</VirtualHost>

<VirtualHost 172.16.100.6:80>
	ServerName www.c.org
	DocumentRoot "/www/c.org/htdocs"
</VirtualHost>						

(19)status页面
LoadModule status_module modules/mod_status.so

<Location /server-status>
	SetHandler server-status
	Order allow,deny
	Allow from 172.16
</Location>

5、URL

基本语法:<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数,例如:http://www.magedu.com/bbs/hello;gender=f;
query:查询条件,例如:http://www.magedu.com/bbs/item.php?username=tom&title=abc
frag:位置锚定,例如:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86

6、常用命令

(1)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服务器等等,功能十分强大。
MIME: major/minor,image/png,image/gif。
curl [options] [URL...]
curl的常用选项:
-A/–user-agent :设置用户代理发送给服务器;
–basic:使用HTTP基本认证;
–tcp-nodelay:使用TCP_NODELAY选项;
-e/–referer :来源网址;
–cacert :CA证书 (SSL);
–compressed:要求返回是压缩的格式;
-H/–header :自定义首部信息传递给服务器;
-I/–head:只显示响应报文首部信息;
–limit-rate :设置传输速度;
-u/–user <user[:password]>:设置服务器的用户和密码;
-0/–http1.0:使用HTTP 1.0;
(2)elinks
elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
(3)user/group
指定以哪个用户的身份运行httpd服务进程;
User apache
Group apache
(4)使用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)
DeflateCompressionLevel 9
	 
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4  gzip-only-text/html
 
# Netscape 4.06-4.08 have some more problems
BrowserMatch  ^Mozilla/4\.0[678]  no-gzip

# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E]  !no-gzip !gzip-only-text/html

(5)httpd自带的工具程序
htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具;
apachectl:httpd自带的服务控制脚本,支持start和stop;
apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具;
rotatelogs:日志滚动工具;
access.log -->
access.log, access.1.log -->
access.log, acccess.1.log, access.2.log
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行;
ab: apache bench;
(6)httpd的压力测试工具
ab,webbench,http_load,seige,jmeter,loadrunner;
tcpcopy:网易开发,复制生产环境中的真实请求,并将之保存下来;
ab [OPTIONS] URL
-n:总请求数;
-c:模拟的并行数;
-k:以持久连接模式测试;

7、httpd-2.4

(1)新特性
1)MPM支持运行为DSO机制,以模块形式按需加载;
2)event MPM生产环境可用;
3)异步读写机制;
4)支持每模块及每目录的单独日志级别定义;
5)每请求相关的专用配置;
6)增强版的表达式分析器;
7)毫秒级持久连接时长定义;
8)基于FQDN的虚拟主机也不再需要NameVirutalHost指令;
9)新指令,AllowOverrideList;
10)支持用户自定义变量;
11)更低的内存消耗;
(2)新模块
1)mod_proxy_fcgi;
2)mod_proxy_scgi;
3)mod_remoteip;
(3)安装httpd-2.4
依赖于:apr-1.4+, apr-util-1.4+, [apr-iconv];
apr: apache portable runtime;
1)CentOS 6:
默认:apr-1.3.9, apr-util-1.3.9
开发环境包组:Development Tools, Server Platform Development;
开发程序包:pcre-devel;
编译安装步骤:
(a) apr-1.4+
# ./configure --prefix=/usr/local/apr
# make && make install
(b) apr-util-1.4+
# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
# make && make install
© httpd-2.4
# ./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
# make && make install
自带的服务控制脚本:apachectl
2) CentOS 7:
# yum install httpd
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.modules.d/.conf
/etc/httpd/conf.d/
.conf
配置应用:
(a) 切换使用的MPM
编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf,启用要启用的MPM相关的LoadModule指令即可。
(b) 基于IP的访问控制
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
© 控制特定的IP访问
Require ip IPADDR:授权指定来源的IP访问;
Require not ip IPADDR:拒绝;
(d) 控制特定的主机访问:
Require host HOSTNAME:授权指定来源的主机访问;
Require not host HOSTNAME:拒绝指定来源的主机访问;
HOSTNAME:主机名;
FQDN:特定主机
domin.tld:指定域名下的所有主机

<RequireAll>
	Require all granted
	Require not ip 172.16.100.2
</RequireAll>						

(4)虚拟主机
基于FQDN的虚拟主机也不再需要NameVirutalHost指令;

<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>	

注意:任意目录下的页面只有显式授权才能被访问;
(5)毫秒级持久连接时长定义:KeepAliveTimeout #ms

8、HTTPS

https = http over ssl;
(1)SSL会话的简化过程
1)客户端发送可供选择的加密方式,并向服务器请求证书;
2)服务器端发送证书以及选定的加密方式给客户端;
3)客户端取得证书并进行证书验证:
如果信任给其发证书的CA:
(a) 验证证书来源的合法性;用CA的公钥解密证书上数字签名;
(b) 验证证书的内容的合法性:完整性验证;
© 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机要一致;
4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
5)服务器端用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建,所以单IP的主机上,仅可以使用一个https虚拟主机;
(2)配置httpd支持https
1)为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA;
(b) 在服务器创建证书签署请求;
© 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]

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页