http:

http协议:伯纳斯·李


http/0.9:原型版本;GET,PUT


http/1.0:

MIME:Multipurpose Internet Mail Extensions,多用途互联网邮件扩展

Cache:缓存

Method:GET、PUT、POST、HEAD、DELETE、TRACE、CONNECT、OPTIONS

GET:请求获取相关资源;

POST:在资源之后附加某些数据;

HEAD:请求资源的响应消息首部;

PUT:请求服务器存储一个资源;

DELETE:请求服务器删除某个资源;

TRACE:请求服务器回送收到的请求信息,主要用于测试或者故障诊断;

CONNECT:保留,待将来使用

OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和请求资源的需求;


W3C


http/1.1:

大大强化了缓存功能;

持久连接的机制:keepalive,长连接;


基于http协议的加速机制:speedy  --->  spdy


httpng

http/2.0


http协议:

应用层协议

80/tcp


https协议:

应用层协议

443/tcp


TCP协议的特性:

面向连接:

建立连接(三次握手),维持连接,拆除连接(四次挥手)

数据顺序传输

将数据打包成段,并为每段提供CRC校验和;

确认、重传和超时;

流量控制:滑动窗口;

拥塞控制:慢启动及拥塞避免算法;


http:Hyper-Text Transfer Protocol,超文本传输协议;


html:Hyper-Text Marked Language,超文本标记语言;


<html>

<head>

<title>xxxx</title>

<meta>

</head>

<body>


</body>

</html>


div

css

js


工作模式:request/response模式;

一次完整的http事务:请求<--->响应


web资源:

一个html文档

一张图片

一个MP3片段

一个PHP页面

一个js脚本

...


客户端发送的一次请求,只能请求一个web资源;


URI:Universal Resource Identifier,统一资源标识符;

Web上可用的各种资源,如:html文档,图片,视频或音频片段,应用程序等,都可以使用URI来进行标识;

URI一般包括三个部分:

1.访问资源的命名机制;

2.存放资源的主机名称;

3.资源自身的名称;


URL:Uniform Resource Locator,统一资源定位符;

URL是互联网上用来描述Web资源的特定格式的一组字符串;

URL一般由三部分组成:

1.协议:资源的提供方式或访问方式;

2.主机标识:可以是主机名称(FQDN),也可以是IP地址;

3.资源路径:使用某种特定方式实现的路径映射机制,标识资源的具体位置;


URL的通用格式:

scheme://Server[:port]/PATH/TO/SOME_RESOUECE?PARAMETERS=VALUE#FLAGS


http://www.baidu.com/index.html


并发响应模型:

单进程IO模型:只有一个进程,每次只能响应一个用户请求;串行响应;

多进程IO模型:同时启动多个进程,每个进程都可以响应一个用户请求;

复用的IO模型:一个进程响应多个用户请求;

多线程模型:一个进程可以生成多个线程,每个线程响应一个用户请求;

事件驱动模型:一个进程直接响应多个用户请求;

复用的多进程IO模型:启动M个进程,每个进程生成N个线程,每个线程响应一个用户请求;

复用的事件驱动IO模型:启动M个进程,每个进程直接响应多个用户请求;


web服务器的一次完整的http请求的处理过程:

1.建立连接

2.接收请求:将客户端发送来的报文经过解封之后放置于服务进程所在的内存空间;

3.处理请求:对于接收到的数据报文进行解析;

4.访问资源:通过各种IO方式获取到用户请求的资源;

5.构建响应报文:

6.发送响应报文:

7.记录日志;


资源的种类:

静态资源:服务器会直接发送给客户端响应的资源;

html文档

图片(.jpg,.png,.gif)

流媒体

文本

js


动态资源:在服务器上需要服务器按照某种方式执行之后生成相应的页面,再将页面发送给客户端响应的资源;

服务器端动态:.php, .jsp, .NET,...

客户端动态:js



资源路径映射:

chroot


/mnt/sysroot/html/a.html


chroot /mnt/sysroot


/html/a.html


/var/www/html   -- DocumentRoot


http://172.16.72.1/index.html


Web服务器的资源映射方式:

1.DocumentRoot

2.Alias

3.vhost docroot

4.用户的docroot

...


http的请求处理的连接方式:

持久连接:保持连接,长连接:keepalive;

时间限制:15秒

数量限制:100个请求


非持久连接:短连接;



















回顾:

http协议及各个版本的特点:

html的基本架构格式;

http协议的工作模式:request/response

web资源

URI、URL

URL通用格式:

scheme://Server[:port]/PATH/TO/RESOURCES[?PARAMETERS=VLAUE][#FLAGS]

Web服务器的并发响应模型

Web服务器处理用户请求的过程

Web资源的种类:静态,动态

Web资源的路径映射机制 

http的请求处理的连接方式:


http(2)

DNS -- BIND

SSH -- OpenSSH dropbear


http协议的实现——简单的基本http协议的实现:

httpd(Apache)

nginx

Tengine

BWS

SWS

lighttpd


Application Server:应用程序服务器,提供动态服务器技术;

IIS(.NET)

Tomcat(java), jetty, resin


WebLogic(Oracle, java)

WebSphere(IBM, java)

jboss(Redhat, java)

glassfish(Oracle, java)

php(php)


www.netcraft.com


httpd: http daemon


httpd——应用程序名称,NSA


Apache,A Pathy Server,一个充满了补丁的服务器;


ASF:Apache Software Foundation,Apache软件基金会;


httpd的版本:

httpd-1.3:官方已经停止维护;超级稳定

httpd-2.0:

httpd-2.2:

httpd-2.4:


httpd的具体的特性:

高度模块化:Core + Modules

DSO:Dynamic Shared Object,动态共享对象;实现模块的动态装载和卸载;


模块分为两类:

static:编译到核心中的功能;如果更换静态模块,必须更换核心;所以必须重新启动服务,才能使之生效;

DSO:动态装载和卸载;重载配置即可使之生效;


MPM:Multipath Processing Modules,多道处理模块;并发响应模型在httpd应用程序中的专用的称呼;

prefork:多进程IO模型;一个主进程,多个子进程,一个进程响应一个请求;httpd的默认MPM模块;

主进程:管理子进程;创建套接字;接收用户请求,并派发给某个子进程处理...

子进程:处理请求和响应请求;


worker:复用的多进程IO模型(多线程);多进程多线程,一个线程响应一个请求;

主进程:管理子进程;创建套接字;接收用户请求,并派发给某个子进程处理...

子进程:负责管理线程;

线程:处理请求和响应请求;


event:复用的IO模型(事件驱动);多进程模型;每个进程响应多个请求;

主进程:管理子进程;创建套接字;接收用户请求,并派发给某个子进程处理...

子进程:处理请求和响应请求;


注意:

1.在httpd2.0之前,不支持event模型;

2.在httpd2.2中,event模型作为测试模型;

3.在httpd2.4中,event模型作为建议使用模型;


在CentOS 6中:httpd2.2,event模型是测试模型;不支持DSO机制的MPM;

在CentOS 7中:httpd2.4,event模型为production ready;支持DSO机制的MPM;


httpd的功能特性:

支持CGI:Common Gateway Interface,通用网关接口;

虚拟主机:

能够标识虚拟主机的方式:IP + PORT + HOSTNAME;

反向代理:Reverse Proxy

负载均衡:基于流量(bytraffic),基于业务(bybusiness),基于请求(byrequest);

路径别名的设置;

身份验证机制:

basic

digest

支持大量的第三方模块;

...


安装httpd:

rpm包:本地光盘yum源;

编译安装:定制新功能;为了安全去除带有bug或漏洞后门的模块;其他原因;


CentOS 6:httpd-2.2

启动服务:SysV init脚本,/etc/rc.d/init.d/httpd

/etc/rc.d/init.d/httpd {start|stop|restart|reload|status}

service httpd {start|stop|restart|reload|status}


开机自动启动服务:

chkconfig [--level 2345] httpd on|off


程序环境:

配置文件:

/etc/httpd/conf/httpd.conf——httpd的主配置文件

/etc/httpd/conf.d/*.conf ——httpd的辅助配置文件

/etc/httpd/conf.d/magic —— 实现MIME功能


/etc/sysconfig/httpd —— httpd服务器启动脚本的配置文件


程序文件:(二进制文件)

/usr/sbin/httpd:prefork模型;

/usr/sbin/httpd.event:event模型;

/usr/sbin/httpd.worker:worker模型;


/usr/sbin/apachectl:服务控制命令;


日志文件:

/var/log/httpd/

access_log:访问日志;

error_log:错误日志;


默认站点的DocumentRoot:

/var/www/html


模块文件的路径:

/etc/httpd/modules --> /usr/lib64/httpd/modules/


CentOS 7:httpd-2.4

启动服务:Systemd Unit文件,/usr/lib/systemd/system/httpd.service

systemctl {start|stop|restart|reload|status} httpd[.service]


开机自动启动或停止服务:

systemctl enable|disable httpd.service


程序环境:

配置文件:

/etc/httpd/conf/httpd.conf ——httpd的主配置文件

/etc/httpd/conf.d/*.conf ——httpd的辅助配置文件

/etc/httpd/conf.modules.d —— 额外的模块专用的配置文件

/etc/httpd/conf.d/magic —— 实现MIME功能


/etc/sysconfig/httpd —— httpd服务器启动脚本的配置文件


程序文件:(二进制文件)

/usr/sbin/httpd:

在httpd2.4版本中,MPM支持DSO机制,每个MPM模型都有一个对应的模块;

/usr/lib64/httpd/modules/mod_mpm_event.so

/usr/lib64/httpd/modules/mod_mpm_prefork.so

/usr/lib64/httpd/modules/mod_mpm_worker.so


/usr/sbin/apachectl:服务控制命令;


日志文件:

/var/log/httpd

access_log:访问日志;

error_log:错误日志;


默认站点的DocumentRoot:

/var/www/html


模块文件的路径:

/etc/httpd/modules --> /usr/lib64/httpd/modules/


回顾:

httpd版本

httpd特性:

高度模块化:Core + Modules

MPM:

prefork

worker

event

CentOS 6和CentOS 7中的httpd2.2和httpd2.4


http(3)

安装httpd:

httpd

httpd-tools

httpd-devel

httpd-manual


httpd-2.2的基础配置:


/etc/httpd:ServerRoot,服务器根目录;

conf/httpd.conf, conf.d/*.conf:配置文件及路径

logs:日志文件,符号链接,链接到/var/log/httpd

modules:模块文件,符号链接,链接到/usr/lib64/httpd/modules

run:httpd的主进程的PID文件,符号链接,链接到/var/run/httpd


主配置文件:/etc/httpd/conf/httpd.conf

在此配置文件中,所有的配置项均被称为指令(Directive)

指令的格式:

directive value


注意:

1.所有的directive均不区分字符大小写,但通常写出驼峰式;

2.value部分,除路径名称外,大多数不区分字符大小写;


在主配置文件中,所有的指令被分别写到三个配置部分中:

### Section 1: Global Environment

### Section 2: 'Main' server configuration

### Section 3: Virtual Hosts


在修改了配置文件中的指令之后,可以使用reload的方式使之生效;

CentOS 6:service httpd reload

CentOS 7:systemctl reload httpd.service


在httpd-2.2版本中,如果更改了监听的IP地址,则必须重启服务;


1.修改监听的地址和端口:136行

Listen [IP:]PORT


注意:

1.Listen指令可以定义多次;

2.如果省略了IP地址,代表0.0.0.0,意味着httpd服务进程将监听本服务器上配置的所有的IP地址;


2.持久连接:76行

persistent connection,持久连接;当服务器与客户端已经建立起TCP连接之后,在完成一次请求之后,连接不断开,而是继续等待用户发送其他请求;

断开条件:

数量限制:

时间限制:


相关的指令:

KeepAlive Off|On

MaxKeepAliveRequests 100

KeepAliveTimeout 15


请求测试:

~]# telnet SERV_IP SERV_PORT

GET /PATH/TO/RESOURCE HTTP/1.1

Host: SERV_IP


HTTP/1.1 200 OK

Date: Sun, 06 Aug 2017 00:53:26 GMT

Server: Apache/2.2.15 (CentOS)

Last-Modified: Sun, 06 Aug 2017 00:39:30 GMT

ETag: "100101-13-5560af69d973f"

Accept-Ranges: bytes

Content-Length: 19

Content-Type: text/html; charset=UTF-8


<h1>Test Page</h1>


3.MPM:102行

MPM:multipath processing modules,多道处理模块;

httpd-2.2的MPM不支持DSO机制,且event为测试模块;


/usr/sbin/httpd

/usr/sbin/httpd.event

/usr/sbin/httpd.worker

/etc/sysconfig/httpd

HTTPD=/usr/sbin/httpd.worker:指明用哪个模块


查看httpd或httpd.worker程序的模块列表:

httpd -M

httpd.worker -M


查看静态编译的模块:

httpd -l

httpd.worker -l


与prefork相关的配置指令:

<IfModule prefork.c>

StartServers       8 在服务刚启动时,预先fork几个子进程;

MinSpareServers    5 最小预留的空闲子进程的数量;

MaxSpareServers   20 最多预留的空闲子进程的数量;

ServerLimit      256 为MaxClients指定的最大值;

MaxClients       256 最大的并发访问量;

MaxRequestsPerChild  4000

</IfModule>


与worker相关的配置指令:

<IfModule worker.c>

StartServers         4 在服务刚启动时,预先fork几个子进程;

MaxClients         300 并行访问的上限;

MinSpareThreads     25 最小预留的空闲线程数量;

MaxSpareThreads     75 最大预留的空闲线程数量;

ThreadsPerChild     25 每个进程管理的最大线程数量;

MaxRequestsPerChild  0 每个子进程处理的最大请求数量;

</IfModule>


100个资源,500ms,256


512*86400/100=45W PV


UV: User View;


4.DSO机制:150行

LoadModule


LoadModule Module_Name modules/Module_File.so(模块路径)


modules目录是相对于ServerRoot来说的相对路径;

modules == /etc/httpd/modules

用于指定Apache的运行目录,服务启动之后自动将目录改变为当前目录,在后面使用到的所有相对路径都是想对这个目录下

5."Main" Server  276行

定义了一个主机的基本指令:

ServerName FQDN[:PORT]

DocumentRoot "/var/www/html"


路径映射:

http://172.16.69.1/test.html


配置示例:DocumentRoot "/myweb/data"

~]# mkdir -pv /myweb/data

~]# vim /myweb/data/index.html


重载配置文件;


客户端访问:http://172.16.69.1/index.html

默认是不需要指定的,服务器通过名字解析过程来获得自己的名字,但如果解析有问题(如反向解析不正确),或者没有DNS名字,也可以在这里指定IP地址,当这项不正确的时候服务器不能正常启动。前面启动Apache时候提示正在启动 httpd:httpd: apr_sockaddr_info_get() failed forjustin httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1forServerName,解决方法就是启动该项把www.example.com:80修改为自己的域名或者直接修改为localhost



6.站点资源的访问控制  302行

1) 基于文件系统的访问控制

a.基于指定目录的访问控制

<Directory "/PATH/TO/SOME_DIR">

Directive Value

</Directory>


b.基于特定文件的访问控制

<File "/PATH/TO/SOME_FILE">

Directive Value

</File>


c.基于模式匹配的方式进行文件的访问控制

<FileMatch "PATTERN">

Directive Value

</FileMatch>


2) 基于URL路径进行访问控制

a.基于URL进行

<Location "/PATH/TO/SOME_URL">

Directive Value

</Location>


b.基于模式匹配的方式进行URL路径访问控制

<LocationMatch "URL_PATTERN">

Directive Value

</LocationMatch>


常用的目录中的访问控制指令:

Options指令:

取值可以是:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All

Indexes:允许索引,当web站点没有主页或主页文件不可访问时,在浏览器上会以索引的方式列表整个DocumentRoot中的资源给用户选择;一般用于资源下载站点;对于正常的Web站点来说,应禁用此功能;

None :什么都没有,建议选项

FollowSymLinks:跟踪符号链接;

SymLinksifOwnerMatch:只有当子进程的所有者和链接文件的所有者为同一用户时,才跟踪符号链接;

ExecCGI:允许执行CGI脚本;

AllowOverride指令:

控制那些允许放置于.htaccess文件中的指令;

httpd允许在网站文档根目录及其各级子目录中使用.htaccess文件进行资源访问控制;凡是放置于.htaccess文件中的指令,有继承的特性;建议将该指令的值设置为None;


/myweb/data/.htaccess

/myweb/data/p_w_picpaths/.htaccess

/myweb/data/admin/.htaccess


Order指令、Allow指令及Deny指令;

Order指令:定义基于IP地址的访问控制;Order指令规定了访问控制的检查顺序;另一个执行顺序:越是小范围的限制,越有限执行;


Order allow,deny

Allow From IP/NETWOEK/FQDN/All

Deny From IP/NETWOEK/FQDN/All


NETWORK:

172.16

172.16.0.0

172.16.0.0/16

172.16.0.0/255.255.0.0


7.web站点主页文件名的定义:402行

DirectoryIndex index.html in.html index.html.var


当用户给出的URL中没有明确指明要访问的资源具体的名称时,服务器会根据此处填写的文件名,依次去匹配;只要匹配成功,就返回对应资源;如果后面的文件名也存在能够匹配的文件,也不予考虑;


8.定义路径别名:551行

Alias /URL/ "/PATH/TO/SOME_DIR/"


注意:Alias指令中,URL右侧"/"相当于后面的路由右侧的"/",定义一些不在DocumentRoot下的文件,而可以将其映射到网页根目录中,这也是访问其他目录的一种方法


9.日志:/var/log/httpd  484行

错误日志:error_log

ErrorLog logs/error_log

LogLevel warn


访问日志:

LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" 统称为combined

CustomLog logs/access_log combined


%h Remote host,客户端的IP地址

%l Remote logname,如果没有登录名,则记录为"-"

%u Remote user,记录通过身份验证之后访问资源的用户名称;

%t Time the request was received (standard english format)

%r First line of request,请求报文的首行

%>s Status. For requests that got internally(内部地)redirected, this is the status of the *original* request --- %>s for the last. 状态信息

%b Size of response in bytes, excluding HTTP headers. 资源大小

%{Referer}i The contents of Foobar: header line(s) in the request sent to the server. 访问此页面之前通过哪个超链接跳转而来

%{User-Agent}i  客户端程序或客户端浏览器的相关信息


10.离线帮助手册:

安装:httpd-manual包

配置文件:/etc/httpd/conf.d/manual.conf


需要重载配置才能使之生效;


http://Server_ip/manual/
























回顾:

httpd安装

CentOS 6和CentOS 7的httpd的差异

httpd的配置:

Listen [IP:]PORT

KeepAlive 

MPM:

prefork, worker, event

DSO:

LoadModules mod_name mod_path


httpd -M | httpd -l


Main Server

ServerName FQDN[:80]

DocumentRoot "/PATH/to/docs"


<Directory "/PATH/to/docs">

Options None

AllowOverride None

Order allow,deny

Allow From ...

Deny From ...

</Directory>


DirectoryIndex index.html index.html.varr

ALias /URL/ "/PATH/TO/SOME_DIR/"

ErrorLog logs/error_log

LogLevel warn


LogFormat "%h %l %u ... %{Referer}i" combined

CustomLog logs/access_log combined


httpd-2.2的基本配置(2)

11.基于用户的访问控制机制

http协议的认证功能:

认证质询:

WWW-Authenticate:响应报文的状态码:401,拒绝客户端请求;要求客户端提供正确的账户和密码,并说明原因;


认证:

Authorization:客户端填写账号和密码,之后发送该请求报文;认证通过之后,服务器才会发送之前客户端请求的资源的响应报文;


http的认证方式:

basic:明文认证

digest:消息摘要认证


虚拟用户账号:无法完成系统级访问;只能用于访问服务器上的某特定服务的用户账户;


一般来讲,虚拟用户存储于某特定格式的数据结构中:

文本文件;

SQL数据库;

LDAP目录数据库;


安全域:需要用户认证后才能访问的资源的集合;通常会使用名称对其进行标识;


basic认证的配置示例:

1.定义安全域:

基于虚拟用户做身份验证

<Directory "/PATH/TO/SOME_DIR">

Options None

AllowOverride None

Authtype basic

AuthName "说明"

AuthUserFile "/PATH/TO/HTTP_USER_FILE"

Require user user1 user2 ...

</Directory>


基于虚拟组做身份验证

<Directory "/PATH/TO/SOME_DIR">

Options None

AllowOverride None

Authtype basic

AuthName "SOME_STRING"

AuthUserFile "/PATH/TO/HTTP_USER_FILE"

AuthGroupFile "/PATH/TO/HTTP_GROUP_FILE"

Require group group1 group2 ...

</Directory>


2.创建用户/组的文件

htpasswd 

htpasswd - Manage user files for basic authentication


-c:创建用户账户文件,只是在创建第一个用户的时候使用;

-m:使用md5加密用户密码

-s:使用sha加密用户密码

-D:删除用户


组文件:手动创建

GROUP_NAME: user1 user2 ...


12.系统状态数据查询:server-status

LoadModule status_module modules/mod_status.so

#<Location /server-status>

#    SetHandler server-status

#    Order deny,allow

#    Deny from all

#    Allow from .example.com

#</Location>


<Location /server-status>

   SetHandler server-status

   Order deny,allow

   Deny from all

   Allow from 172.16

</Location>


ExtendedStatus On|Off:开启或关闭更多的额外状态信息;


13.虚拟主机

同一台服务器上架构多个web站点的方法;


对于每个web站点,都有一个属于其独立的标识;


站点标识:

IP地址、PORT、主机头(FQDN)


三种典型的虚拟主机实现方式:

基于IP地址的虚拟主机:

每个虚拟主机使用一个独立的IP地址;

基于PORT的虚拟主机:

每个虚拟主机使用一个独有的PORT;

基于FQDN的虚拟主机:

每个虚拟主机使用一个独有的FQDN;


注意:Main Server和虚拟主机,不能同时使用;而且一旦虚拟主机被激活,则Main Server不再生效;


虚拟主机的配置方法:

<VirtualHost IP:80>

DocumentRoot /www/docs/dummy-host.example.com

ServerName dummy-host.example.com

#    ErrorLog logs/dummy-host.example.com-error_log

#    CustomLog logs/dummy-host.example.com-access_log common

</VirtualHost>


vhosts-www1.conf


基于IP地址的虚拟主机示例:

/etc/httpd/conf.d/vhosts-www1.conf

<VirtualHost 172.16.69.1:80>

DocumentRoot "/myweb/vhosts/www1"

ServerName www1.qhdlink.com

</VirtualHost>


/etc/httpd/conf.d/vhosts-www2.conf

<VirtualHost 172.16.69.2:80>

DocumentRoot "/myweb/vhosts/www2"

ServerName www2.qhdlink.com

</VirtualHost>


基于PORT的虚拟主机配置示例:

前提:需要让httpd事先监听于指定的额外端口;

/etc/httpd/conf.d/vhosts-www3.conf

Listen 60080

<VirtualHost 172.16.69.1:60080>

DocumentRoot "/myweb/vhosts/www3"

ServerName www3.qhdlink.com

</VirtualHost>


基于FQDN的虚拟主机配置示例:

/etc/httpd/conf.d/vhosts-www4.conf

NameVirtualHost 172.16.69.1:80

<VirtualHost 172.16.69.1:80>

DocumentRoot "/myweb/vhosts/www4"

ServerName www4.qhdlink.com

</VirtualHost>



批量生成虚拟主机的配置文件及文档根目录:

1.list [vhost_name] 

2.add [FQDN]

3.delete [FQDN]

4.modify [FQDN] 


回顾:

基于用户的访问控制

虚拟主机


http协议的基础知识

http协议的事务:request/response

http协议:无状态(stateless) 

cookie:

服务器:Set-Cookie

客户端:Cookie


Session:服务器用于追踪用户的特殊数据结构的数据库;

通常缓存于服务器的内存中;


URL:统一资源定位符:

scheme://host[:port]/<path>;param?query#flag


http协议的报文格式:http首部或http头;

通用格式:

起始行(Start-Line)

首部(headers)

...


主题(body)


请求报文首部(request headers):

<Method> <request-URL> <Version>

<header: > value


<body>


响应报文首部(response headers):

<Version> <Status-Code> <reason-phrase>

<header: > value


<body>


Method:请求方法:标明客户端希望服务器端对资源执行的操作;

GET、HEAD、POST

WebDAV(分布式版本协作):PUT、DELETE

OPTIONS、TRACE


协议查看或分析工具:

Linux:tcpdump、wireshark、tshark

Windows:wireshark、sniffer


request-URL:/test.html


Status-Code:状态码,三位十进制整数表示;

作用:标识请求处理过程的结果状态;

1xx:100-101,信息提示;

2xx:200-206,成功类的响应状态码,如:200,OK;

3xx:300-305,重定向类的响应状态码,

301:永久重定向

302:临时重定向

304:资源未被修改

4xx:400-415,客户端错误类的响应状态码:

401:认证质询

403:请求被拒绝,Forbidden;

404:客户端请求的资源不存在,Not Found;

5xx:500-505,服务器端错误类的响应状态码;

500:服务器内部错误,Server Internal Error;

502:反代服务器与上游服务器之间的通信失败,或者在有效时间内无法从上游服务器取回资源;


headers:首部内容

格式:

Name: Value


首部分类:

通用首部

请求首部

响应首部

实体首部

扩展首部


通用首部:请求报文和响应报文中都可以使用;

Date:报文创建的时间;

Connection:连接方式;keepalive,closed;

Via:经由,报文传输的过程中经由的代理节点的IP地址;

Cache-Control:缓存控制


请求首部:

Accept:可以接受的媒体类型;MIME

媒体格式:即MIME格式

Major/Minor,即主类型/次类型,常用的类型:

text/html

text/plaintext

p_w_picpath/jpeg

p_w_picpath/png

application/X-php


Accept-Charset:可以接受的字符集 

ASCII:ANSI,单字节码;

GBK

GB-2312

GB-18030

BIG-5


Accept-Encoding:可以接受的编码格式;byte,gzip,deflate

Accept-Language:可以接收的语言;

Client-IP:客户端IP地址;

Host:请求的服务器的名称和端口号;也称为主机头;

Referer:包含当前正在请求的资源的上一级资源;

User-Agent:客户端代理程序;


条件式请求首部:

Expect:期望获得的内容;

If-Modified-Since:自从某某时间之后资源是否被修改过;

If-Unmodified-Since:自从某某时间之后资源是否未被修改过;

If-Match:本地缓存中存储的文件的ETag的值是否与服务器中对应资源的ETag值相同;

If-None-Match:本地缓存中存储的文件的ETag的值是否与服务器中对应资源的ETag值不相同;


安全请求首部:

Authrization:向服务器发生用户名和密码;

Cookie:向服务器发生Cookie;

Cookie2:


响应首部:

信息性首部:

Age:响应持续的时长;

Server:服务器端使用的软件程序的名称、版本等信息;

Accept-Ranges:服务器端可以接受的请求类型的范围;可以使用"*"来表示所有请求类型;

Vary:服务器查看的其他首部列表;


安全响应首部:

WWW-Authenticate:质询握手

Set-Cookie:为客户端设定Cookie

Set-Cookie2:


实体首部:

Allow:对此实体可以使用的请求方法;

Location:资源的真正的URL地址;

Content-Encoding:资源内容的编码格式;

Content-Language:资源内容的语言;

Content-Length:资源内容的长度;不包含首部长度;

Content-Location:真正实体资源的所在位置;

Content-Type:资源内容的类型;


跟缓存相关的实体首部:

ETag:

Expires:实体缓存的过期时间;

Last-Modified:实体的最近一次的修改时间;


扩展首部:X-eXtended

X-Forward-For:

X-Cache-Hit


《HTTP权威指南》前四五章


14.https实现:http over SSL


回顾几个术语:PKI,CA,CRL,X.509,SSL/TLS


注意:SSL会话是基于IP地址所创建的,所以单IP地址的主机上,仅可以创建一个https虚拟主机;


创建CA:

1.创建CA的私钥

(umask 077 ; openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)

2.生成CA的自签证书:

openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3653

3.完善CA所必需的目录级文件要求和文本文件的要求:

touch /etc/pki/CA/index.txt

echo 01> /etc/pki/CA/serial


为httpd生成私钥并签发证书:

1.生成私钥及证书请求:

# mkdir /etc/httpd/ssl

# cd /etc/httpd/ssl

# (umask 077; openssl genrsa -out httpd.key 2048)

# openssl req -new -key httpd.key -out httpd.csr -days 3653

# scp httpd.csr 172.16.72.1:/tmp


2.在CA上签发证书:

CA]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt -days 3653

CA]# scp certs/httpd.crt 172.16.69.1:/etc/httpd/ssl


3.在httpd服务器上清除证书请求文件:

rm -f httpd.csr


配置httpd支持使用ssl:

mod_ssl模块已装载,如果没有相应模块,需要安装mod_ssl:

yum -y install mod_ssl


/usr/lib64/httpd/modules/mod_ssl.so

/etc/httpd/conf.d/ssl.conf

<VirtualHost 172.16.69.1:443>

DocumentRoot "/myweb/vhosts/ssl"

ServerName www.qhdlink.com

SSLCertificateFile /etc/httpd/ssl/httpd.crt

SSLCertificateKeyFile /etc/httpd/ssl/httpd.key

</VirtualHost>


补充内容:=============================================================


15、user/group

指定以哪个用户的身份运行httpd服务进程;

User apache

Group apache

SUexec

16、使用mod_deflate模块压缩页面优化传输速度


适用场景:

(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;

(2) 压缩适于压缩的资源,例如文件文件;


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


补充内容:=============================================================


httpd-2.4:

新特性:

1.MPM支持DSO机制,以模块方式加载和卸载;

2.event MPM已经生产可用;production ready;

3.异步IO机制;异步读写机制;

4.支持每模块及每目录单独日志级别定义;

5.每请求相关的专用配置;

6.增强版的表达式分析器;

7.毫秒级的keepalive超时时长;

8.基于FQDN的虚拟主机无需使用NameVirtualHost指令;

9.支持用户自定义变量;

10.更低的内在开销;


新模块:

mod_proxy_fcgi

mod_proxy_scgi

mod_remoteip


安装httpd-2.4:

apr:Apache Portable Runtime,apache可移植运行时环境;


httpd-2.4依赖的apr的版本,不低于1.4版本;


在CentOS 6上:

只能编译安装httpd-2.4,需要先编译apr-1.4+及apr-util-1.4+;


在CentOS 7上:

yum install httpd


httpd-2.4的配置环境:

主配置文件:

/etc/httpd/conf/httpd.conf

模块配置文件:

/etc/httpd/conf.modules.d/*.conf

片段配置文件:

/etc/httdp/conf.d/*.conf


httpd-2.4特有的配置:

1.切换MPM

编辑配置文件/etc/httpd/conf.modules.d/00-mpm.conf

LoadModule mpm_prefork_module modules/mod_mpm_prefork.so

LoadModule mpm_worker_module modules/mod_mpm_worker.so

LoadModule mpm_event_module modules/mod_mpm_event.so


注意:在启用某个MPM模块时,其余两个必须被注释;不能让多个MPM同时生效;


2.基于IP地址的访问控制:

不再支持allow,deny指令;而统一改用Require指令完成访问控制功能;


允许所有主机访问:Require all granted

拒绝所有主机访问:Require all denied


注意:

1.默认情况下,只要没有明确的指明允许,则拒绝所有主机访问;

2.如果允许和拒绝同时要控制,则所有Require指令必须放在RequireAny容器中:

<RequireAny>

Require all denied

Require ip 172.16.69.1

</RequireAny>


<RequireAny>

Require all granted

Require not ip 172.16.69.1

</RequireAny>


<RequireAny>

Require all denied

Require host qhdlink.com

</RequireAny>


3.虚拟主机:

即便使用基于FQDN方式构建的虚拟主机也无需再使用NameVirtualHost指令;


<VirtualHost 172.16.72.1:80>

DocumentRoot "/myweb/vhosts/www"

ServerName www.qhdlink.com

<Directory "/myweb/vhosts/www"

Options None

AllowOverride None

Require all granted

</Directory>

<VirtualHost>


4.毫秒级的持久连接

需要单独创建配置文件:/etc/httpd/conf.d/keepalive.conf

KeepAlive On

KeepAliveTimeout 500ms

MaxKeepAliveRequests 100


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> 来源网址

   --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的内容输出至标准输出; 


ab:Apache Bench,压力测试工具;

-c:并发连接数

-n:请求总数

-k:使用keepalive