http

http 笔记整理

Httpd2018.1.25

互联网,

组成部分:路由器,服务器,计算机,

服务:

tcp/ip 协议

跨Internet的主机间通讯

在建立通信连接的每一端,进程间的传输要有两个标志:

Ip地址和端口号,合称为套接字地址socket address

客户机套接字地址定义了一个唯一的客户进程

服务器套接字地址定义了一个唯一的服务器进程

端口号tcp和utp  0-65535

特权和root   0-1024

普通用户,1024-65536

客户端端口号是随机的

套接字

Socket:套接字,进程间通信IPC的一种实现,允许位于不同主机或同一主机上不同进程之间进行通信和数据交换,socketAPI:封装了内核中所提供的socket通信相关的系统调用

Socket Domain:根据其所使用的地址

Ipv4

Ipv6

同一主机上不同进程之间通讯是使用

Socket type:根据使用的传输协层协议

Socket_stream :流,tcp套接字,可靠地传输、面向连接

Socket_dgram:数据报,udp套接字,不可靠地传输、无连接

Sock_raw:裸套接字,无需tcp或udp,app直接通过ip;包通信

创建———绑定,指定端口,协议——–开启监听,监听才能让远程用户访问———–客户端连接,不需要绑定,因为他的端口是随机的,只需要调用connect函数——–服务器接收请求和处理请求——双方读取回应,建立连接,传输数据——最后close

http服务同行过程

http相关术语

http:hyper text transfer protocol 80/tcp  超文本链接

Html: hyper text markup language  超文本标记语言,编程语言

实例

<html>

<head>

<title>html语言</title>

</head>

<body>

<h1>标题1</h1>

<p><a href=http://www.magedu.com>马哥教育</a>欢迎你</p> <h2>标题2</h2>

</body>

</html>

Css:cascading style sheet      层叠样式表

Js:javascript

Html 标签语言,类似word,文本后缀,文件格式,表示不同的字体大小,

http:传输的时候使用的协议,网络协议,

MIME:multipurpose Internet mail extensions  多用途互联网邮件扩展 /etc/mine.type

格式:major/minor

Text/plain

Text/html

Text/css

Image/jpeg

Image/png

Videl/mp4

Application/javascript

 

http工作机制

http请求:http request

http响应:http response

一次http事务:请求<—->响应

Web资源:web resourse

一个网页由多个资源构成,打开一个页面,会有多个资源展示出来,但是每个资源都要单独请求。因此,一个“web”页面,通常并不是单个资源,而是一组资源的集合

静态文件:无需服务端做出额外处理

动态文件:服务端执行程序,返回执行的结果

http连接请求

串行和并行连接

持久连接

管道化持久连接

URI 统一资源标识

URN:统一资源命名

URL:统一资源定位符,用于描述某服务器某特定资源位置

两者区别:URN如同一个人的名字,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL 提供查找该事物的方法。URN仅用于命名,而不指定地址

URL组成

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>

Schame:方案,访问服务器以获取资源时要使用哪种协议

User:用户,某些方案访问资源时需要的用户名

Password:密码,用户对应的密码,中间用:分隔

Host:主机,资源宿主服务器的主机名或ip地址

Port:端口,资源宿主服务器正在监听的端口号,很多方案有默认的端口号

Path:路径,服务器资源的本地名,由一个/将其与前面的 URL组件分隔

Params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔

Query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔

Frag:片段,一小片或一部分资源的名 字,此组件在客户端使用,用#分隔

 

网站访问量

Ip(独立ip)即Internetprotocol,指独立ip数。一天内来自相同客户机ip地址只计算一次,记录远程客户机ip地址的计算机访问网站的次数,是衡量网站流量的重要指标

Pv(访问量):即page view 页面浏览量或点击量,用户每次刷新即计算一次,pv反应的是浏览某网张的页面数,pv域来访者的数量成正比,pv并不是页面的来访者数量,而是网站被访问的页面数量

 

Uv(独立访客)访问网站的一台电脑为一个访客,一天内相同的客户端只被计算一次。可以理解成访问电脑的cookie实现的。如果更换了ip后但不清除cookies,在访问相同网站,该网站的统计中uv是不变的

网站统计:http://www.alexa.cn/rank/

Web服务请求处理步骤

1(tcp的三次握手)建立连接:接收或拒绝连接请求

2接收请求:接收客户端请求报文中对某资源的一次请求的过程

Web访问响应模型

单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被窜行响应

多进程I/O模型:并行启动多个进程,每个进程响应一个连接请求

复用I/O结构:启动一个进程,同时响应N个连接请求

实现方法:多线程模型和时间驱动

多线程模型:一个进程生成N个线程,每线程响应一个连接请求

事件驱动:一个进程处理N个请求

复用的多进程I/O模型:启动M个进程,每个进程响应N个俩姐请求,同时接收m*n个请求

3处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法

资源,首部和可选的主体部分对请求进行处理

http常用的请求方式,method

Get post head put delete trace options

4访问资源

服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源

资源放置于本地文件系统特定的路径:docroot

Docroot—–>/var/www/html

/var/www/html/images/logo.jpg

Web 服务器资源路径映射方式:

Docroot

Alias

虚拟主机docroot

用户家目录docroot

5构建响应报文

一旦web服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体

响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文通常包括:

描述了响应主体MIME类型的content-type首部

描述了响应主体长度的content-length

实际报文的主体内容

URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径

永久重定向

临时重定向

MIME类型

Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源联系起来

魔法分类:Apache web服务器可以扫描每一份资源的内容,并将其与一个已知模式表进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名时

显示分类:可以对web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型

类型协商:有些web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置web服务器,使其可以通过与用户的协商来决定使用哪种格式

6发送响应报文

Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些事空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录这些连接状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久来说,连接可能仍保持打开状态,在这种情况下,服务器要正确地计算content-length首部。

不然客户端就无法知道响应什么时候结束了

7记录日志

最后,当事务结束时,web服务器会在日志文件中添加一个条目,来描述已执行的事务

 

http服务器应用

Httpd Apache

Nginx

Lighttpd

应用程序服务器

Tomcat

Jetty

市场占有率统计

 

Httpd介绍

Httpd

特性

高度模块化   core + modules

DSO:动态加/卸载

MPM:多路处理模块

MPM工作模式

Prefork:多进程I/O模型,每个进程响应一个请求,

一个主进程:生成和回收n个子进程,创建套接字,不响应请求

多个子进程:工作work进程,每个子进程处理一个请求;系统初始时预先生成多个空闲进程,等待请求,最大不超过1024个

Worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型

一个主进程:生成m个子进程,每个子进程负责生成n个线程,每个线程响应一个请求,并发响应请求:m*n

Event:事件驱动模型(worker模型的变种)

一个主进程:生成m个子进程,每个进程直接响应n个请求,并发响应请求:m*n,有专门的线程来管理这些keep-alive类型的线程,当有真是请求时,将请求传递给服务线程执行完毕后,有允许释放,这样增强了高并发场景下的请求的处理能力

进程角

空闲——-监听—工作

 

虚拟主机

Ip   Port   fqdn全程域名

CGI : 通用网关接口

反向代理:根据用户的请求调度,

正向代理:

负载均衡:

路径别名

丰富的用户认证机制

Basic

Digest

支持第三方模块

Centos6程序环境 :httpd-2.2

配置文件:

/etc/httpd/conf/httpd.conf

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

检查配置语法

Httpd -t

Service  httpd  configtest

服务脚本:/etc/rc.d/init.d/httpd

脚本配置文件:/etc/sysconfig/httpd

服务控制和启动

Chkconfig   httpd  on|off

Service{start|stop|restart|status|configtest|reload} httpd

站点网页文档根目录:

/Var/www/html

模块文件路径

/etc/httpd/modules

/usr/lib64/httpd/modules

主程序文件

/usr/sbin/httpd

/usr/sbin/httpd.worker

/usr/sbin/httpd.event

主进程文件

/etc/httpd/run/httpd.pid

日志文件目录

/var/log/httpd/

Access_log:访问日志

Error_log:错误日志

帮助文档包

httpd-manual

 

Httpd配置文件的组成:

配置格式:directive value

Directive :不区分字符大小写

Value:为路径时,是否区分大小写,取决于文件系统

1显示服务器版本信息

改版本号

[root@Centos6 html]# vim  /etc/httpd/conf/httpd.conf

[root@Centos6 html]# service  httpd reload

 

[root@centos7 ~]# curl -I http://192.168.27.26/

2修改监听的IP和Port

Listen [IP:]PORT

(1)省略IP表示为本机所有IP

(2)listen指令至少一个,可重复出现多次

3.持久连接

Persitent connection:连接建立每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接,

断开条件:数量限制:100

时间限制:以秒为单位

设置:keepAlive  on|off

keepAlive Timeout  15

MaxKeepAliveRequests   100

测试: telnet  WEB_SERVER_IP PORT

GET   /URL     HTTP/1.1

Host: WEB_SERVER_IP

4 MPM(Multi-Processing Module)多路处理模块

Prefork  worker    event

http-2.2 不支持同时编译多个模块,所以只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持

  • DSO :Dynomic Shaerd Object

加载动态模块配置

/etc/httpd/conf/httpd.conf

 

 

 

 

6定义‘Main’server的文档页面路径

DocumentRoot   “/path”

文档路径映射:

DocumentRoot 指向的路径为URL路径的起始位置

实例:DocumentRoot “/app/data”

http://HOST:PORT/test/index.html

——> /app/data/test/index.html

7定义站点主页面

DirectoryIndex  index.html    index.html.var

8站点访问控制常见的机制

可基于两种机制指明对哪些资源进行何种访问控制

访问控制机制有两种:客户端来源地址,用户帐号

文件系统路径

<Directory “/path”>

……

</Directory>

 

<File “/path/file”>

……

</File>

 

<FileMatch “PATTERN”>

……

</FileMtch>

URL路径:

<Location “”>

……

</Location>

 

<LocationMatch “”>

……

</LocationMatch>

9<Directory>中“基于源地址”实现访问控制

  • options:后跟一个或多个以空白字符分隔的选项列表

在选项前的+,—表示增加或删除指定选项

常见选项

Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户

FollowSymLinks:允许访问符号链接文件所指向的源文件

None:全部禁用

All: 全部允许

  • allowOverride
  • 写到存放数据的目录下,

与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件,覆盖之前的配置指令

只对<directory>

Allowverride All:  .htaccess所有指令都有效

Allowverride None  .htaccess文件无效

Allowverride  AuthConfig Indexes 除了AuthConfig和indexs 的其他指令都无法覆盖

 

找不到文件时显示的默认页面存放的地址:vim /etc/httpd/conf.d/welcome.conf

 

(3)order 和 allow 、deny

放在directory, .htaccess中

Order:定义生效次序;写在后面的表示默认法则

Order allow,deny

Order deny, allow

Allow from和deny from:定义客户端地址

客户端地址:

Ip

网络:172.16

172.16.0.0

172.16 .0.0/16

172.16..0.0/255.255.0.0

 

排在后面的优先级高

  Allow deny Deny   allow
Allow  only  允许 允许
Deny  only 拒绝 拒绝
Allow deny 拒绝 允许
none 拒绝 允许

 

  • 日志设定

日志类型:

访问日志,错误日志

Errorlog   logs/error_log

Loglevel  warn

Loglevel  可选值:debug  info  notice  warn   error  crit   alert   amerg

复习,http的服务访问

1、客户端发请求,建立连接(服务端接受到请求建立连接) 三次握手和dns

2、接受请求,三种工作模式MPM,多路处理模块 httpd,worker,event

并行的响应多个用户,event监控模块,持久连接,时间到了,接收的请求到了,

3、处理请求,分析请求报文首部,其中有method的方法,get,put,

4、访问资源,帮你到磁盘上访问资源get文件或者页面

5、响应请求,把文件或图片,从网站上读取出来了,http要把文件分装加http响应报文首部   完整的http报文

6、发送文件,

7、记入日志,var/log/access_log 文件

物理磁盘——内核—–应用程序http

当用户远程发送请求,先到达物理层web服务器,根据封装解封装的流程(先解析展开mac地址,网络接口层处理后到Internet层,Internet层把报文首部去掉,分析报文是不是我的,不是就丢掉,ip层处理过之后,到达传输层,tcp层,http服务监听80端口,应用层http服务收到请求,分析数据包报文的首部,看报文method的方法,假入是get,这时http服务就要替你去访问文件,把请求发送给内核,因为文件(图片)在磁盘上a.jpg,应用程序是不能直接访问硬件的,http程序将请求发送给内核,内核从磁盘上找到图片a.jpg,找到图片,先到达内核的缓存区buffer,在到达httpd的缓冲区,httpd就拿到了文件a.jip,开始封装响应报文首部,依次加,tcp报文首部,ip报文首部,mac地址,然后发出去)

11,设定默认字符集

addDefaultCharset  UTF-8、

中文字符集:GB2312

格式:Alias  /URL/   “/PATH/” 磁盘路径

13基于用户的访问控制

认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码

认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源

认证方式的两种:

Basic:明文

Digest:消息摘要认证,兼容性差

安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因

用户的账号和密码:

虚拟账号:仅用于访问某服务时用到的认证标识

存储:文件文本,sql数据库,ldap目录存储,nis

2,提供账号和密码存储(文本格式)

使用专用命令完成此类文件的创建及用户管理

-c:自动创建文件,仅应该在文件不存在时使用

-m:md5格式加密,默认方式

-s:sha格式加密

-D:删除指定用户

基于用户的访问实

[root@Centos6 ~]# cd /etc/httpd/conf.d

[root@Centos6 conf.d]# htpasswd -c .httpusers http1

[root@Centos6 conf.d]# htpasswd -m .httpusers http2

[root@Centos6 conf.d]# htpasswd -m .httpusers http3

[root@Centos6 html]#  mkdir secret

[root@Centos6 html]# echo /var/www/html/secret/index.html > secret/index

 

[root@Centos6 conf.d]# vim auth.conf

<directory /var/www/html/secret>

authtype basic

authname “Admin dir”

authuserfile “/etc/httpd/conf.d/.httpusers”

require user http1 http2

</directory>

[root@Centos6 conf.d]# service httpd restart

[root@centos7 ~]# links http://192.168.27.26/secret/

基于组的访问实验

[root@Centos6 ~]# cd /etc/httpd/conf.d

[root@Centos6 conf.d]# htpasswd -c .httpusers http1

[root@Centos6 conf.d]# htpasswd -m .httpusers http2

[root@Centos6 conf.d]# htpasswd -m .httpusers http3

[root@Centos6 html]#  mkdir secret

[root@Centos6 html]# echo /var/www/html/secret/index.html > secret/index

[root@Centos6 conf.d]# vim .httpgroups

admins: http1

users: http2

[root@Centos6 conf.d]# vim auth.conf

 

<directory /var/www/html/secret>

authtype basic

authname “Admin dir”

authuserfile “/etc/httpd/conf.d/.httpusers”

authgroupfile “/etc/httpd/conf.d/.httpgroups”

require group admins

</directory>

[root@Centos6 conf.d]# service httpd restart

[root@centos7 ~]# links http://192.168.27.26/secret/

 

远程客户端和用户验证的控制

Satisfy ALL|ANY

ALL 客户机IP和用户验证都需要通过才可以

ANY客户机IP和用户验证有一个满足即可

 

 

 

 

 

14,实现用户家目录的http共享

基于模块mod_userdir.so实现

SELinux:http_enable_homedirs

相关设置:

[root@Centos6 conf.d]#  vim  /etc/httpd/conf/httpd.conf

<IfModule mod_userdir.c>

  UserDir disabled

   UserDir publicweb

</IfModule>

[root@Centos6 conf.d]# mkdir /root/publicweb

[root@Centos6 conf.d]# echo /root/publicweb/index.html > /root/publicweb/index.html

[root@Centos6 conf.d]# setfacl -m u:apache:x /root/

[root@centos7 ~]# links http://192.168.27.26/~root/

 

[root@centos7 ~]# links http://192.168.27.26/~wang/

[root@Centos6 wang]# setfacl -m u:apache:x ~wang/

 

 

  • serversignature on|off |mail

当客户请求的网页并不存在时,服务器将产生错误文档,缺省情况下由于打开了serversignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息

如果不对外显示这些信息,就可以讲这个参数设置为off

设置为Email,将显示serveradmin的Email提示

16,server type inetd | standalone

Standalone 独立服务模式

Inetd   非独立服务

只适用于unix平台

17,status页面

<Location /server-status>

SetHandler server-status

Order deny,allow

Allow from .example.com

</Location>

Extended on 更详细

18,虚拟主机

站点标识:socket

Ip相同,但端口不同

Ip不同,但端口均为默认端口

Fqdn不同

有三种实现方案:

基于ip:为每一个虚拟主机准备至少一个ip地址

基于Port:为每个虚拟主机使用至少一个独立的Port

基于fqdn:为每一个虚拟主机使用至少一个fqdn

注意:一般虚拟主机不要与main主机混用;因此,要使用虚拟主机,一般先禁用main主机

禁用方法:注释中心主机的documentroot指令即可

实验:基于ip的虚拟主机

ip a a 192.168.27.66/24 dev eth3  增加一个 ip

[root@Centos6 app]# ls

website  website2  website3  创建文件

 

[root@Centos6 app]# vim /etc/httpd/conf.d/vhosts.conf 配置文件

<virtualhost 192.168.27.26:80>

documentroot /app/website

ErrorLog logs/website1-error_log

CustomLog logs/website1-access_log common

</virtualhost>

<virtualhost 192.168.27.66:80>

documentroot /app/website2

ErrorLog logs/website2-error_log

CustomLog logs/website2-access_log common

</virtualhost>

<virtualhost 172.18.1.26:80>

documentroot /app/website3

ErrorLog logs/website3-error_log

CustomLog logs/website3-access_log common

</virtualhost>

/app/website2

[root@centos7 ~]# curl 192.168.27.26

/app/website1

[root@centos7 ~]# curl 172.18.1.26

/app/website3

基于端口port 的虚拟主机

[root@Centos6 app]# vim /etc/httpd/conf.d/vhosts.conf

<virtualhost *:8001>

documentroot /app/website

ErrorLog logs/website1-error_log

CustomLog logs/website1-access_log common

</virtualhost>

<virtualhost *:8002>

documentroot /app/website2

ErrorLog logs/website2-error_log

CustomLog logs/website2-access_log common

</virtualhost>

<virtualhost *:8003>

documentroot /app/website3

ErrorLog logs/website3-error_log

CustomLog logs/website3-access_log common

</virtualhost>

listen 8001

listen 8002

listen 8003

基于FQDN的虚拟主机

[root@Centos6 app]# vim /etc/httpd/conf.d/vhosts.conf

NameVirtualHost *:80

<virtualhost *:80>

documentroot /app/website

servername www.a.com

ErrorLog logs/website1-error_log

CustomLog logs/website1-access_log common

</virtualhost>

<virtualhost *:80>

documentroot /app/website2

servername www.b.com

ErrorLog logs/website2-error_log

CustomLog logs/website2-access_log common

</virtualhost>

<virtualhost *:80>

documentroot /app/website3

servername www.c.com

ErrorLog logs/website3-error_log

CustomLog logs/website3-access_log common

</virtualhost>

[root@centos7 ~]# vim /etc/hosts   在该文件中的域名解析

192.168.27.26 www.a.com www.b.com www.

实验:混合使用ip和fqdn

Listen 8080

serverAlias  www.aa.com

http协议

http协议:stateless无状态

服务器无法持续追踪访问者来源

解决http协议无状态方法

Cookie 客户端存放

Session 服务端存放

http事务:一次访问的过程

请求:request

响应:response

 

Cookie技术 文本文件  字符窜

用户登录第一次连接网站,服务器生成一个cookie文件,发送到你的主机,cookie文件包含了你的个人信息

存放到自己主机的磁盘,标识了该主机的唯一身份,再次访问时,携带该coolie,服务器可以识别

重cookie,包含购物车信息

轻cookie,只放用户的id,cookie中的购物车信息放到了服务器上,即服务器上session部分

 

 

调度器,

Session在多服务器上的共享,session同步,(适合小的网站)

调度器,根据cookie来调度,或者某个网络地址段的,调度到某台机器上

Session 专门的session服务器,只是用来调度session

 

 

 

 

 

 

 

 

http响应报文

 

 

http响应报文

 

报文语法格式:

Requset报文

<methed><requset-URL><version>

<headers>

<entity-body>

Response报文

<methed><status><reason-phrase>

<headers>

<entity-body>

Method:请求方法,表明客户端希望服务器对资源执行的动作

GET  HEAD   POST 等

 

 

Version:HTTP/<major>.<minor>

Status:

三位数字,如200   301   302    404     502   标记请求处理过程中发生的情况

Reason-phrases

状态码所标记的状态的简要描述

Header:每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是值

Entity-body:请求时附加的数据或响应时附加的数据

Method:方法

GET:从服务器获取一个资源

POST:只从服务器获取文档的响应首部

PUT:向服务器输入数据,通常会在由网关程序继续处理

DELETE:请求删除服务器上指定的文档

TEACE:追踪请求到达服务器中间经过的代理服务器

OPTIONS:请求服务器返回对指定资源支持使用的请求方法

协议查看或分析的工具:

Tcpdump   wireshark   tshark

http协议状态码分类

Status(状态码)

1xx:100-101 信息提示

2xx:200-206 成功

3xx: 300-305 重定向  永久重定向和临时重定向

4xx: 400-415 错误类信息,客户端错误

5xx: 500-505 错误类信息,服务器端错误

http协议常用的状态码

200:成功,请求数据通过响应报文的entity-body部分发送;ok

301:请求的URL指向的资源已经被删除;但在响应报文中通过首部location指明了资源现在所处的新位置;movedpermanently

302:响应报文location指明资源临时新位置moved temporarily

304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此状态码通知客户端;not modified

401:需要输入账号和密码认证方能访问资源,unauthorized

403:请求被禁止;forbidden

404:服务器无法找到客户端请求的资源,not found

500:服务器内部错误:internal server error

502:代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;bad gateway

503-服务不可用,临时服务器维护或过载,服务器无法处理请求

504:网关超时

http首部字段

http首部字段包含的信息最为丰富。首部字段同时存在于请求和响应报文内,并涵盖http报文相关的内容信息。使用首部字段是为了给客户端和服务器端提供报文主体大小、所使用的语言、认证信息等内容

首部字段结构http首部字段是由首部字段名和字段值构成的,中间用冒号分隔

字段值对应单个http首都字段可以有多个值

报文首部中出现了两个或以上具有相同首部字段名的首部字段时,在规范内尚未明确,根据浏览器内部处理逻辑的不同,优先处理的顺序可能不同,结果可能并不一致

首部的分类:

通用首部:请求报文和响应报文两方都会使用的首部

请求首部:从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息。请求内容相关优先级等信息

响应首部:从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息

实体首部:针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息

扩展首部

通用首部:

data:报文的创建时间

Connection:连接状态,如keep-alive,close

Via:显示报文经过的中间节点   代理  网关

Cache-control:控制缓存,如缓存时常

MIME-version:发送端使用的MIME版本

Warning:错误通知

请求首部:

Accept:通知服务器自己可接收的媒体类型

Accept-charset:客户端可接受的字符集

Accept-encoding:客户端可接受编码格式 如gzip

Accept-language:客户端可接收的语言

 

Client-ip:请求的客户端ip

Host:请求的服务器名称和端口号

Referer:跳转至当前URI 的前一个URL

User-agent:客户端代理,浏览器版本

curl工具

Curl时基于URL语法在命令行方式下工作的文件传输工具,它支持FTP,FTPS,HTTP,HTTPS,GOPHER,TELNET

DICT,FILE及LDAP等协议。Curl支持https认证,并且支持http的post,put等方法,ftp上传,kerberos认证,http上传,代理服务器,cookies,用户名/密码认证,下载文件断点续传,上载文件断点续传,http代理服务器管道,还支持ipv6,socks5代理服务器,通过http代理服务器上传文件到ftp服务器等,功能十分强大

Mod_deflate模块

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

适用场景:

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

压缩适于压缩的资源,例如文本文件

https:http  over  ssl

Ssl会话的简化过程

  • 客户端发送可供选择的加密方式,并向服务器请求证书
  • 服务器端发送证书以及选定的加密方式给客户端
  • 客户端取得证书并进行证书验证

如果信任给其发证书的ca

(a)验证证书来源的合法性;用ca的公钥解密证书上数字签名

(b)验证证书的内容合法性;完整性检验

(c)检查证书的有效期

(d)检查证书是否被吊销

(e)证书中拥有者的名字,与访问的目标主机要一致

  • 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
  • 服务用此密钥加密用户请求的资源,响应给客户端

注意:ssl时基于ip地址实现,单ip的主机仅可以使用一个https虚拟主机

 

 

 

 

 

客户端向服务器发请求(我要和你通讯加密)——-(服务器端事先从ca申请到证书),把证书传给客户端——-客户端拿到证书————把该服务器端的证书带的公钥解开(事先拿到ca的公钥,利用公钥把ca经过签名过的证书拆开,得到里面合法的服务器的公钥)—————自己在客户端生成一个会话密钥(对称密钥)——–用得到的服务器端公钥加密—————-拿服务器的公钥加密,只能拿服务器的私钥解密,拿到会话密钥—后续就用会话密钥,加密解密通讯

做CA

[root@centos7 ~]# cd /etc/pki/CA

[root@centos7 CA]# tree

[root@centos7 CA]# touch index.txt

[root@centos7 CA]# echo 01  > serial 序列号

[root@centos7 CA]# (umask 077;openssl genrsa -out private/cakey.pem 2048)  生成私钥

[root@centos7 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650  生成自签名证书

 

申请证书

[root@webserv ~]# mkdir /etc/httpd/conf.d/ssl/

[root@webserv ~]# cd /etc/httpd/conf.d/ssl/

[root@webserv ssl]# (umask 077;openssl genrsa -out httpd.key ) 生成私钥

[root@webserv ssl]# openssl req -new -key httpd.key -out httpd.csr  证书申请

[root@webserv ssl]# scp http.csr 192.168.27.47:/etc/pki/CA/ 拷贝

[root@centos7 CA]# openssl ca -in httpd.csr -out certs/httpd.crt -days 700 签证书

[root@centos7 CA]# scp certs/httpd.crt 192.168.27.26:/etc/httpd/conf.d/ssl/

 

 

[root@webserv ssl]# vim /etc/httpd/conf.d/ssl.conf

SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt

SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key

[root@webserv ssl]# service httpd restart

 

[root@centos7 CA]# scp cacert.pem 192.168.27.26:/etc/httpd/conf.d/ssl/

SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert/pem

[root@webserv ssl]# service httpd restart

 

将http请求转发至https的URL

重定向

redirect   [ status]  URL-path  URL

Status状态:

Permanent: (301)永久

temp :(302)临时

示例:

[root@Centos6 conf.d]# vim test.conf

redirect temp / http://www.baidu.com/

Rewriteengine on

Rewriterule     ^(/.*)$1    https://%{HTTP_HOST}$1    [redirect=301]

^(/.*)$1         根下的任意字符窜

HTTP_HOST     表示前面域名 www.aa.com

$1             表示(/.*)

你访问我的根下的任何目录,我都把他转到https

 

 

 

 

HSTS:HTTP strict transport security

 

服务器端配置支持HSTS后,会在给浏览器返回的HTTP首部中携带HSTS字段。浏览器获取到该信息后,会将所有HTTP访问请求在内部307跳转到HTTPS。而无任何网络过程

HSTS preload list

是chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用chrome浏览器访问时,会自动转换成HTTPS.

 

实现HSTS示例

Vim /etc/httpd/conf/httpd.conf

Header alway set strict-transport-security “max-age=15768000”

Rewriteengine on

Rewriterule     ^(/.*)$1    https://%{HTTP_HOST}$1    [redirect=301]

 

Httpd的压力测试工具

ab,webbench ,http_load  seige

Jmeter

Loadrunner 商业,有相关认证

Tcpcopy 网易,复制生产环境中的真实请求,并将之保存

ab [OPTIONS]  URL

来自httpd-tool包

-n:总请求数

-c:模拟的并行数

-k:以持久连接模式测试

Ulimit -n # 调整能打开的文件数

 

Sendfile机制

 

—read(file,tmp_buf, len)

—write(socket, tmp_buf, len)

硬盘>>kernal buffer >>usrer buffer >>kernel socker buffer >> 协议栈

一般网络应用通过读硬盘数据,写数据到socket来完成网络传输,底层执行过程:

  • 系统调用read()产生一个上下文切换:从user mode切换到kernel mode,然后DMA执行拷贝,把文件数据从硬盘读到一个kernel buffer里
  • 数据从 kernelbuffer拷贝到user buffer,然后系统调用read()返回,这时又产生一个上下文切换:从kernel buffer切换到usermode
  • 系统调用write()产生一个上下文切换:从usermode切换到kernelmode然后把步骤2读到userbuffer的数据拷贝到kernel buffer(数据第二次拷贝到kernel buffer在、),不过这次是不同的kernel buffer,这个buffer和socket相关联
  • 系统调用write()返回,产生一个上下文切换:从kernel mode切换到user mode(第4次切换),然后DMA从kernelbuffer 拷贝数据到协议栈

在kernel2.0+版本中,系统调用sendfile()就是用来简化上面步骤提升性能的。

用sendfile()来进行网络传输的过程:

Sendfile(socket file len)

硬盘>> kernel buffer(快速拷贝到kernel socket buffer)>>协议

 

 

编译一般流程

1、./configure 是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。

2、make 是用来编译的,它从Makefile中读取指令,然后编译。

3、make install是用来安装的,它也从Makefile中读取指令,安装到指定的位置

实验:centos6.9编译安装httpd2.4.29方法1

[root@Centos6 ~]# mkdir httpd2.4

[root@Centos6 ~]# mv *.bz2 http2.4

[root@Centos6 ~]# cd httpd2.4/

yum groupinstall “development tools”   安装必要的工具包

yum install openssl-devel pcre-devel expat-devel 安装必要的工具包

[root@Centos6 apr-1.6.3]# ./configure –prefix=/app/apr   检验编译环境,

[root@Centos6 apr-1.6.3]# make -j 2 && make install    编译和安装

 

[root@Centos6 apr-util-1.6.1]# ./configure –prefix=/app/apr-util –with-apr=/app/apr/ && make -j 2 && make install

 

[root@Centos6 httpd-2.4.29]# ./configure –prefix=/app/httpd24 –enable-so –enable-ssl –enable-cgi –enable-rewrite –with-zlib –with-pcre –with-apr=/app/apr/ –with-apr-util=/app/apr-util/ –enable-modules=most –enable-mpms-shared=all –with-mpm=prefork

[root@Centos6 httpd-2.4.29]# make -j 2 && make install

[root@Centos6 httpd-2.4.29]# echo ‘PATH=/app/httpd24/bin/:$PATH’ > /etc/profile.d/httpd24.sh  生成环境变量

[root@Centos6 httpd-2.4.29]#  echo /app/httpd24/bin/apachectl start > /etc/rc.d/rc.local   放在启动脚本中开机启动

[root@Centos6 httpd-2.4.29]# cp /etc/init.d/httpd /etc/init.d/httpd24

[root@Centos6 httpd-2.4.29]#  vim /etc/init.d/httpd24 修改启动脚本

apachectl=/app/httpd24/bin/apachectl

httpd=${HTTPD-/app/httpd24/bin/httpd}

pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}

lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

[root@Centos6 httpd-2.4.29]# chkconfig –add  httpd24   加入到开机启动

[root@Centos6 httpd-2.4.29]# chkconfig  httpd24  on  默认235启动

 

老师总结

1包

yum groupinstall “development tools”

yum install openssl-devel pcre-devel expat-devel

tar xvf apr-1.6.3.tar.bz2

tar xvf apr-util-1.6.1.tar.bz2

tar xvf httpd-2.4.29.tar.bz2

2 安装apr和apr-util

安装apr-1.4+

cd apr-1.6.2

./configure –prefix=/app/apr

make && make install

?安装apr-util-1.4+

cd ../apr-util-1.6.0

./configure –prefix=/app/apr-util –with-apr=/app/apr/

make -j 2 && make install

3 编译安装httpd2.4

./configure –prefix=/app/httpd24 \

–enable-so \

–enable-ssl \

–enable-cgi \

–enable-rewrite \

–with-zlib \

–with-pcre \

–with-apr=/app/apr/ \

–with-apr-util=/app/apr-util/ \

–enable-modules=most \

–enable-mpms-shared=all \

–with-mpm=prefork

4 环境变量

echo ‘PATH=/app/httpd24/bin/:$PATH’ > /etc/profile.d/httpd24.sh

. /etc/profile.d/httpd24.sh

5 用户和组

useradd -r -s /sbin/nologin apache

6 配置文件

vim /app/httpd24/conf/httpd.conf

user apache

group apache

7 开机脚本

cp /etc/init.d/httpd /etc/init.d/httpd24

vim /etc/init.d/httpd24

apachectl=/app/httpd24/bin/apachectl

httpd=${HTTPD-/app/httpd24/bin/httpd}

pidfile=${PIDFILE-/app/httpd24/logs/httpd.pid}

lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

chkconfig –add httpd24

chkconfig httpd24 on

service httpd24 start

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/91390

(0)
sunchunjiangsunchunjiang
上一篇 2018-01-30 15:21
下一篇 2018-01-31 21:07

相关推荐

  • 关于大型网站技术演进的思考(四):存储的瓶颈(4)

    原文出处: 夏天的森林    如果数据库需要进行水平拆分,这其实是一件很开心的事情,因为它代表公司的业务正在迅猛的增长,对于开发人员而言那就是有不尽的项目可以做,虽然会感觉很忙,但是人过的充实,心里也踏实。 数据库水平拆分简单说来就是先将原数据库里的一张表在做垂直拆分出来放置在单独的数据库和单独的表里后更进一步的把本来是一个整体…

    2015-03-11
  • N23-第一周 记流水账

      机器已经设置好了  屏幕左边是linux控制台,屏幕中间放置记事本来记笔记,屏幕右边是教学视频,如图 费我老大劲 笔记本的无线网卡驱动不好弄啊   注重操作实践,全程跟着操作,一定要照着做,动手啊动手…………..前十五天内容以查漏补缺为主,所以笔记是兴之所至,遵循以下原则:&n…

    Linux干货 2016-09-18
  • N25_第二周作业

    前言 我们这次使用HAProxy作为负载均衡调度器来实现后端httpd服务的负载均衡和动静分离,实现将来自用户的80端口的http请求转发只后端8080端口的server服务 HAProxy介绍 HAProxy的是一个免费的,非常快速和可靠的解决方案,提供高可用性,负载均衡和代理对TCP和HTTP的应用程序。它特别适用于非常高流量网站。多年来,它已成为标准的…

    Linux干货 2016-12-12
  • 第一周-N28

    1、描述计算机的组成及功能 我们现在常用的计算机,包括手机及智能设备,通常由五大部件组成(冯若依曼提出),如下图所示: 五大部件: 运算器:做算数运算(加减乘除取余)和逻辑运算(移位) 控制器:控制各部分协调的功能。 CPU包括以下四个部分:运算器、控制器、寄存器、缓存 I/O设备:即输入输出设备,用于跟外部交互。通常为磁盘、键盘、鼠标、显示器、打印机等。I…

    2017-12-04
  • find、locate详细解析

    文件查找 在linux系统中如果我们不知道具体的文件的具体位置,我们可以使用文件查找命令来找到我们想找的文件,linux中也有相当优秀的查找命令,(如locate、find),通常查找速度快是locate,因为它是利用数据库查找的,所以速度很快,而find是全磁盘扫描进行查找,所以速度比较慢。 locate和find都是在文件系统上查找符合条件的文件含义。 …

    Linux干货 2016-08-13