HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
http协议:
http/0.9:原型版本;
http/1.0:cache, MIME(multipupose internet Mail Extensions)
method:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS、...
http/1.1:缓存功能大大增强
speedy:spdy
http/2.0
80/tcp
https协议:
443/tcp
IANA:
0-1023:众所周知的,永久地分配给固定的应用使用;特权端口(仅root可用);
1024-41951:注册端口,但要求不是特别严格,分配给程序注册为某应用使用;
41952+:客户端程序使用的随机端口,动态端口,或称为私有端口;/proc/sys/net/ipv4/ip_local_port_range;
BSD Socket:IPC一种实现,允许位于不同主机之上的进程之间互相通信的解决方案之一;
Socket API:
SOCK_STREAM:tcp套接字;
SOCK_DGRAM:udp套接字;
SOCK_RAW:裸套接字;
根据套按使用的地址格式:
AF_INET:ipv4地址家族;
AF_INET6:ipv6
AF_UNIX:Unix_sock;
TCP Finite State Machine:
TCP协议的特性:
建立连接:三次握手;
将数据打包成段:校验和(CRC32)
确认、重传及超时;
排序:逻辑序号;
流量控制:滑动窗口;
拥塞控制:慢启动及拥塞避免算法;
http:hyper text tranfer protocol, 超文本传输协议;
html:hyper text mark language,超文本标记语言;
工作模式:request/response
一次完整的http事务:请求<-->响应
web资源:
一个html文档;
一个图片;
一个mp3文件片断;
...
URL:资源标识,用于描述服务器上某特定资源的位置;
Uniform Resource Locator
scheme://Server[:port]/PATH/TO/SOME_RESOURCE
资源的种类:
静态资源:.jpg, .gif, .png, .html, .txt,
动态资源:
服务器端技术:.php, .jsp, ... 客户端技术:.js
一次完整的http请求的处理过程:
(1) 建立或处理连接:接收请求或拒绝请求;
(2) 接收请求:接收客户端发来的具体请求报文;
(3) 处理请求:对请求报文进行解析;
(4) 访问资源:通过存储IO获取用户请求的资源;
(5) 构建响应报文:
(6) 发送响应报文 :
(7) 记录于日志中
并发响应模型:
单进程I/O模型:串行响应;
多进程I/O模型:同时启动多个进程,每个进程响应一个请求;
复用的I/O模型:一个进程响应多个请求;
多线程模型:一个进程生成多个线程,每个线程响应一个请求;
事件驱动:一个进程直接响应多个请求;
复用的多进程I/O结构:启动m个进程,每个进程生成n个线程,每个线程响应一个请求;
资源映射
例如:/var.www/html/ DocumentRoot
images./logo.jpg
web服务器的资源映射
(a)documentRoot
(b)alias
(c)虚拟主机的docroot
(d)用户的docroot
请求的链接方式
保持连接:长连接 keepalive
非保持连接:短连接
时间:
数量:
http协议的实现:
简单的基本http协议服务器:纯静态
httpd(apache)
nginx
lighttpd
application server:动态服务器技术:
IIS,tomcat,jetty,resin..
weblogic,websphere.jboss.glassfish,...
httpd:
www.netcraft.com 数据挖据网站
ASF:apache software foundation apache 软件基金会
Apache,a patchy server,httpd nsa研发项目
httpd特性:
高度模块化设计:core+modules
DSO:Dynamic share objects
支持动态装载和卸载;
MPM:multiPath processing modules 多路处理模块
经典三个模型
prefork:一个主进程。多个子进程;一个进程响应一个请求
主进程:负责管理子进程;创建套接字; 接受用户请求,并派发给某子进程
子进程:处理请求,响应请求
worker:(多复用的i/o多线程模型)多进程多线程模型;一个线程响应一个请求
主进程:负责管理子进程;创建套接字; 接受用户请求,并派发给某子进程
子进程:负责管理线程
线程:处理并响应请求
event:事件驱动模型,多进程模型,每个进程响应多个请求;
主进程:主进程:负责管理子进程;创建套接字; 接受用户请求,并派发给某子进程
子进程:处理并响应请求
httpd-2.2:event 为测试模型
centos 6 MPM不支持DSO机制
httpd-2.4 production ready;支持DSO机制
centos 7
httpd的版本:httpd.apache.org
httpd-1.3:官方停止维护
httpd-2.0:
httpd-2.2:
httpd-2.4:
httpd的功能特性:
CGI:common gateway interface 通用网关接口
虚拟主机:IP,PORT,HOSTNAME
反向代理:模块实现
负载均衡:bytraffic,bybusiness,byrequest
路径别名:
丰富的用户认证:
basic:
digest:
支持第三方模块
...
安装httpd
RPM包:CentOS base源
编译安装:定制新功能制作rpm包
CentOS6 :httpd-2.2
sysinit 脚本
/etc/rc.d/init.d/httpd
程序环境:
配置文件:
/etc/httd/conf/httpd.conf
/etc/httd/conf.d/*.conf
程序文件
/usr/sbin/httpd
/usr/sbin/httpd.worker
/usr/sbin/httpd.event
脚本配置文件:/etc/sysconfig/httpd日志文件
/var/log/httpd
access_log:访问日志(分析用户行为)
erro_log:错误日志
站点文档根目录
/var/www/html(默认)
模块文件路径:
/usr/lib64/httpd/modules
系统启动 chkconfig --level 35 httpd on
Centso7 httpd-2.4
systemd unit file: /usr/lib/systemd/system/httpd.service
程序环境:
配置文件:
/etc/httd/httpd.conf
/etc/httpd/conf.modules.d
/etc/httd/conf.d/*.conf
程序文件
/usr/sbin/httpd
MPM支持DSO机制
日志文件
/var/log/httpd
access_log:访问日志
erro_log:错误日志
站点文档根目录
/var/www/html
模块文件路径:
/usr/lib64/httpd/modules
开机启动:systemctl enable httpd
httpd(2)
httpd-2.2的基础配置
/etc/httpd :ServerRoot
conf:配置文件 主配置文件conf/httpd.conf, conf.d/*conf
logs:日志文件
modules:模块文件
主配置文件conf/httpd.conf
directive vlaue(配置文件中的指令)
directive:不区分大小写 ServerRoot
value:除了路径之外不区分字符大小写
Section1 Global Environment 全局配置
Section2' Main' server configuration 中心主服务器配置
Section3 Virtual Hosts虚拟主机配置
2,3不会同时使用
修改后生效:
reload:端口
restart:修改监听地址
1.修改监听端口
Listen[ip:]PORT
(1)可定义多次:(本机可用的IP)
Listen80
Listen172.16.174.170:8080(一般为哪个地址对外通信)
(2)省略IP,表示0.0.0.0
2.持久连接
persistent connection:tcp连接建立后,资源获取完成不会断开连接,而是 继续等待请求其他资源;
如何断开?
KeepAlive Off 改On
数量限制:MaxKeepAliveRequests 100
时间限制 :KeepAliveTimeout 15
请求测试:
telnet SERVER_IP PORT
GET /test.html HTTP/1.1
Host:SERVER_IP
3.MPM :multipath processing modules 多路处理模块
htpd-2.2的MPM机制不支持DSO机制,event未测试 默认支持prefork
httpd:prefork
<IfModule prefork.c>
StartServers 8 预先生成空闲子进程
MinSpareServers 5 最小空闲进程
MaxSpareServers 20 最大空闲进程
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000 每个子进程响应的请求数
</IfModule>
httpd:worker:worker
<IfModule worker.c>
StartServers 4子进程
MaxClients 300线程
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25 线程
MaxRequestsPerChild 0 不做限制
</IfModule>
httpd:event:event
RPM -ql httpd | grep '/usr/sbin/httpd'
查看httpd模块列表
httpd -M static不支持动态装载
httpd -l 动态装载模块
httpworker -l
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd|httpd.worker|httpd.event
prefork 预先生成空闲子进程 默认8个
80,500ms,256
512*86400/80=55w PV
Page View
UV:User View
worker 三级结构 进程 子进程 线程
4.DSO
LoadModules 指令:
LoadModule Mod_Name modules/Module_File.so
相对路径:是相对于ServerRoot
server root "/etc/httpd"
5.'Main'Server
定义一个主机的基本指令:
ServerName:FQDN:PORT
DocumentRoot ./var/www/html
6.站点资源访问控制机制
DocumentRoot "/var/www/html" 更改路径 /data/web
基于文件系统进行
/var/www/html/admin/
<Directory "/PATH/TO/SOME_DIR"> 控制目录
</Directory>
<File ""> 控制文件
</File>
<FileMatch "PATTERN">
</FileMatch>
例如:<Directory /> (相对于docroot)
Options FollowSymLinks
AllowOverride None
</Directory>
基于url路径进行
<Location "/PATH/TO/SOME_URL">
</Location>
<LocationMatch "PATTERN">
</LocationMatch>
director
目录中的常用指令
(1)Options:用于定义资源站点显示方式;后跟以空白字符分割的选项列表
Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Indexes :允许索引。如果没有主页可以列出文件列表
followSymLinks:允许跟踪符号链接。允许访问连接文件的原文件
SymLinksifOwnerMatch:如果原文件的属主与连接文件的属主一致
SymLinks
ExecCGI:允许执行CGI脚本
MultiViews:内容协商
Includes:
Options None
(2)AllowOverride
httpd 允许各目录使用.htaccess文件实现单目录访问控制
/data/web/
.htaccess
Options FileInfo AuthConfig Limit
admin.htaccess
images.htaccess
强烈建议:AllowOverride None
(3)order和allow/deny from
基于IP地址的访问控制
order用于定义allow和deny的生效次序
allow from IP/NETWORK/FQDN
deny from IP/NETWORK/fqdn
来源地址格式
IP
NETADDR:172.16 172.16.0.0 172.16.0.0/16 172.16.0.0 255.255.0.0FQDN
DAMAIN
order allow,deny
Allow from 172.16.0.0/16
Deny from 172.16.174.100
Deny from all
最佳匹配法则机制,:最小匹配生效
7.定义站点主页面
DirectoryIndex file1 file2
8,定义路径别名:
DocumentRoot "/data/web"
http://www.magedu.com/images/logo.jpg<--/data/web/images/logo.jpj
Alias /URL/ "/PATH/TO/SOME_DIR/"
Alias /Images/ "/webdata/pictures/"
alias指定的URL右侧的"/"相当于后面的路径右侧的"/"
9日志设定
错误日志:
ErrorLog logs/error_log
LogLevel warn
访问日志:
LogFormat:定义日志信息格式
CustomLog logs/access_log combined
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
\"\"使用"要转义
格式
%hRemote host
%lRemote logname (from identd, if supplied)
%uRemote user (from auth; may be bogus if return status (%s) is 401)
%tTime the request was received (standard english format)
%rFirst line of request
%sStatus. For requests that got internally redirected, this is the status of the *original* request --- %>s for the last.
%bSize of response in bytes, excluding HTTP headers.
%{Foobar}iThe contents of Foobar: header line(s) in the request sent to the server.
10,httpd-mannual
#yum install http-manual
配置文件::/etc/httpd/conf.d/manual.conf
#service httd reload
访问路径
http://SERVER_IP/manual/
例:http://172.16.174.170/manual/
11.基于用户的访问控制机制
认证质询:
www-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
认证:
Authorization:客户端填入账号和密码再次发送请求报文;认证ton通过,服务端发送响应请求资源;
认证的两种方式
basic:明文
digest:消息摘要认证
虚拟账号:仅用于服务某的账号和密码;
存储于何处(httpd要有相应的适配模块)
文本文件 file dbm
SQL数据库
ldap目录数据库
安全域:需要用户认证后能访问的资源集合;通常基于名称对其进行标识
basic认证的配置显示:
<Directory "">
Options None
AllowOverride None
12.虚拟主机
多个站点基于不同的信息进行标识
站点标识
IP相同,端口不同
IP不同,端口相同
FQDN不同
虚拟主机有三种实现方式
基于IP的虚拟主机
每个虚拟主机使用-独有的IP地址
基于PORTD的虚拟主机
每个虚拟主机使用一个独有的PORT
局域FQDN虚拟主机
每个虚拟主机使用一个独有的FQDN
注意:虚拟主机与"主服务器"不能同时使用;
基于FQDN的虚拟主机实例
NameVirtualHost 172.16.174.100:80
<VirtualHost 172.16.174.170:80>
ServerName user1.magedu.com
DocumentRoot /data/vhosts/user1
</VirtualHost>
<VirtualHost 172.16.174.170:80>
ServerName user2.magedu.com
DocumentRoot /data/vhosts/user2
</VirtualHost>