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