httpd软件详解
Web Service
传输层:提供进程地址
Port Number:
tcp:传输控制协议,面向连接的协议:通信钱需要建立虚拟链路,结束后拆除链路
0-65535
udp:User Datagram Protocol,无连接的协议
0-65535
IANA:
0-1023:特权端口,这些端口永久分配给固定的应用使用,22/tcp(ssh),80/tcp(http),443/tcp(https)
1024-41951:亦为注册端口,但要求并不是特别严格,分配给程序注册的某应用使用,11211/tcp,11211/udp(memcache),3306/tcp(mysql)
41952+:客户端程序随机使用的端口:动态端口或私有端口,其范围的定义: /proc/sys/net/ipv4/ip_local_port_range
Socket:IPC的一种实现,运行位于不同主机(甚至同一主机)上不同进程之间进行通信:数据交换,Socket API
SOCK_STREAM:tcp套接字
SOCK_DGRAM:UDP套接字
SOCK_RAW:裸套接字
Socket Domain(根据其所使用的地址)
AF_INET:Address Family,ipv4
AF_INET:Address Family,ipv6
AF_UNIX:同一主机不同进程之间通信时使用
每类套接字都至少提供了两种socket;流,数据报
流:可靠地传递、面向连接、无边界
数据包:不可靠地传递、有边界、无连接
套接字相关的系统调用:
socket():创建一个套接字
bind():绑定
listen():监听
accept():接收请求
connect():请求连接建立
write():发送
read():接收数据
send(),recv(),sendto(),recvfrom()
IPV4:
分类:
A:1-127
B:128-191
C:192-223
D:224-239
E:240-254
私有地址:
A:10.0.0.0/8
B:127.16.0.0/16-172.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24
TCP协议的特性:
建立连接:三次握手
将数据打包成端:校验和(CRC-32)
确认、重传以及超时;
排序、逻辑序号
流量控制、滑动窗口算法
拥塞控制:慢启动和拥塞避免算法
http:hyper text transfer protocol
html:编程语言,超文本标记语言
<html>
<head>
<title>
TITLE
</titlet>
</head>
<body>
<h1></h1>
<p>test..<a href="http://www.sjie.com/logo.jpg">sjie</a></p>
<h2></h2>
</body>
</html>
CSS:层叠样式表(cascading Style Sheet)
JS:JavaScript
MIME:Multipurpose Internet Mail Extesion
工作机制:
http请求
http响应
web资源:web resource
静态文件:.jpg .gif .html .txt .css .js .mp3 .avi
动态文件:.php .jsp
媒体:
媒体类型(MIME类型):major/minor
text/html
text/plain
image/jepg
image/gif
URI:Uniform Resource Identifier
URL:uniform Resource Locator,用来描述某服务器某特定资源的位置
Scheme://Server:Port/path/to/resource
http://www.sjie.com/images/logo.jpg
URN:Uniform Resource Naming
Http协议版本:
HTTP/0.9:原型版本
HTTP/1.0: 第一个广泛使用的版本,支持MIME
HTTP/1.1:增强了缓存功能
spdy:Google研发的
HTTP/2.0:
一次完整的HTTP请求:
(1)建立或处理请求:接收请求或拒绝请求
(2)接收请求:
接收来自于网络的请求报文中对某资源的一次请求的过程
并发访问响应模式(web I/O):
单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
多进程I/O结构:并行启动多个进程,每个进程响应一个请求
复用I/O结构:一个进程响应n个请求:
多线程模型:一个进程生成N个线程,每个线程响应一个用户请求
事件驱动:event-driver
复用的多进程I/O结构:启动多个进程,每个进程响应N个请求
(3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息
元数据:请求报文首部
<method> <URL> <VERSION>
Host:www.sjie.com 请求的主机名称
Connection:
(4)访问资源:获取报文中请求的资源
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
web服务器资源路径映射方式:
(a) docroot
(b) alias
(c) 虚拟主机docroot
(d) 用户家目录docroot
(5)构建响应报文:
资源的MIME类型:
显式分类
魔法分类
协商分类
URL重定向:
web构建的响应并发客户端请求的资源,而是资源另外一个访问路径
(6)发送响应报文
(7)记录日志
HTTP服务器程序:
httpd(apache)
nginx
lighttpd
应用程序服务器:
IIS
tomcat,jetty,jboss,resin
webshpere,weblogic,oc4j
HTTPD的安装配置和使用
httpd:apache
httpd的特性:
高度模块化:core + modules
DSO:Dynamic Shared Object
MPM:Multipath Processing Modules
perfork:多进程模型,每个进程响应一个请求:
一个主进程,负责生产n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求,即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达,最大不会超过1024个
worker:多线程模式(多进程生成的,一个进程生成多个线程),一个线程响应一个请求
event:事件驱动模型,一个线程响应多个请求
HTTPD安装:
安装方式:
rpm
编译
程序环境:
配置文件:
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本:
/etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/http
主程序文件:
/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
配置文件的组成:
grep "Section" /etc/httpd/conf/httpd.conf
##Section 1: Global Environment
##Section 2: 'Main' server configuration
##Section 3: Virtual Hosts
配置格式: directive value
directive:不区分字符大小写
value:为路径时,取决于文件系统
常用配置:
1,修改监听的IP和Port
Listen [IP:]PORT
省略IP表示监听本机所有IP;Listen可重复出现多次
2,持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成
如果断开?
数量限制:100
时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使用有些请求得不到响应
折中:使用较短的持久连接时间
httpd-2.4 支持毫秒级持久时间
非持久连接
KeepAlive On|Off
MaxKeepAliveRequests
KeepAliveTimeout
3,MPM
Multipath Process Module:多信道处理模块
prefork,worker,event
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持,默认为prefork
httpd -l : 查看编译的模块
更换httpd启动程序
修改/etc/sysconfig/httpd中的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>
4,DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
模块路径可使用相对地址
相对于ServerRoot指向的路径而言:
/etc/httpd/module
5,定义'Main' server的文档页面路径
DocumentRoot
文档路径映射:
DocumentRoot指向的路径为URL路径的起始位置:
DocumentRoot "/var/www/html"
test/index.html -->http://HOST:PORT/test/index.html
6,站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径:
<Directory ""></Directory>
<File ""></File>
<FileMatch ""></FileMatch>
URL路径:
<Location ""></Location>
访问控制机制
基于来源IP:
基于账号:
7,Directory中基于来源地址实现访问控制
(1)Options
所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
Indexes:索引;
FollowSymlinks:允许跟踪符号链接文件
(2)基于来源地址的访问控制机制
Order:检查次序
Allow from
Deny from
来源地址:
IP
NetAddr:
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
8,定义默认主页面
DirectoryIndex index.html index.html.var
9,日志设定
错误日志:
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) -表示为空;
%t:服务器收到请求的时间;
%r:请求报文的首行信息(method url version);
%>s:响应状态码
%b:响应报文的大小,单位是字节,不包括响应报文的首部
%{Referer}i:请求报文当中的"referer"首部的值,当前资源的访问人口,即从哪个页面中的超链接跳转而来;
%{User-Agent}i:请求报文当中"User-Agent"首部的值:即发出请求用到的应用程序
10,路径别名
Alias /URL/ "/PATH/TO/SOMEDIR/"
Alias /bbs/ "/forum/htdocs"
http://www.sjie.com/bbs/index.html
--> /forum/htdocs/bbs/
11,设定默认字符集
AddDefaultCharset UTF-8
12,基于用户的访问控制
认证质询:
WWW-Authenticate:响应码是401,拒绝客户端请求,并说明要求客户提供账号和密码
认证:
Authentization:客户端用户填入账号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源
认证类型:
basic:明文
digest:消息摘要
安全域:需要用户认证后方能访问的路径:
应该通过名称对其进行标识,并用户告知用户认证的原因
用户账号和密码存储于何处
虚拟账号:仅用于访问某服务时用到的认证标识
存储:
文本文件
SQL数据库
ldap
nis
basic认证:
(1)定义安全域
<Directory "">
Options None
AllowOverride None
AuthType Basic
AuthName "STRING"
AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE"
Require user username1 username2 #允许文件中的所有用户 Require valid-user
</Directory>
(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_USER_PASSWD_FILE"
AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
Require group GROUP1 GROUP2
</Directory>
需要用户账号文件和组文件:
组文件:每一行定义一个组
GROUP_NAME:user1 user2 user3 ...
13,虚拟主机
有三种实现方案:
基于IP:
为每个虚拟主机只是一个IP地址;
基于port:
为每个虚拟主机准备至少一个专用port;实践中很少使用;
基于hostname:
为每个虚拟主机准备只是一个专用的hostname;
注意:一般虚拟主机莫与中心主机混用,要使用虚拟主机,先禁用中心主机:
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置:
<VirtualHost "IP:PORT">
ServerName
DocumentRoot ""
</VirtualHost>
SeverAlias:虚拟主机的别名
ErrorLog
CustomLog
<Directory>
</Directory>
基于IP地址的虚拟主机:
<VirtualHost 192.168.1.1:80>
ServerName web1.sjie.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.2:80>
ServerName web2.sjie.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
基于端口的虚拟主机:
<VirtualHost 192.168.1.1:80>
ServerName web1.sjie.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.1:8080>
ServerName web2.sjie.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
基于主机名的虚拟主机:
<VirtualHost 192.168.1.1:80>
ServerName web1.sjie.com
DocumentRoot "/vhosts/web1/htdocs"
</VirtualHost>
<VirtualHost 192.168.1.1:80>
ServerName web2.sjie.com
DocumentRoot "/vhosts/web2/htdocs"
</VirtualHost>
14,内置的status页面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 192.168.1.1
</Location>
15,使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU,同事有些老的浏览器不支持
(2) 压缩适于压缩的资源,例如文件
SetOutputFilter DEFLATE
#压缩的资源类型
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
DeflateCompressionLevel 9
BrowserMatch ^Mozilla/4 gzip-only-text/html
BrowserMatch ^Mozilla/4\.0[678] no-gzip
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
16,https
http over ssl = https 443/tcp
ssl:v3
tls:v1
ssl会话简化:
(1)客户端发送可供选择的加密方式,并向服务器请求证书
(2)服务器端发送整数以及选定的加密方式给客户端
(3)客户端取得整数并进行证书验证
如果信任给其发证书的CA
(a)验证证书来源的合法性:用CA的公钥解密证书上数字签名
(b)验证证书的内容的合法性
(c)检查证书的有效期限
(d)检查整数是否被吊销
(e)证书中拥有者的名字,与访问的目标主机要一致
(4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
(5)服务用此密钥加密用户请求的资源,响应给客户端
注意:SSL会话是基于IP地址创建,所以单IP仅可以使用一个HTTPS拟主机
配置httpd支持https
(1)为服务器申请数字证书
测试:通过私有CA发证书
创建私有CA
在服务器创建证书签署请求
CA签证
(2) yum install -y mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
17,httpd自带的工具程序
htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl:httpd 自带的服务控制脚本,支持start,stop
apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具
rotatelogs:日志滚动工具
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行
ab:Apache Benchmark
ab [options] URL
-n:总的请求数
-c:模拟的并发数
-k:以持久连接模式测试
Http协议和HTTPD的配置
URL:Uniform Resource Locator
URL方案:scheme
服务器地址:ip:port
资源路径:
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params:参数
http://www.sjie.com/bbs/hello;gender=f
query:查询
http://www.sjie.com/bbs/item.php?username=tom&title=abc
frag:锚定
http://www.sjie.com/doc/install/index.html#rpm
HTTP协议:
HTTP/0.9 HTTP/1.0 HTTP/1.1 HTTP/2.0
HTTP协议,stateless
服务器无法持续追踪访问者来源
cookie,session
报文语法格式:
request报文
<method><request-url><version>
<headers>
<entity-body>
response报文:
<vsersion><status><reason-phrase>
<headers>
<entitiy-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 错误类信息,服务器端错误
常用状态码:
200:成功,请求的所有数据通过响应报文的entity-body部分发送
301:请求的URL指向的资源以及被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置:Moved Per
302:与301相似,但在响应报文中通过Location指明资源现在所处临时新位置:Found
304:客户端发出了条件式请求,但服务器上的资源未发生改变,则通过响应此响应码通过客户端:Not Modified
401:需要输入账号和密码认证方能访问资源:Unauthorized
403:请求被禁止:Forbidden
404:服务器无法找到客户端请求的资源:Not Found
500:服务器内部错误:Internal Server Error
502:代理服务器从后端服务器收到了一条伪响应:Bad Gateway
首部分类:
通用首部:
Date:报文的创建时间
Connection:连接状态,如keep-alive,close
Via:显示报文经过的中间节点
Cache-Control:控制缓存
请求首部:
Accept:通过服务器自己可接受的媒体类型
Accept-Charset:
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-IP
Host:请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源
User-Agent:客户端代理
响应首部:
信息性:
Age:响应持续时长
Server:服务器程序软件名称和版本
协商首部:
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其他首部列表
安全响应首部:
Set-Cookie:向客户端设置cookie
Set-Cookie2:
www-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:
Allow
Location
Content-Encoding:
Content-Language:
Content-Length:主体的长度
Content-Location:实体的真正所处位置
Content-Type:主体的对象类型
Etag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间
扩展首部
Curl命令用法:
Curl是基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELENT,DIVCT,FILE及LDAP等协议。curl支持HTTPS的认证,并HTTP的POST,PUT等方法。
curl [options] [URL]
-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[:passwd]> 设置服务器的用户和密码
-0/--http1.0 使用HTTP1.0
elinks [OPTIONS] [URL]
--dump:不进入交互模式,把文档输出到标准输出