Http
端口定义:
0-1023:永久分配给固定的应用使用,特权端口
1024-41951:也是注册端口,要求不严格
41952+:客户端随即使用的端口,动态端口,或私有端口
BSD Socket :
IPC的一种实现,允许位于不同主机上的进程之间进行通讯
Socket API(封装了内核中socket通信相关的系统调用)
SOCK_STREAM:tcp套接字
SOCK_DGRAM:UDP套接字
SOCK_RAW:raw套接字
TCP协议的特性:
建立连接:三次握手
将数据打包成段:校验和CRC32
确认、重传及超时
排序:逻辑序号
流量控制:滑动窗口算
http:hyper text transfer protocol,应用层协议,80/tcp
Html:hyper text mark language,编程语言,超文本标记语言
…………
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
service start/stop/restart/status/reload/configtest httpd
CentOS 7:
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/*.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 httpd.service
systemctl start/stop/restart/status httpd.service
Web Server :
httpd-2.2的常用配置:
主配置文件:
/etc/httpd/conf/httpd.conf
DirectoryIndex index.html 定义默认主页名称
DocumentRoot “/var/www/html”默认站点目录
ServerRoot “/etc/httpd” 用于指定Apache的运行目录,服务启动之后自动将目录改为当前目录,在后面所使用的所有相对路径都是相对这个目录的
#Section 1 : 全局环境变量
#Section 2 : 主服务配置
#Section 3 : 虚拟主机
cp -v httpd.conf {,.backup} #编辑配置文件之前备份同名后缀为“.backup”的文件
配置文件格式:
directive value
directive : 不区分大小写
value : 为路径时,是否区分大小写取决于文件系统
常用配置:
1. 修改监听的IP和端口
Listen IP:PORT
不写IP默认监听所有IP
2. 修改监听Socket 重启即生效
3. 持久链接功能:TCP建立链接之后,每个最远获取完成后不断开连接,而是继续等待其他资源请求的进行
是否开启:KeepAlive On/Off
断开方法:
1. 数量限制
最大连接数:MaxKeepAliveRequests 100
2. 时间限制
超时时长:KeepAliveTimeout 10
Telnet 测试:
Telnet SERVER_IP PORT
GET /URL HTTP/1.1
Host: SERVER_IP
MPM模块
http2.2不支持同时编译多个MPM模块,故只能编译选定使用的那一个,CentOS 6 中转么能提供了三个应用程序文件,httpd(prefok), httpd.worker httpd.event 分别用于实现对不同的MPM机智的支持
默认使用的为/usr/sbin/httpd,为prefork的MPM模块
查看httpd程序的模块列表
# httpd -l
查看静态编译以及动态编译的模块
# httpd -M
更换使用httpd程序,来支持其他MPM机制
/etc/sysconfig/httpd
HTTPD=/usr/sbin/httpd.{worker,event}
重启服务才可生效
MPM(多处理模块)配置:
prefork的配置:
StartServers 8 #启动时启动多少进程
MinSpareServers 5 #最小空闲进程
MaxSpareSercers 20 #最大空闲进程
ServerLimit 256 #最大在线进程数量
MaxClients 256 #这个是真正控制单台host上Apache真正能控制的最大 并发连接数。这个参数很重要,是你计算系统峰值时消耗 系统资源的主要依据
MaxRequestPerChild 4000 #每一个进程能处理的请求最大数量,之后必须销毁
worker的配置:
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0 #永久存在不执行销毁
PV/UV :
PV : PageView 页面浏览量
UV : UserView
DSO :
配置指定实现模块加载
LoadModule
模块文件路径可使用相对路径
相对于ServerRoot(默认/etc/httpd)
定义‘Main’server的文档页面路径
修改DocumentRoot指向的路径为URL路径的起始位置
相当于站点URL的根路径
站点访问控制常见机制
可基于两种机制指明对那些资源进行访问控制
文件系统路径
1.
……
2.
……
URL路径 :
……
1. Options后面跟一个或多个以空白字符分隔得“选项”列表
选项:
indexes: 指定的URL路径下不存在与定义的主页面资源相符的资源文件时,返 回索引列表给用户
Attention:测试Indexes功能时,务必要把/etc/httpd/conf.d/welcome.conf里面的Option选项后面的“-”去掉,否则测试时只会加载默认欢迎页面而不会列出Indexes
FollowSymLinks (跟踪符号链接) : 允许跟踪符号链接文件所指向的源文件
None :全部关闭
All:全部开启
2. AllowOverride :
与访问控制相关的哪些指令可以放在.htaccess文件(每一个目录下都可以有一个)中;
All : 表示所有都可以放进去
None : 否上
3. Order和allow、deny
order: 定义生效次序,写在后面的表示默认法则;
Allow from, Deny from
来源地址:
IP:
NetAddr:三种格式:172.18
172.18.0.0
172.18.0.0/16
172.18.0.0/255.255.0.0
定义站点主页面:
DirectoryIndex index,html index.html.var
定义路径别名:
Alias /URL/ “/PATH/TO/SOMEDIR”
设定默认字符集:
AddDefaultCharset UTF-8
中文字符集:GBK/GB2312/GB18030
日志设定:
日志类型:访问日志 和 错误日志
错误日志:
ErrorLog logs/error_log
LogLevel warn
日志级别:debug/info/notice/warn/error/alert/emerg
访问日志:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustonLog logs/access_log combined
LogFormat formatrr string:
%h : 客户端IP地址
%l :RemoteUser 通常为一个减号(“-”)
%u : 非登录访问时,为减号
%t : 服务收到请求的时间
%r : First line of request 表示请求报文的首行,记录此次请求的方法,url以及协议版本
%>s : 响应状态码;
%b : 响应报文的大小,单位是字节,但是不包括响应报文的HTTP首部
%{referer}i : 请求报文中首部“referer”的值,即从哪个页面中的超链接跳转至当前页面的,
%{User-Agent}i : 请求报文中首部“User-Agent”的值,即发出请求的应用程序;
基于用户的访问控制:
认证质询:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证:客户端用户填入账号和密码后再次发送请求报文、认证通过时,则服务器发送响应的资源
认证方式有两种:
basic:明文
digest : 消息摘要认证
安全域:需要用户认证后方能访问的路径,应该䚒名称对其进行标识,一遍告知用户认证的原因
用户的账号和密码存放位置:
虚拟账号:仅用于访问某服务时用到的认证标识
存储:
文本文件:
SQL数据库
ldap目录存储
basic认证配置示例:
定义安全域
Option None
AllowOverride None
AuthType Basic
AuthName “String”
AuthUserFile “/PATH/TO/HTTPF_USER_PASSWD_FILE”
Require User username1 username2 ……
允许账号文件中的所有用户登录访问
Require vaild-user
提供账号和密码存储(文本文件)
使用专用命令完成此类文件的创建以及用户管理
htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username
-c 自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
-m MD5加密
-s sha 格式加密
-D 删除指定用户
基于组账号进行认证:
定义安全域
Option None
AllowOverride None
AuthType Basic
AuthName “String”
AuthUserFile “/PATH/TO/HTTPF_USER_PASSWD_FILE”
AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”
Require group gropname1 gropname2 ……
创建用户账号和组账号文件:
组文件:每一行定义一个组
GRP_NAME: username1 username2 ……
虚拟主机:不建议直接在/etc/httpd/conf/httpd.conf 中配置,建议单独一个文件配置虚拟主机
站点标识:socket
IP相同,但端口不同
IP不同,但是端口均为默认端口
FQDN不同:
请求报文首部实现
Host:www.zhangwentao.com
三种实现方案:
基于IP:为每一个虚拟主机准备至少一个IP地址
基于PORT:为每一个虚拟主机使用至少一个独立的PORT
基于FQDN:为每一个虚拟主机使用至少一个FQDN
Attention: 一般的虚拟你不要与中心主机混用,因此,需要使用虚拟主机,要先禁用‘main’主机
禁用方法:注释中心主机的DocumentRoot指令即可
虚拟主机的配置方法:
ServerName FQND
DocumentRoot “” 虚拟主机站点那文件路径
其它可用指令:
ServerAlias: 虚拟主机的别名,可以多次使用
ErrorLog:
CutomLog:
1.基于IP的虚拟主机示例:通过IP变化来实现虚拟主机
ServerName www.zhangwentao.com
DocumentRoot “/www/zhangwentao.com/httpdocs”
ServerName www.zhangwentao.net
DocumentRoot “/www/zhangwentao.net/httpdocs”
ServerName www.zhangwentao.org
DocumentRoot “/www/zhangwentao.org/httpdocs”
2.基于端口的虚拟主机配置示例:
Listen 808
ServerName www.zhangwentao.com
DocumentRoot “/www/zhangwentao.com/httpdocs”
ServerName www.zhangwentao.net
DocumentRoot “/www/zhangwentao.net/httpdocs”
ServerName www.zhangwentao.org
DocumentRoot “/www/zhangwentao.org/httpdocs”
3.基于FQDN的虚拟主机:http-2.2版本中,虚拟主机要基于主机名需要加NameVirtualHost
NameVirtualHost 192.168.9.128:80
ServerName www.zhangwentao.com
DocumentRoot “/www/zhangwentao.com/httpdocs”
ServerName www.zhangwentao.net
DocumentRoot “/www/zhangwentao.net/httpdocs”
ServerName www.zhangwentao.org
DocumentRoot “/www/zhangwentao.org/httpdocs”
status状态页面:
LoadModule status_module modules/mod_status.so
SetHandler server-status
Order allow.deny
Allow from all #Allow from all 是极其危险的操作
测试httpd服务时,注意SElinux 的问题
常见报错:SELinux is preventing /usr/sbin/httpd from name_bind access on the tcp_socket port 808. For complete SELinux messages run: sealert -l
http协议和httpd的配置:
URL:Unifrom Resource Locator
http:// :默认端口为80
https:// : 默认端口为443
基本语法:
params: 参数
query:
frag: 网站目录定位
相对URL:同一个站点内
绝对URL:跨站点
http协议:
http/0.9 ,http/1.0 ,http/1.1 ,http/2.0
http协议:statuless
服务器无法持续追踪访问者来源
cookie session
http事务:
请求:request
响应:response
报文语法格式:
request报文:
response报文
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:成功,请求的所有数据通过响应报文的entitu-body:OK
301:请求的URL资源已经被删除;但在响应报文中通过首部Location指 明了资源现在所知的新位置(永久重定向)
302:与301相似,但在响应报文中通过Location指明资源现在所处临时新 位置(临时重定向)
304:客户端发出了条件式请求:但服务器上的资源未曾发生改变,通过 响应此状态码通知客户端
401:需要输入账号和密码认证之后方能访问资源
403:请求被禁止,Forbidden
404:服务器无法找到客户端请求的资源:Not Found
500: 服务器内部错误:Internal Server Error
502:代理服务器从后端服务器收到了一条伪响应:Bad Gateway
Headers :
格式:
通用首部(既可以应用在请求报文首部也可以用在响应报文首部):
Date:报文的创建时间
Connection: 连接方式,如KeepAlive,Close
Via:显示报文经过的节点
Catche-Control:控制缓存
请求首部:
Accept:通过服务器自己可以接受的媒体类型
Accept-Charset:
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-IP:
Host:请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源
User-Agent:客户端代理
条件式去请求首部:
Expect:
If-Modified-Since:自从指定的时间后,请求的资源是否发生过修改
If-Unmodified-Since:自从指定时间之后,是否没发生过修改
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的ETag不匹配
If-Match:
安全请求首部:
Authorization:向服务器发送认证信息。账号密码
Cookie:客户端向服务器发送cookie
cookie2:
代理请求首部:
Proxy-Authorization:向代理服务器认证
响应首部:
信息性:
Age:响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多重表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其他首部列表
安全响应首部:
Set-Cookie:向客户端设置Cookie
Set-Cookie2:
WWW-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:
Allow:列出对此实体可以使用的请求方法
Lcation:告诉客户端真正的实体位于何处
Content-Encoding:内容的编码格式
Content-Language:内容的语言
Content-Length:主体的长度
Content-Location:实体真正所处的位置
ontent-Type:主体对象类型
缓存相关:
ETag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间
HTTPD-2.2的常见配置:
curl命令:
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP/FTPS/HTTP/HTTPS/GOPHER/TELNET/DICT/FILE以及LDAP等协议
curl [options] URL
常用选项:
-A/--user-agent
-basic使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer
--cacert
--compressed 要求返回是压缩的格式
-H/--header
-I/--head 只显示响应报文首部信息
--limit-rate
-u/--user
-0/--http1.0 使用HTTP 1.0
elinks [options] url
-dump :不进入交互式模式,而是直接将URL的内容全部列出
user/group:
指定以哪个用户的身份运行httpd服务进程
User apache
Group apache
使用mod_deflate模块压缩页面优化传输速度
适用场景:
1. 节约带宽,额外消耗CPU,可能较老的浏览器不支持
2. 压缩适用于压缩的资源,例如文本文件
https , http over ssl
SSL会话过程:
1. 客户端发送可供选择的加密方式,并想服务器请求证书
2. 服务器端发送证书以及选定的加密方式给客户端
3. 客户端取得证书并进行证书验证
a) 如果信任给其颁发的证书CA
1. 验证证书来源的合法性:用CA的公钥解密证书上数字签名
2. 验证证书的内容的合法性:完整性验证
3. 检查证书的有效期限
4. 检查证书是否被吊销
5. 证书中拥有者的名字,与访问的目标主机要一致
b) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
c) 服务器用此密钥加密用户请求的资源,响应给客户端
SSL会话是基于IP地址创建的,所以单IP的主机上,仅可以使用一个https虚拟主机
配置httpd支持https:
1. 为服务器申请数字证书
测试:通过私建CA发证书
a. 创建私有CA
b. 在服务器上创建证书签署请求
c. CA验证
2. 配置httpd支持使用ssl,及使用的证书
# yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificatKeyFile
3. 测试基于https访问相应的主机
# openssl s_client [connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]