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

p_w_picpath/jpeg

p_w_picpath/gif


URI: Uniform Resource Identifier 用来标示一个唯一的资源

    URL: Uniform Resorce Locator,用于定位某服务器某特定资源的位置

Scheme://Server:Port/path/to/resource

http://www.magedu.com/p_w_picpaths/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/

 在此文件目录下的p_w_picpaths/1.jpg映射URL如下

          http://www.magedu.com/p_w_picpaths/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/p_w_picpaths/1.jpg

http://server/p_w_picpaths/1.jpg(server后的跟/映射为服务器的/var/www/html/文件目录)


6、站点路径访问控制

访问控制机制:(在指定资源的模块中设置控制机制)

基于来源地址

基于账号


资源模块的定义的方式有两种:

文件系统路径:

<Directory "/PATH/TO/SOMEDIR">

...(访问机制等设定)

</Directory>

URL路径:相对DocumentRoot而言的相对路径

<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(此路径为相对工作目录ServerRoot的相对路径)

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 /p_w_picpaths/ "/web/pics/"

URL: http://www.magedu.com/p_w_picpaths/a.jgp --> /web/pics/a.jpg


11、设定默认字符集

AddDefaultCharset UTF-8


常用字符集:GBK, GB2312, GB18030


12、基于用户的访问控制

质询:资源存在,但要求用户提供账号和密码才能访问(通过返回数据报文www-authentication)

WWW-Authenticate: 服务器用401状态拒绝客户端请求,说明需要用户提供用户名和密码;弹出对话框;

认证:

Authorization:客户端用户填入账号密码后再次发请求至服务器;认证通过,则请求授权;


DocumentRoot "/var/www/html"

p_w_picpaths

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:p_w_picpath/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:p_w_picpath/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提供的公钥解密来自服务端的证书上的数字签名证明此证书来自此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(虚拟主机的名字)

SSLEngine on 开启功能

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 #: 调整当前用户所同时打开的文件数;


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的访问控制


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


启动服务:

将新的的/usr/local/apache/bin添加进环境变量PATH。apachectl 


配置:(2.4.9后学会使用分片段的配置,如虚拟机,ssl等功能)

(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) 服务脚本