一、http协议
1、http协议的版本:
http/0.9: 诞生于1991,仅用于传输html文档,不能包含图片
http/1.0: 引入了MIME,支持多媒体数据的处理,keep-alive(保持连接),有缓存功能
http/1.1: 支持更多的请求方法,更精细的缓存控制,持久连接
http/1.0和http/1.1之所以能够传输多媒体数据,是因为引入了MIME
MIME: Multipurpose Internet Mail Extension
MIME引入了base64的编码机制,能够实现将二进制数据编码成文本发送,并能够让接收方还原回原来的格式;
2、HTTP报文:
HTTP事务:一次请求以及与其对应的响应
HTTP资源请求的方法:GET、PUT、HEAD(只发报文首部响应就可以,你有没有告诉我一声)、POST、DELETE
1)HTTP请求:request
HTTP请求报文
报文格式:
<method> <request-URL> <version>起始行,请求行
<headers>(名称+值)
<entity-body> 实体 (两次回车加一个空白行到这里)
2)HTTP响应:response
HTTP响应报文
报文格式:
<version> <status> <reason-phrase> 起始行,响应行
<headers>
<entity-body>
<method>: 请求方法, 希望服务器端执行的动作,如GET、HEAD、POST等
<request-url>: 请求的资源,可以是相对路径,也是完整的URL
<version>:协议版本,格式HTTP/<major>.<minor>,如http/1.0
<headers>:HTTP首部
<status>: 状态码
<reason-phrase>:原因短语,数字状态码易读信息
<entity-body>: 主体部分
HTTP请求方法:
GET:请求获取一个资源,需要服务器发送
HEAD:跟GET相似,但其不需要服务发送资源而仅传回响应首部;
POST:支持HTML表单提交,表单中有用户填入的数据,这些数据会发送到服务器端,由服务器存储至某位置(例如发送处理程序)
PUT:与GET相反,向服务写入文档;例如发布系统
DELETE:请求删除URL指向的资源
OPTIONS:探测服务器端对某资源所支持的请求方法
TRACE:跟踪请求要经过的防火墙、代理或网关等
扩展方法:LOCK、MKCOL、COPY、MOVE
3)HTTP协议:是一种stateless(无状态)协议
一次HTTP事务结束后,连接即行断开,所以效率会低很多,因此为了提高效率,要为http提供加速方式
(1)并行请求:多线程,但第一次是单线程的,只请求一个资源
(2)持久连接(保持连接):三次握手连接后不断开,直到最后一个请求结束后,再一次一次性断开。
但这样,持久连接也会有缺陷了,如果一个用户接进来以后,连接时间过长,这势必会造成资源被占用,所以也要有解决方法:
①:设定超时时长
②:限制最大资源请求
4)HTTP状态码:
1xx: 信息性状态码
2xx:成功状态码
200: OK
201: Created,接受并保存
3xx:重定向状态码
301:Moved Permanently, 永久重定向。在响应报文中使用首部“Location: URL”指定资源现在所处的位置;
302:Found,临时重定向,本资源有,但暂时不在本地。在响应报文中使用首部“Location: URL”指定临时资源位置;
304:Not Modified,没修改这个资源,就可以使用缓存了。条件式请求中使用;
4xx:客户端类的错误 ,例如服务器端资源不存在
403:Forbidden,请求被服务器拒绝,原因可能是没有权限
404:Not Found,服务器无法找到请求的URL
405:Method Not Allowed,不允许使用此方法请求相应的URL
5xx:服务器类的错误
500:Internal Server Error,服务器内部错误;如服务器端脚本无权限执行
502:Bad Gateway,代理服务器从上游收到了一条伪响应;
503:Service Unavailable,服务器此时无法提供服务,但将来可能可用;
5)HTTP首部:
(1)通用首部:请求和响应都可以使用的;
Connection:定义C/S之间关于请求/响应的有关选项
对于http/1.0, Connection: keep-alive
Via: 显示了报文经过的中间节点,意思就是找谁代理的
Cache-Control:缓存控制、缓存指示,能不能缓存,能缓存多久,在http/1.1中比较长见
Pragma
(2)请求首部:
Client-IP:
下四层的请求都是由内核处理的(内核空间),上面的就是用户空间了
Host: 请求的主机名和端口号,虚拟主机环境下用于不同的虚拟主机
Referer:指明了请求当前资源的原始资源的URL
User-Agent: 用户代理,使用什么工具发出的请求。爬虫也是一种用户代理
①、Accept首部:用户标明客户自己更倾向于支持的能力
Accept: 指明服务器能发送的媒体类型(有主类型和子类型)
Accept-Charset: 支持使用的字符集
Accept-Encoding: 支持使用的编码方式
Accept-Language: 支持使用语言
②、条件请求首部:
Expect:
If-Modified-Since: 是否在指定时间以来修改过此资源,如果改过,就发状态码,再发送资源
If-None-Match
跟安全相关的请求首部:
Authorization: 客户端提交给服务端的认证数据,如帐号和密码
Cookie: 客户端发送给服务器端身份标识。session是服务器端的,session是靠cookie去实现的
Cookie2
(3)响应首部:
Age:
Server: 向客户端标明服务器程序名称和版本
①、协商首部:
Accept-Ranges: 对当前资源来讲,服务器所能够接受的范围类型
Vary: 首部列表,服务器会根据列表中的内容挑选出最适合的版本发送给客户端。比如,比较繁忙的服务器会把资源经过压缩以后再发送给客户端,但客户端上有些低版本的浏览器不支持压缩格式,所以在服务器端会提供多种版本
②、跟安全相关的响应首部:
Set-Cookie: 服务器端在某客户端第一次请求时发给令牌
Set-Cookie2:
WWW-Authentication: 质询,即要求客户提供帐号和密码
(4)实体首部:用于指定实体属性
Location: 资源的新位置
Allow: 允许对此资源使用的请求方法
①、内容首部:
Content-Encoding
Content-Language
Content-Length
Content-Location
Content-Range
Content-Type
②、缓存首部:
ETag: 实体标签
Expires: 过期期限
Last-Modified: 上一次的修改时间
二、httpd功能特性介绍
httpd俗称apache,是目前市场份额最高的网络服务,它是高度模块化的,它的模块不但可以在编译时选择,而且在选择完成以后,这个模块到底启不启用也可以定义。
core + modules
DSO模块: Dynamic Shared Object
MPM: Multipath Processing Module,多道处理模块,非一个模块,而是对一种特性的称谓
prefork:
一个进程一个请求,预先forck好多个,prefork是基于事件分离器来工作的,而select的文件数最大不能超过1024个,也就是说prefork最多能处理1024个进程
worker:
一个进程多个线程,一个线程一个请求
event:
一个线程响应多个请求。event是基于事件驱动(event-driven)的,主要目的在于实现单线程响应多个请求;
1)监听套接字
Listen [IP:]port
此指令可以出现多次, 用于指定监听多个不同的套接字:
Listen 80
Listen 172.16.251.93:8080
2)配置使用keep alive
KeepAlive {On|Off}
KeepAliveTimeout 2
MaxKeepAliveRequests 50
3)MPM
<IfModule prefork.c>
StartServers: 默认启动的工作进程数;
MinSpareServers: 最少空闲进程数;
MaxSpareServers: 最大空闲进程数;
ServerLimit: 最大活动进程数;
MaxClients: 并发请求的最大数;
MaxRequestsPerChild: 每个子进程在生命周期内所能够服务的最多请求个数;
</IfModule>
<IfModule worker.c>
StartServers:启动的子进程的个数
MaxClients: 并发请求的最大数;
MinSpareThreads:最小空闲线程数;
MaxSpareThreads:最大空闲线程数;
ThreadsPerChild:每个子进程可生成的线程数;
MaxRequestsPerChild:每个子进程在生命周期内所能够服务的最多请求个数,0表示不限定;
</IfModule>
4)DSO模块加载方式
LoadModule module_name /path/to/module
如果使用相对路径,则对于ServerRoot所定义的位置而言;例如:
LoadModule php5_module /usr/lib64/httpd/modules/php5.so
让服务重载配置文件方能生效;
httpd -M: 列出已经装载的所有DSO及非DSO模块
httpd -l: 列出支持使用的非DSO模块
5)配置站点根目录
DocumentRoot /path/to/somewhere
6)配置页面访问属性
<Direcotry "/path/to/somewhere">
Options:
Indexes: 缺少指定的默认页面时,允许将目录中的所有文件以列表形式返回给用户;危险;
FollowSymLinks: 允许跟随符号链接所指向的原始文件;
None: 所有都启用;
All: 所有都启用;
ExecCGI: 允许使用mod_cgi模块执行CGI脚本;
Includes: 允许使用mod_include模块实现服务器端包含(SSI);
MultiViews:允许使用mod_negotiation实现内容协商;
SymLinksIfOwnerMatch:在链接文件属主属组与原始文件的属主属组相同时,允许跟随符号链接所指向的原始文件;
<Directory>
7)基于主机的访问控制
<Direcotry "/path/to/somewhere">
Options
AllowOverride None
Order Deny,Allow
Allow
Deny
<Directory>
二者都匹配或二者都无匹配项时,则以后者为准;否则,则以匹配到的为准;
Allow from
Deny from
IP, Network Address
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8)配置日志功能
/var/log/httpd/
access.log: 访问日志,其需要记录的内容需要自定义
error.log: 错误日志
访问日志:
CustomLog "/path/to/access_log_file" Format_Name
LogFormat Format_String Format_Name
%h: 客户端地址
%l: 远程登录名,通常为-
%u: 认证时的远程用户名,没有认证时为-
%t: 收到请求时的时间;
%r: 请求报文的起始行;
%>s: 响应状态码;
%b: 响应报文的长度,单位为字节
%{Header_Name}i: 记录指定请求报文首部的内容(value);
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
错误日志:
ErrorLog
9)路径别名
Alias /alias/ "/path/to/somewhere"
意味着访问http://Server_IP/alias/时,其页面文件来自于/path/to/somewhere这个位置;
10)设定默认字符集
AddDefaultCharset
11)基于用户的访问控制
虚拟用户:
文件:/etc/httpd/conf/.htpasswd
SQL数据库:
dbm:
ldap
认证类型(auth):
basic: 基本认证,帐号和密码明文发送;
digest:摘要认证,hash编程之后发送;
认证提供者(authentication provider):帐号和密码的存放位置
authn
授权机制(authorization):根据什么进行授权
(1) 编辑配置文件,为需要认证的目录配置认证机制
<Directory "/www/htdocs/fin">
Options None
AllowOverride AuthConfig
AuthType Basic
AuthName "Private Area"
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
(2) 使用htpasswd命令生成认证库
htpasswd
-c: 创建文件,创建第一个用户时使用
-m: 密码基于MD5编码存储
(3) 如果要基于组进行认证
<Directory "/www/htdocs/fin">
Options None
AllowOverride AuthConfig
AuthType Basic
AuthName "Private Area"
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GroupName
</Directory>
组文件:
组名: 用户1 用户2 用户3
12)虚拟主机
一个物理服务器提供多个站点; 使用虚拟主机得先取消中心主机
Web: Socket(IP, port)
基于不同的IP实现不同的虚拟主机
变化IP
基于不同的port实现不同的虚拟主机
变化port
基于不同的FQDN实现不同的虚拟主机
变化ServerName的值
NameVirtualHost *:80
<virtualhost IP:port>
ServerName
DocumentRoot ""
<Directory "">
Options
</Directory>
ServerAlias
ServerAdmin
</virtualhost>
虚拟主机的单独配置:
用户认证
访问日志
错误日志
别名
脚本别名
13)服务器status页面
内生的status信息,且此信息可以通过web预以显示
配置文件系统路径访问属性
<Directory [~] "">
</Directory>
<File [~] "">
</File>
配置URL访问属性
<Location [~] "">
</Location>
<LocationMatch "">
</LocationMatch>
如果某要配置其属性的URL能映射到某具体文件系统路径,建议使用<Directory>;
处理器:是当文件被调用时,Apache内部表示形式;一般每种文件类型都有其隐式处理器;
显式的定义使用的处理器 SetHandler
<Location /URL>
SetHandler server-status
</Location>
定义访问控制机制
基于IP控制
基于用户控制
示例:
<Location /server-status>
SetHandler server-status
AuthType Basic
AuthName "Server Status"
AuthUserFile "/etc/httpd/conf/.htpasswd"
Require valid-user
Order deny,allow
Allow from all
</Location>
原文:http://songoo.blog.51cto.com/8620619/1416750