HTTP:hyper text transfer protocol,80/tcp 超文本传输协议
http协议版本:
HTTP/0.9:原型版本,功能简陋。仅能实现简单的资源交互,不支持多媒体内容。
HTTP/1.0:第一个广泛使用的版本,支持MIME,从而支持多媒体,但缓存机制设计仍然简陋和薄弱
HTTP/1.1:增强了缓存功能
HTTP/2.0:
http是基于tcp完成的协议
一次完整的http请求处理过程:
(1)建立或处理连接,接收请求或拒绝请求
(2)接收请求,接收来自于网络的请求报文中对某一资源的一次请求的过程
(3)处理请求,对请求报文进行解析,并获取请求的资源及请求方法等相关信息
(4)访问资源,获取请求报文中请求的资源
(5)构建响应报文,一旦web服务器找到资源,而且这个资源也允许被某个客户端访问,这个
时候它就要能够拿到这个资源,把它封装成一个响应报文,并指明这个资源内部的内容格式发
送给客户端。
(6)发送响应报文
(7)记录日志
httpd的特性:
高度模块化:core+modules 任何一个组件出现问题或者需要升级,它只影响一个模块,而不
会影响整体的代码,任何一个模块崩溃,有可能只需要替换一个模块即可
DSO:Dynamic Shared Object 动态共享对象
MPM:Mutipath Processing Modules:实现多种不同的I/O模型。
Prefork:多进程模型,主进程,生成多个子进程,每个子进程响应一个请求;
worker:多线程模式,主进程,生成多个子进程,每个子进程生成多个线程,每个线程响
应一个请求;
event:事件驱动模型,主进程,生成多个子进程,每个子进程响应多个请求;
I/O类型
同步和异步:synchronous,asynchronous;关注的是消息通知机制
同步:调用发出后不会立即返回,但是一旦返回,则返回的是最终结果。
异步:调用发出后,被调方立即返回消息,但返回并非最终结果,被调用者通过状态,通知
机制等来通知调用者,或通过回调函数来处理结果。
阻塞和非阻塞:block,noblock ;关注的是调用者等待被调用者返回结果时的状态
阻塞:调用结果返回前,调用者被挂起;调用者只有在得到返回结果之后才能继续;
非阻塞:调用者在结果返回之前,不会被挂起,即调用不会阻塞调用者;
I/O模型:
blocking IO:阻塞式IO
noblocking IO:非阻塞IO
IO multiplexing:复用型IO
signal driven IO:事件驱动式IO
通知:
水平触发:多次通知
边缘触发:只通知一次
asynchronous IO:异步IO
一个进程发起IO调用时,这个IO将由两个阶段组成(一次IO,指的是磁盘IO),第一步:数据
从磁盘到内核内存,第二步:数据从内核内存到进程内存。真正被称为IO是数据从内核内存到进
程内存的过程。
实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用send()的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。
程序环境:
配置文件:
/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
配置文件组成部分:
~]# grep "Section" /etc/httpd/conf/httpd.conf
### Section 1: Global Environment
### Section 2: 'Main' server configuration
### Section 3: Virtual Hosts
常用配置:
1 修改监听的IP和PORT
Listen [IP:]PORT IP可省略,省略表示监听本地所有ip地址;listen可以应用多次
2 持久连接
目前多数的浏览器都请求服务器保持持续连接,这种功能就称为“KeepAlive“,它是HTTP1.1标
准规格,一般是用来强化服务器的性能。在使用保持连接功能时,设置客户一次请求连接能影响
文件的最大上限,建议把默认值设为ON,以便提高访问性能。但当使用负载均衡时,会影响负载
均衡的效果,在未断开连接之前,同一客户端时中被定向至同一台服务器。
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待
其他的请求完成;
KeepAlived On|Off 是否开启持久连接
MaxKeepAliveRequests # 数量限制
KeepAliveTimout # 时间限制
测试:
telnet HOST PORT
GET /URL HTTP/1.1
Host: HOSTNAME or IP
3 MPM 多路处理模块 prefork,worker,event
http-2.2不支持同时编译多个模块,所以一次编译只能选定一个,rpm安装的包提供
三个二进制执行程序,分别用于实现对不同MPM机制的支持。
<IfModule prefork.c> #判定模块是否存在
StartServers 8
#默认启动的工作进程数;不包括主进程,主进程只是负责子进程的创建回收等
MinSpareServers 5 #最少空闲进程数
MaxSpareServers 20 #最大空闲进程数
ServerLimit 256 #最大活动进程数
MaxClients 256
#并发请求的最大数;请求连接进来不一定会活动,要小与等与ServerLimit
MaxRequestsPerChild 4000 #每个进程在生命周期内所能服务的最多的请求个数;
</IfModule>
<IfModule worker.c>
StartServers 4 #启动的子进程的个数
MaxClients 300 #并发请求的最大数
MinSpareThreads 25 #最小空闲线程数
MaxSpareThreads 75 #最大空闲线程数
ThreadsPerChild 25 #每个子进程可生成的线程数
MaxRequestsPerChild 0
#每个子进程在生命周期内所能服务的最多的请求个数,0标示不限定
</IfModule>
默认为/usr/sbin/httpd,其使用prefork。
更换使用的httpd程序:
/etc/sysconfig/httpd
HTTPD=
重启服务生效;
4 DSO模块加载方式
配置指令实现模块加载
LoadModule <mod_name> <mode_path>
模块路径可使用相对地址,相对于ServerRoot(/etc/httpd)指向的路径而言:
/etc/httpd/modules/
httpd -M:列出已经装载的所有DSO以及非DSO模块
httpd -l:列出支持使用的非DSO模块
5 定义站点根目录
DocumentRoot /path/to/somewhere
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置;
DocumentRoot “/var/www/html“
test/index.html --> http://HOST:PORT/test/index.html
apache服务器存放页面的路径,默认所有要求提供HTTP服务的连接,都要以这个目录为主目录,默认为/var/www/html
6 站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径
<Directory ""> </Directory>
<FileMatch ""> <FileMatch>
URL路径:
<Location ""> </Location>
...
访问控制机制:
基于来源地址;
基于帐号;
7 Directory中“基于来源地址“实现访问控制
(1)Options
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
Indexes:缺少指定的默认页面时,允许将目录中所有文件以列表形式返回给用户,危险!
Includes:允许是用mod_include模块实现服务器端包含(SSI);
FollowSymlinks:允许跟踪符号连接文件;
SymlinksIfOwnerMatch:在链接文件属主属组与源文件的属主属组相同时,允许跟随符号连接所指向的原始文件;
ExecCGI:允许是用mod_cgi模块执行CGI脚本;
MultiViews:允许是用mod_negotiation实现内容协商;
None:所有都不启用;
All:允许所有;
(2)基于来源地址的访问控制机制
Order:检查次序
Order allow,deny
Order deny,allow
Allow from
Deny from
来源地址:IP 或 NetAddr 172.16 | 172.16.0.0 | 172.16.0.0/16
<Directory>可以配置网站目录下的访问属性,使用<Directory ~ "path">可以基于正则表达式的匹配,但是一般不建议使用,会消耗时间。类似的指令还有:
<Location [~] "">:配置URL访问属性,与<Directory>相似(可以配置ststus页面或者定义了别名的路径等);
<File [~] "">:限制单个文件的访问属性;
<locationmatch "">:相当于Location ~,但一般建议使用此配置进行正则匹配;
如果某要配置其属性的URL能映射到某具体文件系统路径,建议使用。
8 定义默认主页面
DirectryIndex index.html index.html.var
自左而右,依次匹配
9 日志设定
默认日志目录:/var/log/httpd
错误日志:
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;may be bogus if return status (%s) is 401);
%t:服务器收到请求的时间;
%r:请求报文的道行信息;
%>s:响应状态码;
%b:响应报文的大小,单位是字节,不包括响应报文首部;
"%{Referer}i:请求报文中“referer“首部的值;当前资源的访问入口;
"%{User-Agent}i:请求报文中“User-Agent“首部的值,即发出请求用到的应用程序;
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10 路径别名
DocumentRoot "www/htdocs"
http://server1/download/bash-4.4.2-3.el6.x86_64.rpm
--> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
Alias /alias/ "/PATH/TO/SOMEDIR/"
意味着访问http://Server_IP/alias时,其页面文件来自于/PATH/TO/SOMEDIR/这个位置
注意:前后路径要一致,结尾都有“/“或者都没有
Alias /bbs/ "/forum/htdocs"
http://server1/bbs/index.html
--> /forum/htdocs/index.html
11 设定默认字符集
AddDefaultCharset UTF-8
GBK,GB2313,GB18030
12 基于用户的访问控制
当你的网站或者站点的某个路径只想让你授权的用户访问时,就可以使用基于用户的访问控制
认证质询:
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供帐号和密码;
认证:
Authorization:客户端用户天如帐号和密码后,再次发送请求报文,认证成功,则服务器发送响应资源
认证类型: basic:明文 digest:消息摘要,hash编程后发送,大多浏览器不支持
安全域:需要用户认证后方能访问的路径;
应该通过名称对其进行标示,并用于告知用户认证的原因;
用户的帐号和密码存储于何处?
虚拟帐号:仅用于访问某服务器时用到的认证标识;
存储: 文本文件;SQL数据库;ldap,nis
basic认证:
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USERPASSWD_FILE"
Require user username1 username2 ...
</Directoty>
允许帐号文件中的所有用户登陆访问: Requie valid-user
(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_USERPASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2 ...
</Directoty>
要提供:用户帐号文件和组文件;
组文件:每行定义一个组
基于用户的访问控制
1 使用htpasswd命令生成用户认证库;
2 编写配置文件 /etc/httpd/conf/httpd.conf
3 创建安全域,即访问目录。最后重新加载服务即可
基于组进行认证
1 使用htpasswd命令生成认证库,同上。创建组文件。
2 修改配置文件 /etc/httpd/conf/httpd.conf
3 创建安全域,即访问目录。最后重新加载服务即可
13 虚拟主机
即为一个物理服务器提供多个站点。有三种实现方案:
基于ip:为每个虚拟主机准备至少一个ip地址;
基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:为每个虚拟主机准备至少一个专用hostname;
注意:一般虚拟主机不要与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocumentRoot
NameVirtualHost *:80 #使用基于域名的虚拟主机时需要启动此项,在httpd-2.4中不需要使用
每个虚拟主机都有专用配置:
<VirtualHost "IP:PORT">
ServerName
DocumentRoot ""
</VirtualHost>
基于ip
1 分别创建安全域目录,并配置主页面。
2 修改配置文件 /etc/httpd/conf/httpd.conf
实验效果:分别输入不同的ip,访问到不同的页面。
基于port
1 创建安全域目录,并配置主页面。
2 修改配置文件 /etc/httpd/conf/httpd.conf
实验效果:分别输入ip的不同端口,访问到不同的页面。前提是在listen处打开这个端口。
基于域名
1 创建安全域目录,并配置主页面。
2 修改配置文件 /etc/httpd/conf/httpd.conf
3 注意打开修改NameVirtualHost选项!
实验效果:分别输入不同域名,访问到不同的页面。访问的主机做好域名解析!
14 内置的status页面
<Location /server-status>
SetHandler server-status
Order dent,allow
Dent from all
Allow from 172.25
</Location>
实现:基于帐号实现访问控制