http协议
URL:unifrom Resource Locator
URL方案:scheme
服务器地址:ip:prot
资源路径:
基本语法:
<scheme>://<user>:<password>@<host>/<path>:<params>?<query>#<frag>
http报文语法:
request报文:<method><request-URL><version>
<headers>
<entity-body>
response报文:
<version><status><reason-phrase>
<headers>
<entity-body>
method:请求方法,标明客户端喜欢服务器对资源执行的动作
GET,HEAD,POST
version:
HTTP/<major>.<minor>
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,错误信息,服务器端
html:编辑语言,超文本标记语言;
css:cascading style sheet:
js:javascript,
MIME:多用途互联网邮件扩展。使得可以基于文本传输发送非文本数据
web资源:
静态文件:.jpg、.gif、.html、.txt、.js、.css、.MP3、.avi
动态文件:.php、.jsp
http协议版本:
http/0.9:原始版本
http/1.0:第一个广泛使用的版本支持:MIME
http/1.1:增强了缓存功能
spdy
http/2.0
一次完整的http请求过程:
1.建立处理连接:接收请求或者拒绝请求
2.接收请求
接收来自网络的请求报文中对某个资源的一次请求的过程
并发访问响应模型
单进程I/O结构:启动一个进程,而且一次只处理一个,多个请求被串行响应
多进程I/O结构:并行启动多个进程。每个进程响应一个请求
复用I/O结构:一个进程响应N个请求
多线程模型:一个进程生成N个线程,每个线程响应一个请求:
事件驱动:
复用的多进程I/O结构:启动多个进程,每个进程启动多个线程
3.处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息
4.访问资源
本地文件系统路径下某个路径称为DocRoot
/var/www/html/
web服务器资源路径映射方式;
1.docroot
2.alias
3.虚拟主机docroot
4.用户家目录docroot
5.构建响应报文
6.发送响应报文
7.记录日志
http服务器程序;
httpd(apache)
nginx
lighttpd
应用程序服务器:
IIS
tomcat,jetty,jboss,resin
webshpere(ibm),weblogic(ba--oracle),oc4j(oracle)
https://www.netcraft.com/查看各种应用市场份额
httpd的安装配置和使用
httpd:apache
a patchy server=apache
ASF:apache software foundation
httpd的特性;
高度模块化:core+modules
DSO:Dynamic Shard Object 动态共享对象
MPM;Multipath Processing modules 多路处理模块
prefork(非常重要):多进程模型,每个进程响应一个请求;
一个主进程,负责生产N个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达。
最大不会超过1024个
worker:启动多个进程,每个进程生成多个线程,每个线程响应一个用户请求;
event:启动多个线程,每个线程响应N个请求;
event-driven:事件驱动
httpd的功能特性:
丰富用户认证:基本认证和摘要认证
CGI:原生支持perl CGI
虚拟主机:
基于端口、IP、主机名
反向代理:
负载均衡
用户站点:
路径别名:
支持第三方模块
安装方式:
rpm
编译安装
CentOS 6: httpd
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
脚本配置文件:/etc/sysconfig/httpd
模块目录:
/etc/httpd/modules: 链接文件
/usr/lib64/httpd/modules
主程序:
/usr/sbin/httpd: prefork
/usr/sbin/httpd.event: event
/usr/sbin/httpd.worker: worker
日志文件目录:
/var/log/httpd
access_log: 访问日志
error_log: 错误日志
站点文档根目录:
/var/www/html/p_w_picpaths/a.jpg
http://www.test.com/p_w_picpaths/a.jpg
常用配置:
1.修改监听端口
Listen [IP:]PORT
Listen 80
Listen 172.16.6.14:8080
2.持久连接:连接建立后,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成;
如何断开?
数量限制;100
时间限制:可以配置
副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应;
使用较短的持久连接时间;
httpd-2.4 支持毫秒级的持久连接
KeepAlive {On|Off}
MaxKeepAliveRequests 100
KeepAliveTimeout 15
测试:telnet 172.16.6.14 80
GET / HTTP/1.1
Host:172.16.6.14
3.MPM
prefork,worker,event
http-2.2不支持同时编译多个模块,所有只能编译时选定一个:rpm安装包提供了三个二进制的程序文件,分别用于实现对
不同MPM机制的支持:确认方法
ps aux | grep httpd
默认为 /usr/sbin/httpd,其使用prefork
查看模块列表的命令
httpd -l
Compiled in modules:
core.c
prefork.c
mod_so.c
http_core.c
查看所有今天编译和动态装载的模块
httpd -M
更换使用的httpd程序:
修改/etc/sysconfig/httpd
vi /etc/httpd/conf/httpd
prefork的配置
<IfModule prefork.c>
StartServers 8
MinSpareServers 5 --最小空闲进程数
MaxSpareServers 20
ServerLimit 256 --最多启动多少个进程
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
worker的配置
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
PV,UV
PV:page view
UV:user view
独立ip量
4.DSO
/usr/lib64/httpd/modules
模块路径可以使用相对地址;
相对于ServerRoot(/etc/httpd)指向的路径而言;
存放路径/etc/httpd/modules/
修改/etc/httpd/conf/httpd 中的 LoadModule
service httpd reload
5.定义‘Main’server的稳当页面路径
DocmentRoot
文档路径映射:
DocmentRoot指向的路径为url路径的起始位置;
6.站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:<Directory “”></Directory>
<file ""></file>
<fileMatch""></FileMatch>
URL路径:
<Location ""></Location>
访问控制机制:
基于来源地址:
基于账号:
7.Directory中“基于来源地址”实现访问控制
(1)Options
所有可用值:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
None,All
Indexes:索引
FollowSymLinks:运行跟踪符号链接文件
(2)基于来源地址的访问控制
Order:检查次序
Order allow ,deny
Order deny,allow
Allow from 运行IP
Deny from 拒绝IP
文本浏览器
enliks -dump http://172.16.6.14
来源地址:
IP
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
8.定义默认主页
DirectoryIndex index.html index.html.var
9.日志设定
错误日志:
Errlog logs/error_log
loglevel warn
debug, info, notice, warn, error, crit,alert, emerg.
访问日志:
Customlog logs/access_log
LogFormat 定义日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
10.路径别名
Alias /test/ "/var/test2/index.html"
11.设定默认字符集
AddDefaultCharset UTF-8
gbk,gbk2312 ,gb18030
12.基于用户的访问控制
WWW-Authenticate:响应码为401,拒绝客户请求,并说明要求用户提供账号和密码
认证;Authorization:客户端用户填入账号和密码后再次发送请求报文:认证通过,则服务器发送响应资源;
认证类型:
basic:明文
digest:消息摘要
安全域:需要用户认证后才能访问的路径,应该通过名称对其标识,并用于告知用户认证的原因
用户账号密码存储:文本文件;SQL数据库;ldap;nis
(1) 基于用户进行认证
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
Require valid-user
</Directory>
Require valid-user: 文件中所有用户均可访问
Require user USERNAME, ...
(2) 提供认证文件
htpasswd
-c: 如果此文件事先不存在,则创建;注意,只能在创建第一个用户时使用;
-m:以md5的格式编码存储用户的密码信息
-D:删除指定用户
(3) 组认证
<Directory "/var/www/html/admin">
Options none
AllowOverride AuthConfig
AuthType Basic
AuthName "Admin Area."
#AuthBasicProvider file
AuthUserFile /etc/httpd/conf/.htpasswd
AuthGroupFile /etc/httpd/conf/.htgroup
Require group GROUP_NAME
</Directory>
组文件:
组名:user1 user2 user3
13.虚拟主机
有三种是实现方案;
基于IP
为每个虚拟主机准备至少一个ip地址:实践中很少使用
基于port
为每个虚拟主机准备至少一个专用port:实践中很少使用
基于hostname
为每个虚拟主机准备至少一个专用hostname;
可混合使用上述三种方式中的任意方式
注意:一般虚拟主机不要与中心主机混用,所以要使用虚拟主机,先禁用中心主机;
禁用中心主机:注释DocmentRoot
每个虚拟主机都有专用配置;
<VirtualHost IP:PORT>
ServerName
DocumentRoot
ServerAlias
ErrorLog
CustomLog
</VirtualHost>
配置文件语法检查:
httpd -t
service httpd configtest
配置示例:
基于IP:
<VirtualHost 172.16.100.7:80>
ServerName web1.test.com
DocumentRoot "/web/hosta"
</VirtualHost>
<VirtualHost 172.16.100.8:80>
ServerName web2.test.com
DocumentRoot "/web/hostb"
</VirtualHost>
基于port:
<VirtualHost 172.16.100.8:80>
ServerName web2.test.com
DocumentRoot "/web/hostb"
</VirtualHost>
<VirtualHost 172.16.100.8:8080>
ServerName web3.test.com
DocumentRoot "/web/hostc"
</VirtualHost>
基于hostname:
启用NameVirtualHost 172.16.100.7:80
VirtualHost 172.16.100.7:80>
ServerName web1.test.com
DocumentRoot "/web/hosta"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName web2.test.com
DocumentRoot "/web/hostb"
</VirtualHost>
<VirtualHost 172.16.100.7:80>
ServerName web3.test.com
DocumentRoot "/web/hostc"
</VirtualHost>
14.内置status页面
启用server-status