Web Service
ISO模式上三层为应用细节由用户进程完成,下四层的内容通信细节有内核完成
传输层:提供进程通信地址(即进程所使用的端口号)
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 (memcached), 3306/tcp(mysql)
41952+:客户端程序随机使用的端口;动态端口,或私有端口;其范围的定是义:/proc/sys/net/ipv4/ip_local_port_range
Socket:(IP地址+协议端口) IPC的一种实现,允许位于不同主机(甚至同一主机)上不同进程之间进行通信;数据交换;
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAW: 裸套接字
IPv4:
分类:
A:1-127
B:128-191
C:192-223
D:组播,224-239
E:240-254
私有地址:
A:10.0.0.0/8
B:172.16.0.0/16-172.31.0.0/16
C:192.168.0.0/24-192.168.255.0/24
TCP协议的特性:
建立连接:三次握手
将数据打包成段:校验和(CRC-32)
确认、重传以及超时:
排序:逻辑序号
流量控制:滑动窗口算法
拥塞控制:慢启动和拥塞避免算法
端口连接需要四次挥别,为确认A断开B B也断开A
Socket Domain(根据其所使用的地址):
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主机上不同进程之间通信时使用;
每类套接字都至少提供了两种socket:流,数据报
流:可靠地传递、面向连接、无边界;
数据报:不可靠地传递、有边界、无连接;
套接字相关的系统调用:
socket(): 创建一个套接字;
bind():绑定
listen():监听
accept():接收请求
connect():请求连接建立
write():发送
read():接收
send(), recv(), sendto(), recvfrom()
http: hyper text transfer protocol, 80/tcp
html: 编程语言,超文本标记语言;
<html>
<head>
<title>TITLE</title>
</head>
<body>
<h1></h1>
<p> blabla... <a >href="http://www.magedu.com/logo.jpg"> blabal </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, .js, .css, .mp3, .avi
动态文件:.php, .jsp,
媒体:
媒体类型(MIME类型):major/minor
text/html
text/plain
image/jpeg
image/gif
URI: Uniform Resource Identifier 用来标示一个唯一的资源
URL: Uniform Resorce Locator,用于定位某服务器某特定资源的位置;
Scheme://Server:Port/path/to/resource
http://www.magedu.com/images/logo.jpg
URN: Uniform Resource Naming 用来为某个资源命名
http协议版本:
HTTP/0.9:原型版本,功能简陋
HTTP/1.0:第一个广泛使用的版本,支持MIME
HTTP/1.1: 增强了缓存功能
spdy
HTTP/2.0:
rfc
一次完整的http请求处理过程:
(1) 建立或处理连接:接收请求或拒绝请求
(2) 接收请求:
接收来自于网络的请求报文中对某资源的一次请求的过程;
并发访问响应模型(Web I/O):
单进程I/O结构:启动一个进程处理用户请求,而且一次只处理一个;多个请求被串行响应;(需要排队等待)
多进程I/O结构:并行启动多个进程,每个进程响应一个请求;prework模型
复用I/O结构:一个进程响应n个请求; 多线程模型:一个进程生成N个线程,每个线程响应一个用户请求;
事件驱动机制:event-driven 与多线模型并无多大区别
复用的多进程I/O结构:启动多个(m)进程,每个进程响应n个请求;
(3) 处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息
元数据:请求报文首部
<method> <URL> <VERSION>(请求的起始行)
Host: www.magedu.com 请求的主机名称
Connection:指明连接使用的方式
(4) 访问资源:获取请求报文中请求的资源
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源;这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
URL中的根映射为服务器文件系统中的/var/www/html/
在此文件目录下的images/1.jpg映射URL如下
http://www.magedu.com/images/1.jpg
web服务器资源路径映射方式:
(a) documentroot
(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
www.netcraft.com
httpd的安装配置和使用:
httpd: apache
a patchy server = apache
ASF: apache software foundation
httpd的特性:
高度模块化:core + modules
DSO: Dynamic Shared Object
MPM:Multipath Processing Modules
prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;
worker:多线程模型,每个线程响应一个请求;
一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;
event:事件驱动模型,每个线程响应n个请求;
一个主进程:生成m个子进程,每个进程直接n个请求;
httpd-2.2: event为测试使用
httpd-.24:event可生产使用
httpd的功能特性:
虚拟主机
IP、Port、FQDN
CGI:Common Gateway Interface,通用网关接口实现动态页面的;
反向代理
负载均衡
路径别名
丰富的用户认证机制
basic
digest
支持第三方模块
安装httpd:
rpm包
源码编译安装
回顾:
MPM:
prefork: 多进程模型,每个进程响应一个请求;
worker:多线程模型,第个线程响应一个请求;
event:事件驱动模型,一个线程响应多个请求;
并发服务器响应请求:
单进程I/O模型
多进程I/O模型
复用的I/O模型
多线程模型
事件驱动
复用的多进程I/O模型
httpd的基本配置和应用(2)
httpd.apache.org
2.2(更稳定)
2.4(功能也更多)
rpm包安装的httpd的默认工作目录(称之为httpd的根目录):/etc/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.worker (worker)
/usr/sbin/httpd.event (event)
2.4版本提供DSO
日志文件目录:
/var/log/httpd
access_log: 访问日志文件
error_log: 错误日志(有可能存放服务开启和关闭的信息)
站点文档目录:
/var/www/html(存放默认主页)
service httpd reload 重新加载httpd资源
配置文件:
Directive Value
指令 值
# grep "Section" httpd.conf
### Section 1: Global Environment
### Section 2: ‘Main‘ server configuration
### Section 3: Virtual Hosts
‘Main‘ server和Virtual Hosts不能同时启用;默认启用的是‘Main‘ server;
修改/etc/httpd/conf/httpd.conf
1、指定监听地址和端口(在Section 1部分中)
Listen [IP:]80
(1) IP省略时表示监听本机上所有可用的IP地址;
(2) Listen指令可以出现多次,用于指明多个不同的监听端口或套接字:
Listen 172.16.100.11:80
Listen 172.16.100.11:8080(额外监听)
修改了端口需要重启服务而不是重新加载 service httpd reset
2、持久连接相关(在Section 1部分中)
持久连接:连接建立后,每个资源获取结束不会断开连接,而继续等待其它
资源请求并完成传输;(为了减少建立连接的次数,一个页面有多个请求,
每个请求完成断开,下一个请求又要重新建立连接,效率低下)
控制连接断开?
数量限制:传输完成资源的数量后关闭如100个
时间限制:超时没有资源传输,如60秒
劣势:对并发访问量较大的服务器,开持久连接会让有些请求等待
得不到的及时的服务器的进程服务;
改进:减短时间限制,httpd-2.4支持毫秒级(能进行持久连接,也
不影响请求等待服务)
非持久连接:每个资源都是单独通过专用的连接进行获取(让每一个请求尽快得到服务)
KeepAlive Off|On (是否开持久连接)
MaxKeepAliveRequests 100(数量限制最大请求的资源数)
KeepAliveTimeout 15(时间限制最长持久连接的时间)
数量限制和时间限制达到一个便可以断开持久连接
测试:
# telnet Server 80
GET /URL HTTP/1.1
Host: Server
3、MPM
多路处理模块:并发请求响应的不同实现
prefork, worker, event
httpd-2.2 不支持同时编译多个不同的MPM,rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持;确认当前用哪一个方法:
# ps aux | grep httpd
默认为/usr/sbin/httpd,是prefork模式;
查看模块列表:
httpd -l: 查看静态编译的模块
httpd -M: 查看所有模块,包括静态编译和DSO模块
httpd -t -D DUMP_MODULES效果等同httpd -M
更换支持不同的MPM的主程序:
编辑/etc/sysconfig/httpd文件
启用变量取消注释符#:HTTPD(为其赋值为想要的模式)
HTTPD=/usr/sbin/httpd.worker
/etc/httpd/conf/httpd.conf主配置文件Section 1中关于 MPM的配置内容
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start # MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8(表示服务启动时会默认启动8个空闲子进程 进程的用户为阿帕奇)
MinSpareServers 5(表示最少空闲的子进程数必须有5个)
MaxSpareServers 20(表示最大空闲的子进程数必须有20个)
ServerLimit 256(最多保留256子进程去响应用户的请求在服务的生存周期)
MaxClients 256(最多并行响应256个用户的请求)
MaxRequestsPerChild 4000(每个子进程最多响应4000个)
</IfModule>
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4 (httpd服务刚起时候会有四个apache用户启动的4个子进程httpd.worker,因为空闲时最多只允许75个线程,而每个子进程最多生成25个线程,75/25=3,所以待空闲后只存在3个子进程httpd.worker)
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25(每一个子进程最多生存25个线程)
MaxRequestsPerChild 0(每个子进程响应的请求数量不限制)
</IfModule>
4、DSO 在Section 1部分
配置指令模块加载:
LoadModule <module_name> <module_path>
关闭模块,配置文件的相应模块的Load行注释掉便行
模块路径:可使用相对路径
相对于ServerRoot指令指向的位置而言;
注意:建议使用service httpd reload重新装载配置文件
5、定义‘Main‘ server的文档页面路径 在Section 2部分中
DocumentRoot指令 DocumentRoot ”/var/www/html”指定了URL起始(根位置),修改DocumentRoot后的指向路径
文档路径映射:
DocumentRoot指向的路径为URL起始的位置
/var/www/html/images/1.jpg
http://server/images/1.jpg(server后的跟/映射为服务器的/var/www/html/文件目录)
6、站点路径访问控制
访问控制机制:(在指定资源的模块中设置控制机制)
基于来源地址
基于账号
资源模块的定义的方式有两种:
文件系统路径:
<Directory "/PATH/TO/SOMEDIR">
...(访问机制等设定)
</Directory>
URL路径:
<Location "/URL">
...(访问机制等设定)
</Location>
7、Directory中的访问控制定义
(1) Options
Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用;
FollowSymLinks:如果某页面文件链接文件,是指向DocumentRoot之外路径上的其它文件时,打开该链接文件时将直接显示目标文件的内容;
内容协商机制
None: none所有特性都不启用;
All: 所有的都启用;
(2) 基于来源地址访问控制
Order: 检查次序
Order Allow Deny:只有明确Allow的来源地址,才允许访问,其它没明确的均为Deny
Order Deny Allow: 只有明确Deny的来源地址,才允许访问,其他没明确的均为Allow
Allow from:允许访问的来源地址
Deny from:拒绝访问的来源地址
Order Allow Deny
Deny from 172.16.100.2
Allow from 172.16.0.0/16
from后可跟上的地址格式:
IP地址;
网络地址:
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指定级别后比级别级别高的都会记录
访问日志:要定义日志格式(LogFormat事先定义号某种模式并取名,以供后面的Customlog参数调用格式名字)
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog logs/access_log combined
%h: Remote host,客户端主机
%l: Remote logname (from identd, if supplied). 客户用户通过identd登录时使用名称;一般为-;
%u: Remote user (from auth; may be bogus if return status (%s) is 401),用户认证登录的名字;无登录机制一般-;
%t: Time the request was received (standard english format),收到客户端请求时的时间;
\": 转译显示引号本身,而不作为引用符号;
%r:First line of request,请求报文的首行
<method> <url> <version>
%>s:响应状态状态码
%b: Size of response in bytes, excluding HTTP headers,响应报文的大小,单位为字节;不包含首部信息;
%{Referer}i:记录Http首部Referer对应的值;即访问入口,从哪个页面跳转至此页面;
%{User-Agent}i:记录http首部User-Agent对应的值;即浏览器类型;
详情: http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
10、路径别名
DocumentRoot "/var/www/html"
download
mp3
1.mp3
bbs
index.html
URL: http://www.magedu.com/download/mp3/1.mp3
URL: http://www.magedu.com/bbs/index.html
Alias /URL/ "/path/to/some_directory"
例如:Alias /bbs/ "/web/bbs/htdocs/(此为web服务器文件系统内的路径名)"
URL: http://www.magedu.com/bbs/index.html --> /web/bbs/htdocs/index.html
Alias /images/ "/web/pics/"
URL: http://www.magedu.com/images/a.jgp --> /web/pics/a.jpg
11、设定默认字符集
AddDefaultCharset UTF-8
常用字符集:GBK, GB2312, GB18030
12、基于用户的访问控制
质询:资源存在,但要求用户提供账号和密码才能访问(通过返回数据报文www-authentication)
WWW-Authenticate: 服务器用401状态拒绝客户端请求,说明需要用户提供用户名和密码;弹出对话框;
认证:
Authorization:客户端用户填入账号密码后再次发请求至服务器;认证通过,则请求授权;
DocumentRoot "/var/www/html"
images
bbs
employee/(将此路径定义为安全域)
安全域:指定需要用户认证后方能访问的路径
安全域应该有其名称,用于向用户通知此认证的原因等;
http协议支持的认证方式:
basic:基本
BASE64
digest:摘要
basic认证机制的实现
(1) 把需要做认证的路径定义为安全域
<Directory "/data/web/html/employee">
Options None
AllowOverride None
AuthType Basic
AuthName "Employee Infomation, only for employee"(认证领域的名字)
AuthUserFile /etc/httpd/users/.htpasswd(存放安全域的虚拟账号密码的文件)
Require user tom jerry(控制.htpasswd中可以登录的用户)
</Directory>
Require valid-user: 所有位于AuthUserFile文件中定义的用户都允许登录;
Require user user1 user2 ...: 仅允许user1 user2等出现AuthUserFile文件中定义的特定几个用户登录;
虚拟用户:即非系统用户;
(2) 提供用户的账号文件(在安全域配置中AuthUserFile参数指向的文件 )
htpasswd命令用于维护此文件
htpasswd [ -c ] [ -m ] [ -D ] passwdfile username
-c: 添加第一用户时创建此文件;(只有在passwdfile文件不存在时,创建第一个用户使用)
-m: 以md5格式加密用户密码存放;
-s: 以sha格式加密用户密码存放;
-D:删除指定用户
htpasswd -m /etc/httpd/users/.htpasswd TOM
向认证文件中添加第二个用户,命令输入后会要求输入密码(密码用MD5加密)
(3) 组认证
<Directory "/data/web/html/employee">
Options None
AllowOverride None
AuthType Basic
AuthName "Employee Infomation, only for employee"
AuthUserFile /etc/httpd/users/.htpasswd
AuthGroupFile /etc/httpd/users/.htgroup
Require group GRP1 GRP2 ...
</Directory>
组文件:
每行定义一个组,格式
Grp_Name: User1 User2 ...
13、虚拟主机
一个物理器可以服务于多个站点,每个站点可通过一个或多个虚拟主机来实现;
httpd三种类型的虚拟主机:
基于IP
基于Port
基于FQDN
注意:得首先关闭‘Main‘ server
方法:注释DocumentRoot指令即可;
定义虚拟主机的方法:
<VirtualHost "IP:PORT">
ServerName
ServerAlias
DocumentRoot
</VirtualHost>
注意:大多数可用于全局或‘main‘ server中的指令,都可以定义有VirtualHost中;
示例1:基于IP
<VirtualHost 172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.21:80>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.31:80>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
注意:本机要配置上所有IP地址并能够用于通信;
示例2:基于Port
<VirtualHost 172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.11:808>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.11:8080>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
注意:httpd要监听这里指明的所有端口
Listen
示例3:混用IP和Port
<VirtualHost 172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.21:80>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.11:8080>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
示例4:基于FQDN
NameVirtualHost 172.16.100.11:80(2.2注意启用)
<VirtualHost 172.16.100.11:80>
ServerName www.a.com
DocumentRoot /vhost/a.com/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.11:80>
ServerName www.b.org
DocumentRoot /vhost/b.org/htdocs/
</VirtualHost>
<VirtualHost 172.16.100.11:80>
ServerName www.c.net
DocumentRoot /vhost/c.net/htdocs/
</VirtualHost>
注意:额外经常用于每个虚拟主机的配置有
ErrorLog
CustomLog
<Directory>
<Location>
ServerAlias
14、内置的status页面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from 172.16.0.0/16
</Location>
回顾:
httpd的配置:
Listen [IP:]PORT
KeepAlived {ON|Off}
MPM:
prefork, worker, event
DSO:
LoadModule
httpd -M
DocumentRoot
<Directory>
Options Indexes FollowSymLinks
Order
Allow from
Deny from
</Directory>
<Location>
DirectoryIndex
ErrorLog
CustomLog
LogFormat
%{Referer}i: 引用Referer首部的值;
Alias /URL/ "/path/to/somedir/"
基于用户访问控制:
认证方式:basic, digest
AuthType Basic
AuthName ""
AuthUserFile
AuthGroupFile
Require user
Require group
Require valid-user
.htpasswd:
htpasswd
虚拟主机:IP, Port, FQDN
http协议和httpd的配置
URL:Unifrom Resource Locator
URL方案:scheme(资源交换的方式)
服务器地址:ip:port
资源路径:映射对应服务器文件系统的路径
http://www.magedu.com:80/bbs/index.php,
https://
基本语法:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
params: 参数(用来指明访问时类似填入表单的数据)
http://www.magedu.com/bbs/hello;gender=f
query:指明查询时使用的查询条件
http://www.magedu.com/bbs/item.php?username=tom&title=abc
frag:定义较大页面的某个片段
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86
相对URL同一个站点引用可以使用相对,相对当前资源的位置获得资源
绝对URL夸站点的引用,多数情况使用绝对URL
http协议:
http/0.9, http/1.0, http/1.1, http/2.0
http协议:stateless(无状态)
服务器无法持续追踪客户端访问者来源
cookie(服务器发送cookie给客户端用于标示客户端,当客户端后续访问时会当着cookie),
session(服务器为每个用户建立的微型数据结构,关联的cookie)
http事务:一次客户端发起请求和服务端响应一次
请求:request
响应:response
报文语法格式:
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, 错误类信息,服务器端错误
常用的状态码:
200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但通过响应报文中首部Location指明了资源现在所处的新位置;Moved Permanently(请求的资源不存在原来的路径,告诉客户端新的永久位置)
302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified(此情况客户端就调用自己之前的缓存)
401: 需要输入账号和密码认证方能访问资源;Unauthorized
403: 请求被禁止;Forbidden
404: 服务器无法找到客户端请求的资源;Not Found
500: 服务器内部错误;Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway(上次服务器无法响应代理服务器,很可能是代理服务器网关设置错误)
headers:
格式:
Name: Value
Cache-Control:public, max-age=600
Connection:keep-alive
Content-Type:image/png
Date:Tue, 28 Apr 2015 01:43:54 GMT
ETag:"5af34e-ce6-504ea605b2e40"
Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:access.redhat.com
If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT
If-None-Match:"5af34e-ce6-504ea605b2e40"
Referer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36
首部的分类:
通用首部
请求首部
响应首部
实体首部
扩展首部
通用首部:
Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点
Cache-Control:控制缓存
Pragma:
请求首部:
Accept:通过服务器自己可接受的媒体类型;
Accept-Charset:接受字符集
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-IP:客户端IP
Host: 请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源;
User-Agent:客户端代理(浏览器类型比如用手机浏览器 服务端响应的就是wap型)
条件式请求首部:
Expect:
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改;修改则修正客户端缓存,没有修改则继续沿用缓存
If-Unmodified-Since:
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配;不匹配则返回新的
If-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag匹配;
安全请求首部:
Authorization:向服务器发送认证信息,如账号和密码;
Cookie: 客户端向服务器发送cookie
Cookie2:
代理请求首部:(用于向代理服器)
Proxy-Authorization: 向代理服务器认证
响应首部:
信息性:
Age:响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其它首部列表;
安全响应首部:
Set-Cookie:向客户端设置cookie;
Set-Cookie2:
WWW-Authenticate:来自服务器的对客户端的质询认证表单
实体首部:
Allow: 列出对此实体可使用的请求方法(method 例如get post等)
Location:告诉客户端真正的实体位于何处(发生重定向使用)
Content-Encoding:内容的编码格式(例如显示压缩的方法)
Content-Language:内容的语言
Content-Length: 主体的长度
Content-Location: 实体真正所处位置;
Content-Type:主体的对象类型
缓存相关:
ETag:实体的扩展标签;
Expires:实体的过期时间;
Last-Modified:最后一次修改的时间
15 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 [options] [URL...]
curl的常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器(用户伪装自己的浏览服务器的方式)
-basic 使用HTTP基本认证
--tcp-nodelay 使用TCP_NODELAY选项
-e/--referer <URL> 来源网址(给用户伪装来自某个URL)
--cacert <file> CA证书 (SSL)
--compressed 要求(服务器)返回是压缩的格式
-H/--header <line>自定义头信息传递给服务器
-I/--head 只显示响应报文首部信息
--limit-rate <rate> 设置传输速度
-u/--user <user[:password]>设置服务器的用户和密码
-0/--http1.0 使用HTTP 1.0
用法:curl [options] [URL...]
另一个工具:elinks(全屏网站测试)
elinks [OPTION]... [URL]...
-dump: 不进入交互式模式,而直接将URL的内容输出至标准输出;
16 使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU(服务端和客户端分别需要压缩,解压缩);同时,可能有些较老浏览器不支持;
(2) 压缩适于压缩的资源(压缩比较大),例如文件文件(图片不合适);
如果用在虚拟主机就配置在httpd主配置文件中的虚拟主机部分
SetOutputFilter DEFLATE
# mod_deflate configuration
# Restrict compression to these MIME types(过滤器,此下几段内容设置的适合压缩,不在里面的不压缩)
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
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9(压缩级别)
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
17、https
http over ssl = https 443/tcp
ssl: v3
tls: v1
https://
SSL会话的简化过程
(1) 客户端发送可供选择的加密方式(客户端所支持的加密方法),并向服务器请求证书;
(2) 服务器端发送证书以及选定的加密方式给客户端;
(3) 证书验正:
如果信任给其发证书的CA:
(a) 验正证书来源的合法性:用CA的公钥解密证书(来自服务端的正式)上数字签名;
(b) 验正证书的内容的合法性:完整性验正
(c) 检查证书的有效期限;
(d) 检查证书是否被吊销;
(e) 证书中拥有者的名字,与访问的目标主机(指服务端)要一致;
(4) 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;
(5) 服务用此密钥加密用户请求的资源,响应给客户端;
注意:SSL会话是基于IP地址创建;所以单IP的虚拟主机上,仅可以使用一个https虚拟主机;
回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)
配置httpd支持https:
(1) 为服务器申请数字证书;
测试:通过私建CA发证书
(a) 创建私有CA服务器 /etc/pki/CA(在此目录下创建私钥)
生成自签证书
(b) 在服务器创建证书签署请求
(c) CA签证
(2) 配置httpd支持使用ssl,及使用的证书;
# yum -y install mod_ssl(此包的模块额外支持htpp的SSL功能)
配置文件:/etc/httpd/conf.d/ssl.conf
定义一个虚拟主机(只有一个虚拟主机)
DocumentRoot(虚拟主机的根目录)
ServerName(虚拟主机的名字)
SSLCertificateFile(申请所得的证书文件的目录)
SSLCertificateKeyFile(私钥文件所在)
(3) 测试基于https访问相应的主机;
# openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
18、httpd自带的工具程序
htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具;
apachectl:httpd自带的服务控制脚本,支持start, stop;
apxs:由httpd-devel包提供的,专门用来apache编译安装第三方模块,扩展httpd使用第三方模块的工具;
rotatelogs:日志滚动工具;(一旦日志access。log达到一定条件,就将A更换日志名额外存储,新产生的日志继续使access.log)
access.log -->
access.log, access.1.log
access.log, access.1.log, access.2.log()
suexec:
访问某些有特殊权限配置的资源时,临时切换至指定用户运行;
ab: apache benchmark(apache 压力测试工具)
19、http压力测试工具
ab
webbench
http_load
jmeter
loadrunner
tcpcopy允许复制真实生产在线的流量,重放至测试服务器上
ab [OPTIONS] URL(一部分页面或者一个页面)
-n: 总的请求数
-c:模拟的并发数
-k: 以持久连接模式测试
(请求数相同服务器的压力取决于并发数)
ulimit -n #: 调整当前用户所同时打开的文件数;
练习题:
1、建立httpd服务器(基于编译的方式进行),要求:
提供两个基于名称的虚拟主机:
(a)www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;
(b)www2.stuX.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access;
(c)为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;
(d)通过www1.stuX.com/server-status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status);
2、为上面的第2个虚拟主机提供https服务,使得用户可以通过https安全的访问此web站点;
(1)要求使用证书认证,证书中要求使用的国家(CN)、州(HA)、城市(ZZ)和组织(MageEdu);
(2)设置部门为Ops,主机名为www2.stuX.com,邮件为admin@stuX.com;
httpd-2.4:
新特性:
(1) MPM支持运行DOS机制;
(2) 支持event MPM;
(3) 支持异步读写;
(4) 支持每模块及每个目录分别使用各自的日志级别(日志详细的程度);
(5) 每个请求单独配置;<If>
(6) 增强版的表达式分析器;
(7) 支持毫秒级的keepalive timeout(持久连接超时机制);
(8) 基于FQDN的虚拟主机不再需要NameVirtualHost指令;
(9) 支持用户在配置文件中自定义变量;
新模块:
(1) mod_proxy_fcgi
(2) mod_ratelimit(实现对客户端的速率限制)
(3) mod_remoteip(实现远程客户端的IP地址)
修改了一些配置机制:
不再支持使用Order, Deny, Allow来做基于IP的访问控制(那2.4访问控制方法是什么);
httpd依赖于apr, apr-util, apr-icon
apr: apache portable runtime
apr相当于虚拟机,可运行在不同的操作系统,使得httpd程序无需针对操作系统特意开发,运行在apr中即可
编译安装步骤:
1.4+版的apr和apr-util
前提:
(停掉之前的httpd2.2的或者卸载)安装开发环境,安装pcre-devel
(1) 编译安装apr
在apr包解压出的目录下
# ./configure --prefix=/usr/local/apr
# make && make install
(2) 编译安装apr-util
在apr-util包解压出的目录下
# ./configure --prefix=/usr/local/apr-util --with=/usr/local/apr
# make && make install
(3)编译安装apache2.4
# groupadd -r apache
# useradd -r -g apache apahce
# ./configure --prefix=/usr/local/apache --sysconfig=/etc/httpd24 --enable-so(模块动态加载) --enable-ssl(支持SSL) --enable-cgi --enable-rewrite(支持URL重写) --with-zlib(额外添加zlib包) --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
# make && make install
启动服务:
apachectl
配置:
(1) 切换使用MPM
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME: prefork, event, worker
(2) 修改‘Main‘ server的DocumentRoot
(3) 基于IP的访问控制法则
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制特定IP访问:
Require ip IPADDR:授权指定来源地址的主机访问
Require not ip IPADDR:拒绝指定来源地址的主机访问
IPADDR:
IP: 172.16.100.2
Network/mask: 172.16.0.0/255.255.0.0
Network/Length: 172.16.0.0/16
Net: 172.16
控制特定主机(HOSTNAME)访问
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME:
FQDN: 特定主机
DOMAIN:指定域内的所有主机
(4) 虚拟主机
基于IP、Port和FQDN都支持;
基于FQDN的不再需要NameVirtualHost指令;
(5) ssl
启用模块:
LoadModule ssl_module modules/mod_ssl.so
(6) 服务脚本
原文地址:http://5489884.blog.51cto.com/5479884/1704839