HTTP
web概述
Web是一种超文本信息系统,它的主要概念是超文本链接,它使得文本不会再像一本书一样固定、线性的,而是从可以从一个位置跳到另外一个位置,正是由于可以实现这种多连接性我们才把它称为web
Web服务
Web服务通常可以分为静态Web服务与动态Web服务两种
一、静动之分
1、静态Web服务是指采用静态网页对Web请求给予响应的一种方式
静态Web服务最直观的表现是,网站的Web的页面只能格式化显示电子文本,一经生成,无法改变其内容,只能更改网页文件,这样给网站的维护带来了极大不便。到了后来也就出现动态网页。
2、所谓的动态Web服务,是指跟静态Web服务相对的一种网页编程技术。相对静态网页而言,页面代码虽然没有变,但是显示的内容却是可以随着时间、环境或者数据库操作的结果而发生改变的。不要将动态网页和页面内容是否有动感混为一谈。这里说的动态网页,与网页上的各种动画、滚动字幕等视觉上的动态效果没有直接关系,动态网页也可以是纯文字内容的,也可以是包含各种动画的内容,这些只是网页具体内容的表现形式,无论网页是否具有动态效果,只要是采用了动态网站技术生成的网页都可以称为动态网页。
而请求Web服务响应的对象,则称为客户端,在Web客户端不断的增强其信息展现能力和客户交互能力的同时,Web服务也悄悄的由静态向动态逐步发展,不断完善着。但最早的Web服务器只能响应Web客户端发送的HTTP请求,并将存储在Web服务器上的文件返回。如果要是能够根据客户的不同请求来动态的创建HTML文件,是不是会更好?基于这样的理论也就产生了CGI(Common Gate Interface,通用网关接口)技术。
二、CGI技术
CGI是用于连接网页和应用程序的接口,通过CGI的技术,可以实现在Web服务端进行数据库查询等复杂操作,并对其进行一系列操作后的数据进行封装,动态产生HTML文件响应给客户端,这为客户端和服务器端间交互动态信息起了传输纽带的作用。
三、HTTP协议
HTTP(HyperText Transfer Protocol,超文本传输协议)是分布式的Web应用的核心技术协议,该协议基于请求/响应模式,无状态,在TCP/IP协议栈中属于应用层,之所以说HTTP是无状态协议,是因为此协议一次请求和响应构成一个独立的事务,各事务间没有状态的联系。
1、客户端访问Web服务器的几个阶段
建立请求
客户端(浏览器)使用HTTP命令(GET或POST方法)向服务器发出Web请求。(在此处需要DNS能够解析到服务器的IP地址后,通知到客户端才能知道服务器在那里)
接收连接
服务器端接收到请求后,服务器响应该请求,并在客户和服务器之间建立连接。
处理请求
Web服务器查找客户端所请求的资源,有两种结果:其一,资源不存在,则服务器发送一个相应的错误提示文档给客户端。
访问资源
其二,如果Web服务器查找到所需要的资源。
构建响应
则会将所请求的资源进行整合,并封装。
发送响应
由服务器端发送响应到客户端
记录日志
服务器端将资源传输到客户端后,会将事务日志处理过程记录到日志之中。
当客户端浏览资源成功后,便会与服务器断来连接。
三、HTTP各种特性
1、持久连接
KeepAliva {on|off}
MaxkeepAliveRequests 100
KeepAliveTimeout 15
2、MPM参数:prefork、worker、event
<Ifmodule prefork.c>
StartServers 8 启动多少个进程
MinSpareServer 5 最小空闲进程
MaxSpareServer 20 最大空闲进程
ServerLimit 256最多多少进程
Maxclients 256最多客户端数量
MaxrepuestsPerChild 4000 每个进程允许在其生命里处理多少个请求
</IfModule>
3、指定监听的地址和端口
Listen [IP:] PORT
此指令可以重复指定多次:
4、DSO机制装载的模块
显示:
httpd -D DUMP_MODULES
loadModule Module_Name/path/to/module_file
5、指定站点根目录
DocumentRoot ”/path/to/somewhere“
6、站点路径访问控制
基于本地文件系统路径:
<Directory ”/path/to/somewhere“>
</Directory>
基于URL访问路径做访问控制:
<Location "/path/to/URL"
</location>
7、于dirctory中可用的访问控制
(1)Option
Indexes:当访问的路径下无默认主页面时,将所有资源以列表的形式呈现给用户非常危险,慎用
FollowSymlinks:跟踪符号链接和Indexes一样
(2) AllowOverride
支持在每个页面下创建.htaccess用于实现对此目中资源访问时的访问控制功能。
8、基于IP做访问控制
Order allow,deny
Allow from all
deny在前做白名单
allow在前做黑名单
rom后面能接受的地址格式:
Ip,Network Address
网络地址格式较为灵活:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
9、定义默认的主页面
DirectoryIndex
越优先的越写在前面
10、配置日志功能
Errorlog ”/path.to.error_log“ 错误日志
loglevel {dedug|info|notice|warn|error|crit|alert|emerg} 日志级别
logformat
customlog "/path/to/access_log"logformat_Name
%h;客户端地址
%l:远程登录名,通常为-
%u:认证时输入用户名,没有认证时间为-
%t:服务器收到用户请求时间
%r:请求报名的起始行
%>s:响应状态码
%b:响应报文的长度,单位是字节
%{HEADER_NAME}i:记录指定首部对应的值
11、路径别名
实现URL路径的映射,从而所访问的资源不再依赖于站点根目录
Alias /URL/ ”/path/to/somewhere“
12、设定默认字符集
字符集:GB2312、GB18030、GBK
adddefaultcharset
13、CGI脚本
CGI脚本路径别名
/var/www/cgi-bin/
httpd://server/cgi-bin/
bash脚本写CGI
所有文本都使用命令输出:echo,printf,cat
执行程序:命令引用
fastCGI:协议
14、基于用户做访问控制
用户认证:
基本认证:基于明文发送:basic
摘要认证:digest
虚拟用户:不是用于登陆操作系统用户,仅用于访问某服务或获取某资源的凭证
文本文件:.htpasswd
存放账号密码的地方:
SQL数据库
dbm:基于文本文件存放的数据库引擎,提供API
ldap:轻量级目录访问协议
authentication provider:账号和密码的存储机制
authn
authorizetionprovider :授权
案例:基于文件做访问控制
(1)基于用户进行认证
(2)创建认证文件
Htpasswd
-c:此文件事先不存在,则创建,注意,只能在创建第一个用户时使用
-m:以md5的格式存储用户的密码信息
-D:删除指定用户
(3)组认证
先创建用户,在创建组
15、虚拟主机
虚拟主机:使用不同的访问路径
基于端口
基于IP
基于主机名
(1)使用虚拟主机前提,要取消主服务器
注释主服务器的站点根路径指定:Documentroot
(2)定义虚拟主机
NameVirtualhost IP:PORT(2.2才有2.4没有)
NameVirtualhost *:PORT(监听所有)
<Virtualhost IP:PORT>
ServerName
DocumentRoot
ServerAlias
ErrorLog
CustomLog
</Virtualhost>
配置文件语法检查:
httpd -t
service httpd configtext
测试:elinks 文本游览器
-dump:获取到页面数据后直接退出进程
16、https协议
ssl(安全的套接字层),tls(传输层安全)
http:基于文本编码(明文)
验证:使用telnet发请求(http截图)
http协议:文本编码
验正:使用telnet发请求
# telnet 172.16.249.53 80
Trying 172.16.249.53...
Connected to 172.16.249.53
Escape character is '^]'.
GET /index.html HTTP/1.0
Host: www.b.org
HTTP/1.1 200 OK
Date: Fri, 08 Aug 2014 03:03:51GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Fri, 08 Aug 201402:14:52 GMT
ETag:"e0009-12-50014c53e753f"
Accept-Ranges: bytes
Content-Length: 18
Connection: close
Content-Type: text/html;charset=UTF-8
<h1> Host B </h1>
Connection closed by foreignhost.
httpd:ssl
ssl模块
单独成包
ssl会话基于Ip地址创建,所有,每一个IP仅创建一个ssl会话
ssl握手要完成的工作
交换协议版本号
选择双方都支持的加密方式
客户端对服务器端实现身份验证
密钥交换
https协议:基于SSL二进制编码,443/tcp
openssls_client
客户端验证服务器端证书:
有效期检测:证书是否仍然在有限期内
CA的有效性检测:是否能解密
证书签名检测:
持有者的分支检测:
配置httpd工作于https模型:
1、安装mod_ssl模块
yum install mod_ssl
2、为服务器生成私钥,并为其提供证书
mkdir /etc/httpd/ssl
3、配置实用https的虚拟主机
4、重新装载配置
5、测试
openssl s_client -connect IP:PORT -cafile /path/to/ca_certificate
配置httpd工作于https:
(1) 安装mod_ssl模块
# yum install mod_ssl
(2) 为服务端生成私钥,并为其提供证书;
# mkdir /etc/httpd/ssl && cd/etc/httpd/ssl
# (umask 077; openssl genrsa -outhttpd.key 1024)
# openssl req -new -key httpd.key-out httpd.csr
签署后的证书为:/etc/httpd/ssl/httpd.crt
(3) 配置使用https的虚拟主机;
SSLCertificateFile
SSLCertificateKeyFile
<VirtualHost IP:443>
DocumentRoot
ServerName
</VirtualHost>
(4) 重新装载配置
(5) 测试
# openssl s_client -connect IP:PORT-CAfile /path/to/ca_certificate
17、status页面
httpd内嵌有handler(处理器),其中有一个handler用于输出当前httpd服务相关状态信息
handler:server-status
启用handler要使用sethandler指令
handler:当文件被调用时,apache内部的表示形式:一般每种文件类型都有隐时处理器
18、访问属性配置总结
配置文件系统访问路径
<directory [~]"">
</directory>
<file [~]"">
</file>
配置URL访问路径:
<location [~]"">
</location>
<locationmatch "">
</locationmatch>
19、curl命令
-A/--user-agen<string> 设置用户代理发送给服务器
-e/--referer
-I
curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET,DICT, FILE及LDAP等协议。curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器, cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,,http代理服务器管道( proxy tunneling),甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-basic 使用HTTP基本验证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
--compressed 要求返回是压缩的形势
-H/--header <line>自定义头信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
20、使用mod_deflate模块压缩页面优化传输速度
SetOutputFilter DEFLATE
# mod_deflate configuration
# Restrict compression to these MIMEtypes
AddOutputFilterByType DEFLATEtext/plain
AddOutputFilterByType DEFLATEtext/html
AddOutputFilterByType DEFLATEapplication/xhtml+xml
AddOutputFilterByType DEFLATEtext/xml
AddOutputFilterByType DEFLATEapplication/xml
AddOutputFilterByType DEFLATEapplication/x-javascript
AddOutputFilterByType DEFLATEtext/javascript
AddOutputFilterByType DEFLATEtext/css
# Level of compression (Highest 9 -Lowest 1)
DeflateCompressionLevel 9
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4gzip-only-text/html
# Netscape 4.06-4.08 have some moreproblems
BrowserMatch ^Mozilla/4\.0[678]no-gzip
# MSIE masquerades as Netscape, butit is fine
BrowserMatch \bMSI[E] !no-gzip!gzip-only-text/html
21、httpd程序包自带的工具介绍
httpd:
Apache服务器程序
-t:测试配置文件
-l:列表静态模块
-D DUMP_MODULES:列出DSO模块
-M:相当于-t
htpasswd:
为基于文件的basic认证创建和更新用户认证文件
apachectl:
脚本,httpd服务器控制工具:Apache自带
ab:Apache benchmark
httpd的基准性能测试工具
apxs:
httpd得以扩展使用第三方模块的工具
htcacheclean:
磁盘缓存清理工具
htdigest:
为digest认证创建和更新用户认证文件
httxt2dbm:
为rewrite map创建dbm格式的文件
rotatelogs:
不关闭httpd而切换其使用的日志文件工具
suexec:
User apache
Group apache
当httpd进程需要以另外的用户的身份去访问某些资源时,可以以suexex作临时切换
22、ab工具的初步使用
同类工具:http_load,webbench,seige,TCPcopy
Usage:ab [options] [http[s]://]hostname[:port]/path
-c #:模拟的并发数
-n #:总的请求数
-n的值一定要大于等于-c的值
23、资源限定:(# 代表数字)
ulimit
软限定:
可临时超出一定时长的上限
硬限定:
绝对不能超出的上限
管理员可使用ulimit命令临时性的修改各自资源的软限制:
ulimit -n # :能同时打开的文件数
-u # :能同时启动的进程数
永久修改此限定需要修改配置文件:
/etc/security/limits.conf
/etc/security/limits/*.conf
24、编译安装httpd-2.4
httpd-2.0
httpd-2.4 C7
httpd-2.2 C6
httpd程序依赖于apr和apr-util
apr:apache portable runtime
httpd-2.4的新特性:
1、MPM支持在运行时装载:
--enable-mpms-shared=all--with-mpm={prefork|worker|event}
2、支持event mpm
3、异步读写
4、支持在每模块及每目录上分别使用不同的日志级别
5、每请求的配置:<If>,<Elseif>
6、增强版的表示式分析器
7、支持毫秒级的keep alive的超时时间timeout
8、支持基于FQDN的虚拟主机不在需要NameVirtuahome
9、支持用户自定义变量
新增了一些模块:
mod_proxy_fcgi,mode_reateinit,mod_request,mod_remoteip
修改了一些配置机制:
不再支持使用order,allow,deny定义基于ip的访问控制:改为require
基于IP做访问控制:
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制某特定主机的访问:
require ip IPADDR
require not IPADDR
IPADDR:
单个ip
network/Netmask:
network/length:172.16.0.0/16
net:172.16
require host HOSTNAME
require not HOSTNAME
HOSTNAME:
FQDN:具体主机
DOMAIN:域内的所有主机