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

相关推荐

  • 循环的特殊用法及函数

    while特殊用法 while read 变量名;do 循环体 done<文件路径(将文件中的每一行依次读入循环体,赋值给变量)   (())可以实现C语言风格的变量操作 for循环特殊格式 for((控制变量初始化;条件判断表达式;控制变量修正表达式)) do 循环体 done 控制变量初始化仅在循环开始时执行一次,进行条件判断成立后执行循…

    Linux干货 2016-08-21
  • VMWare网络连接的三种模式

    在创建虚拟机的时候我们会对网络适配器进行配置,那么网络适配器是什么呢?首先我们来简单介绍一下网络适配器。 计算机与外界局域网的连接是通过主机箱内插入一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡)。而网络接口板又称为通信适配器或网络适配器(networkadapter)或网络接口卡NIC(NetworkInterface Card),但是更多的人…

    Linux干货 2017-07-12
  • 编译内核制作小型的linux

    1.  前言       今天我将会给大家带来如何定制一个属于自己linux系统,也就是编译内核,那为什么要编译内核呢? 内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网络系统管理,决定着系统的性能和稳定性。Linux作为一个自由软件,在广 大爱好者的支持下,内核版本不…

    Linux干货 2016-08-03
  • Linux基础命令 -管道密切配合使用 tee

    基础命令和管道密切配合使用  tee     基础命令:tee   tee命令 功能: 把命令1的STDOUT保存在文件名中,然后管道输入给命令2; 补充说明:tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。 使用场景: 1.保存不同阶段的输出 2.复杂管道的故障排除 3.同时查看和记录…

    Linux干货 2016-08-03
  • Linux中的账号管理之命令的使用(中)

    linux中账号管理的命令非常多,我这里主要介绍最常见的几个命令,这些命令分别是针对用户和组的管理 主要介绍对用户管理的命令: 一、用户创建:useradd useradd命令用于Linux中创建的新的系统用户。useradd可用来建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实…

    Linux干货 2016-08-07
  • DNS基础及使用BIND搭建域名服务器

        本文主线是DNS服务相关概念和服务器搭建,在此之前了解一下域名这个东东很有其必要性,因为DNS服务就是应域名而生的。那么域名是什么哪?     域名     域名是用一串用点分开的字符串来表示的internet上的某一台或者一组计算机的名称,用于在数据传输时标识计算机的电子方位。举…

    Linux干货 2015-06-11