Socket概念

TCP/IP协议示意图

image-20200507201416065

跨网络的主机间通讯

  • 在建立通信连接的每一端,进程间的传输要有两个标志:
  • IP地址和端口号,合称为套接字地址 socket address
  • 客户机套接字地址定义了一个唯一的客户进程
  • 服务器套接字地址定义了一个唯一的服务器进程

image-20200507201543736

Socket套接字

image-20200507201603417

  • Socket:套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机) 上不同进程之间进行通信和数据交换,SocketAPI出现于1983年,4.2 BSD实现

  • Socket API:封装了内核中所提供的socket通信相关的系统调用

  • Socket Domain:根据套接字所使用的地址格式

    • AF_INET:Address Family,IPv4

    • AF_INET6:IPv6

    • AF_UNIX:同一主机上不同进程之间通信时使用

  • Socket API:封装了内核中的socket通信相关的系统调用

    • SOCK_STREAM:流,tcp套接字,可靠地传递、面向连接

    • SOCK_DGRAM:数据报,udp套接字,不可靠地传递、无连接

    • SOCK_RAW: 裸套接字,无须tcp或udp,APP直接通过IP包通信

客户/服务器程序的套接字函数

image-20200507202232184

套接字相关的系统调用:

  • socket(): 创建一个套接字
  • bind(): 绑定IP和端口
  • listen(): 监听
  • accept(): 接收请求
  • connect(): 请求连接建立
  • write(): 发送
  • read(): 接收
  • close(): 关闭连接

HTTP服务

HTTP服务通信过程

image-20200507213741670

image-20200507213755343

image-20200507213804635

HTTP相关服务

  • http: Hyper Text Transfer Protocol, 80/tcp

  • html: Hyper Text Markup Language 超文本标记语言,编程语言

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>
    <head>
    <meta http-equiv=Content-Type content="text/html;charset=utf-8">
    <title>html语言</title>
    </head>
    <body>
    <img src="http://xxx" >
    <h1>你好</h1>
    <p><a href=http://xxx>xxx</a>xxx</p>
    </body>
    </html>
  • CSS:Cascading Style Sheet 层叠样式表

  • js:javascript,客户端脚本

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

    ​ /etc/mime.types

    格式:major/minor

    ​ text/plain text/html

    ​ text/css

    ​ image/jpeg

    ​ image/png

    ​ video/mp4

    ​ application/javascript

    参考:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_Types

    http://www.w3school.com.cn/media/media_mimeref.asp

HTTP工作机制

  • 工作机制:

    • http请求:http request
    • http响应:http response
    • 一次http事务:请求<–>响应
  • Web资源:web resource

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

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

      文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi

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

      文件后缀:.php, .jsp ,.asp

HTTP连接请求

image-20200507215641079

串行连接和并行连接

image-20200507215718060

串行,持久连接和管道

image-20200507215745030

  • 提高HTTP连接性能
    • 并行连接:通过多条TCP连接发起并发的HTTP请求
    • 持久连接:keep-alive,长连接,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
    • 管道化连接:通过共享TCP连接发起并发的HTTP请求
    • 复用的连接:交替传送请求和响应报文(实验阶段)

HTTP报文

通用首部

  • Date:报文创建的时间
  • Connection:连接状态,如Keep-alive, close
  • via:显示报文经过的中间节点(代理服务器)
  • Cache-Control:控制缓存
  • Pragma:

请求报文

  • 格式:请求行 请求头部 空行 请求数据 四个部分组成

  • 请求行: GET(请求方法) URL(请求资源) HTTP/1.1(协议号和版本号)

  • 请求头部:

    • Host字段:请求资源的主机地址

    • User-Agent字段:浏览器标识

    • Accept: 媒体类型 –> 告诉服务端我能认识什么样的资源

    • Accept-Charset: 支持的字符集

    • Accept-Encoding: 支持的编码方式,一般指压缩机制,如gzip,deflate,sdch

    • Accept-Language: 支持使用的语言

    • Referer:指明当前资源的原始URL(从哪个页面跳转的)

    • Cache-Control:缓存控制

    • Connection: keep-alive(连接保持-tcp连接)

    • Cookie:身份标识 –> Session

      ……

  • 请求数据:
    xxxx

  • 请求方法:

    • GET:请求指定的页面信息
    • POST:向指定资源提交数据进行处理(表单)
    • HEAD: 类似GET请求,但是返回内容仅仅头部信息
    • PUT:从客户端向服务端传送的数据取代指定的文本内容
    • DELETE: 删除指定的页面信息
    • CONNECT: 预留给能够将连接改成管道方式的代理服务器
    • OPTIONS:允许客户端查看服务器性能
    • TRACE:回显服务端收到的请求,主要用于测试
  • GET请求和POST请求的区别:

    • 关于参数位置:GET请求会放在浏览器输入栏中以? & ;POST请求会将参数放到请求体中
    • 关于大小限制:GET请求会有大小限制(浏览器对url长度会有限制);POST对提交的数据没有大小限制
    • 安全性方面:GET请求会把信息都在输入栏中显示(不安全的);相对来说POST请求是比较安全的(登录时的用户名和密码)
    • 后端代码对GET请求和POST请求的资源使用的方法是不一样的

响应报文

  • 状态行 响应头部 空行 响应数据 四个部分组成

  • 状态行:协议/协议版本 状态码 状态消息

  • 响应头部

  • 响应数据:HTML文件

  • 状态码

    • 1xx:指示信息-表示请求已经接受,继续处理
    • 2xx:成功-表示请求已经被成功接受,理解,并处理
    • 3xx:重定向-要完成请求必须进行更进一步的操作
    • 4xx:客户端错误 - 请求的语法存放错误
    • 5xx:服务端错误 - 服务端不能够处理请求

    • 200: OK
    • 301: 永久重定向 Moved Permanently
    • 302: 临时重定向 Found
    • 304: 请求被重定向到本地缓存 Not Modified
    • 400: 客户端语法存在错误
    • 401: 客户端请求没有授权 Unauthorized
    • 403: 客户端授权错误 Forbidden
    • 404: 客户端请求的资源在服务端不存在 Not Found
    • 500: 服务端内部错误 Internal Serve Error
    • 502: 服务端不能处理请求 Bad Gateway
    • 503: servcie .. : 客户端请求无法处理
    • 504: 服务端没能接收到请求 Gateway Tiemout

HTTP协议

image-20200507220008611

  • http/0.9:1991,原型版本,功能简陋,只有一个命令GET。GET/index.html ,服务器只能回应HTML格式字符串,不能回应别的格式

  • http/1.0: 1996年5月,支持cache, MIME, method

    • 每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接

    • 引入了POST命令HEAD命令

    • 头信息是 ASCII 码,后面数据可为任何格式。服务器回应时会告诉客户端, 数据是什么格式,即Content-Type字段的作用。这些数据类型总称为MIME 多 用途互联网邮件扩展,每个值包括一级类型和二级型,预定义的类型,也可自定义类型, 常见Content-Type值:text/xml image/jpeg audio/mp3

  • http/1.1:1997年1月

    • 引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器允许同时建立6个持久连接

    • 引入了管道机制(pipelining),即在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率

    • 新增方法:PUT、PATxCH、OPTIONS、DELETE、TRACE

    • 同一个TCP连接里,所有的数据通信是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,造成”队头堵塞”(Head-of-line blocking)

    • 为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接。网页优化技巧,如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等

    • HTTP 协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响速度

HTTP1.0和HTTP1.1的区别

  • 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略

  • 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接

  • 错误通知的管理,在HTTP1.1中新增24个状态响应码,如409(Conflict)表示请求的资源与资 源当前状态冲突;410(Gone)表示服务器上的某个资源被永久性的删除

  • Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的 URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以 存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)

  • 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理, 在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在 HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点

image-20200507220413186

  • HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间,特别是在移动端更为突出
  • HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性
  • HTTP1.x在使用时,header里携带的内容过大,增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量
  • 虽然HTTP1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep- alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间

HTTPS

  • 为解决安全问题,网景在1994年创建了HTTPS,并应用在网景导航者浏览器中。 最初,HTTPS是与SSL一起使用的;在SSL逐渐演变到TLS时(其实两个是一个东西,只是名字不同而已),最新的HTTPS也由在2000年五月公布的RFC 2818正式确定下来。HTTPS就是安全版的HTTP,目前大型网站基本实现全站 HTTPS
  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
  • HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS 之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
  • HTTP和HTTPS使用的是不同的连接方式,端口不同,前者是80,后者是443
  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
  • HTTPS 中的SSL握手等过程降低用户访问速度,但是只要经过合理优化和部署, HTTPS 对速度的影响完全可以接受

SPDY

  • SPDY:2009年,谷歌研发,综合HTTPS和HTTP两者有点于一体的传输协议,主要特点:
  • 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)。 多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题, 降低了延迟同时提高了带宽的利用率
  • 请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的 基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,重要的 请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才 是各种静态资源文件,脚本文件等加载,可以保证用户能第一时间看到网页内容
  • header压缩。HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减 小包的大小和数量
  • 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性
  • 服务端推送(server push),采用了SPDY的网页,例如网页有一个sytle.css的请求, 在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了

HTTP2

  • http/2.0:2015年
    • HTTP2.0是SPDY的升级版
    • 头信息和数据体都是二进制,称为头信息帧和数据帧
    • 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多工(Multiplexing)
    • 引入头信息压缩机制(header compression),头信息使用gzip或compress 压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
    • HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
  • HTTP2.0和SPDY区别:
    • HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
    • HTTP2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE

URI

  • URI: Uniform Resource Identifier 统一资源标识,分为URL和URN

    • URN: Uniform Resource Naming,统一资源命名

      示例: P2P下载使用的磁力链接是URN的一种实现

      magnet:?xt=urn:btih:660557A6890EF888666

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

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

URL组成

image-20200507221131219

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

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

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

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

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

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

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

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

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

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

URL示例

网站访问量

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

  • PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一 次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量

  • UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过来访电脑的cookies实现的。如果更换了IP后但不清除 cookies,再访问相同网站,该网站的统计中UV数是不变的

    示例:

    甲乙丙三人在同一台通过ADSL上网的电脑上(中间没有断网),分别访问xxx网站,并且每人各浏览了2个页面,那么网站的流量统计是:

    IP: 1 PV:6 UV:1

    若三人都是ADSL重新拨号后,各浏览了2个页面,则

    IP: 3 PV:6 UV:1

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

  • QPS:request per second,每秒请求数

  • PV,QPS,并发连接数换算公式

    • QPS= PV* 页⾯衍⽣连接次数/ 统计时间(86400)
    • 并发连接数 =QPS * http平均响应时间
  • 峰值时间:每天80%的访问集中在20%的时间里,这20%时间为峰值时间

  • 峰值时间每秒请求数(QPS)=( 总PV数 *页⾯衍⽣连接次数)80% ) / ( 每天秒数\ 20% )

Web服务请求处理步骤

image-20200507221706703

一次完整的http请求处理过程

  1. 建立连接:接收或拒绝连接请求

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

    Web访问响应模型(Web I/O)

    • 单进程I/O模型:启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应
    • 多进程I/O模型:由父进程并行启动多个子进程,每个子进程响应一个连接请求
    • 复用I/O结构:启动一个进程,同时响应N个连接请求
      • 多线程模式:一个进程生成n个线程,一个线程处理一个请求;
      • 事件驱动(event-driven):一个进程直接处理n个请求
    • 复用的多进程I/O模型:启动M个进程,每个进程响应N个连接请求,同时接收M*N个请求

image-20200508130120574

  1. 处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
  • 元数据:请求报文首部
    <method> <URL> <VERSION>
    HEADERS 格式 name:value
    <request body>

  • 示例:
    Host: www.xxx.com 请求的主机名称
    Server: Apache/2.4.7

  • HTTP常用请求方式,Method

    GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS

  1. 访问资源:

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

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

    DocRoot ➡ /var/www/html

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

    http://www.magedu.com/images/logo.jpg

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

      (a)docroot

      (b)alias

      (c)虚拟主机docroot

      (d)用户家目录docroot

  2. 构建响应报文:

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

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

      • 描述了响应主体MIME类型的Content-Type首部
      • 描述了响应主体长度的Content-Length
      • 实际报文的主体内容
    2. URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一 个访问路径

      永久重定向:http://www.360buy.com

      临时重定向:http://www.taobao.com

    3. MIME类型:

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

      • 魔法分类:Apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名时
      • 显式分类:可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强 制特定文件或目录内容拥有某个MIME类型
      • 类型协商: 有些Web服务器经过配置,可以以多种文档格式来存储资源。在这 种情况下,可以配置Web服务器,使其可以通过与用户的协商来决定使用哪种格 式(及相关的MIME类型)”最好”
  3. 发送响应报文

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

  4. 记录日志

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

HTTP服务器应用

  • http服务器程序
    • httpd apache,存在C10K(10K connections)问题
    • nginx 解决C10K问题
    • lighttpd
  • 应用程序服务器
    • IIS .asp
    • tomcat .jsp
    • jetty 开源的servlet容器,基于Java的web容器
    • Resin CAUCHO公司,支持servlets和jsp的引擎
    • webshpere(IBM), weblogic(BEA), jboss,oc4j(Oracle)
  • 市场占有率统计
    http://www.netcraft.com

Httpd

介绍

  • httpd

    20世纪90年代初,国家超级计算机应用中心NCSA开发 1995年开源社区发布apache(apatchy server)

    • ASF: apache software foundatio
    • FSF:Free Software Foundation
  • 特性:

    • 高度模块化:core + modules
    • DSO:Dynamic Shared Object 动态加/卸载
    • MPM:multi-processing module多路处理模块

MPM工作模式(多路处理模块)

  • prefork:多进程I/O模型,每个进程响应一个请求,默认模型

    • 一个主进程:生成和回收n个子进程,创建套接字,不响应请求
    • 多个子进程:工作work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
  • worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型

    • 一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n
  • event:事件驱动模型(worker模型的变种)

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

      httpd-2.2:event 测试版,centos6默认

      httpd-2.4:event 稳定版,centos7默认

perfork MPM

image-20200508131153003

  • Prefork MPM: 预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
  • 优点:稳定
  • 缺点:慢,占用资源,不适用于高并发场景

worker MPM

image-20200508131238486

  • worker MPM:是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。
  • 优点:相比prefork占用的内存较少,可以同时处理更多的请求
  • 缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

event MPM

image-20200508131314051

  • event MPM:Apache中最新的模式,属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被 keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

  • event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了 TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)

  • 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线 程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程, 执行完毕后,又允许它释放

  • 缺点:没有线程安全控制

Httpd功能特性

  • 虚拟主机

    IP、Port、FQDN

  • CGI:Common Gateway Interface,通用网关接口

  • 反向代理

  • 负载均衡

  • 路径别名

  • 丰富的用户认证机制

    • basi
    • digest
  • 支持第三方模块

  • httpd-2.4新特性

    • MPM支持运行为DSO机制;以模块形式按需加载
    • event MPM生产环境可用
    • 异步读写机制
    • 支持每模块及每目录的单独日志级别定义
    • 每请求相关的专用配置
    • 增强版的表达式分析式
    • 毫秒级持久连接时长定义
    • 基于FQDN的虚拟主机不需要NameVirutalHost指令
    • 新指令,AllowOverrideList
    • 支持用户自定义变量
    • 更低的内存消耗

Httpd安装

  • 版本:

    CentOS 7: 2.4

    CentOS 6: 2.2

  • 安装方式:

    rpm:centos发行版,稳定,建议使用

    编译:定制或特殊需求

Httpd程序环境

CentOS 7程序环境:httpd-2.4

  • 配置文件:

    • /etc/httpd/conf/httpd.conf 核心配置文件
    • /etc/httpd/conf.d/*.conf
    • /etc/httpd/conf.modules.d/*.conf 模块配置文件
  • 检查配置语法:

    • httpd –t
  • 服务单元文件: /usr/lib/systemd/system/httpd.service

  • 配置文件:/etc/sysconfig/httpd

  • 服务控制和启动:

    • systemctl enable|disable httpd.service

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

  • 站点网页文档根目录:/var/www/html

  • 模块文件路径:

    • /etc/httpd/modules

    • /usr/lib64/httpd/modules

  • 主程序文件:/usr/sbin/httpd

    • httpd-2.4支持MPM的动态切换
  • 主进程文件:/etc/httpd/run/httpd.pid

  • 日志文件目录:

    • /var/log/httpd
    • access_log: 访问日志
    • error_log:错误日志
  • 帮助文档包:httpd-manual

Httpd常见配置

  • httpd配置文件的组成:
    主要组成

    • Global Environment
    • Main server configuration
    • virtual host
  • 配置格式:directive value

    • directive 不区分字符大小写
    • value 为路径时,是否区分大小写,取决于文件系统
  • 官方帮助
    http://httpd.apache.org/docs/2.4/

  • 显示服务器版本信息

    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

    ServerTokens Prod[uctOnly] :Server: Apache ServerTokens Major: Server: Apache/2 ServerTokens Minor: Server: Apache/2.0 ServerTokens Min[imal]: Server: Apache/2.0.41 ServerTokens OS: Server: Apache/2.0.41 (Unix)

    ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2

    This setting applies to the entire server and cannot be enabled or disable on a virtualhost-by-virtualhost basis.

    After version 2.0.44, this directive also controls the information presented by the ServerSignature directive.

    建议使用:ServerTokens Prod

  • 监听的IP和Port
    Listen [IP:]PORT [protocol]
    (1) 省略IP表示为本机所有IP

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

    (3) 修改监听socket,重启服务进程方可生效

    (4) 限制其必须通过ssl通信时,protocol需要定义为https

    1
    2
    Listen 80
    Listen 8080

    示例:

    1
    2
    Listen 192.168.1.100:8080
    Listen 80 https
  • 持久连接(保持连接,长连接)

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

    • 断开条件:时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级

    • 副作用:对并发访问量大的服务器,持久连接会使有些请求得不到响应

    • 折中:使用较短的持久连接时间

    • 设置:KeepAlive On|Off

      ​ KeepAliveTimeout 15

      ​ MaxKeepAliveRequests 500 持久连接最大接收的请求数

    • 测试:telnet WEB_SERVER_IP PORT

      ​ GET /URL HTTP/1.1

      ​ Host: WEB_SERVER_IP

  • DSO: Dynamic Shared Object

    加载动态模块配置,不需重启即生效

    1
    2
    /etc/httpd/conf/httpd.conf 
    Include conf.modules.d/*.conf

    配置指定实现模块加载格式:

    LoadModule <mod_name> <mod_path>

    模块文件路径可使用相对路径:相对于ServerRoot(默认/etc/httpd)

    示例:LoadModule auth_basic_module modules/mod_auth_basic.so

    • 动态模块路径:
      • /usr/lib64/httpd/modules/
    • 查看静态编译的模块
      • httpd -l
    • 查看静态编译及动态装载的模块
      • httpd –M
  • MPM( Multi-Processing Module)多路处理模块

    prefork, worker, event

    切换使用的MPM

    /etc/httpd/conf.modules.d/00-mpm.conf

    启用要启用的MPM相关的LoadModule指令即可

    • prefork的配置

      1
      2
      3
      4
      5
      6
      7
      StartServers		2000 进程启动时创建的子进程数
      MinSpareServers 2000 最少空闲进程数
      MaxSpareServers 3000 最大空闲进程数
      ServerLimit 2560 最多进程数,最大值 20000
      MaxRequestWorkers 2560 最大的并发连接数,默认256
      MaxRequestsPerChild 4000 子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
      MaxConnectionsPerChild 4000 子进程最多能处理的连接数量,代替上面MaxRequestsPerChild ,httpd.2.4.9开始支持
    • worker的配置

      1
      2
      3
      4
      5
      6
      ServerLimit			16
      StartServers 2
      MaxRequestWorkers 150
      MinSpareThreads 25
      MaxSpareThreads 75
      ThreadsPerChild 25
  • 定义’Main’ server的文档页面路径

    DocumentRoot "/path"

    文档路径映射:DocumentRoot指向的路径为URL路径的起始位置

    示例:DocumentRoot “/app/data“

    http://HOST:PORT/test/index.html –> /app/data/test/index.html 注意:SELinux和iptables的状态

  • 定义站点主页面

    DirectoryIndex index.html

  • 站点访问控制常见机制

    可基于两种机制指明对哪些资源进行何种访问控制访问控制机制有两种:客户端来源地址,用户账号

    • 文件系统路径

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      <Directory “/path">
      ...
      </Directory>

      <File “/path/file”>
      ...
      </File>

      <FileMatch "PATTERN">
      ...
      </FileMatch>
    • URL路径

      1
      2
      3
      4
      5
      6
      7
      <Location	"">
      ...
      </Location>

      <LocationMatch "PATTETN">
      ...
      </LocationMatch>
    • 示例

      1
      2
      3
      4
      <FilesMatch "\.(gif|jpe?g|png)$">
      <Files “?at.*”> 通配符
      <Location /status>
      <LocationMatch "/(extra|special)/data">
  • <Directory>中“基于源地址”实现访问控制

    1. Options:后跟1个或多个以空白字符分隔的选项列表 在选项前的+,- 表示增加或删除指定选项

    常见选项:

    • Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
    • FollowSymLinks:允许访问符号链接文件所指向的源文件
    • None:全部禁用
    • All: 全部允许

    示例:

    1
    2
    3
    4
    5
    6
    7
    <Directory /web/docs>
    Options Indexes FollowSymLinks
    </Directory>

    <Directory /web/docs/spec>
    Options FollowSymLinks
    </Directory>
    1. AllowOverride
      与访问控制相关的哪些指令可以放在指定目录下的.htaccess(由AccessFileName指定)文件中,覆盖之前的配置指令
      只对<directory>语句有效
1
2
3
AllowOverride  All: .htaccess中所有指令都有效
AllowOverride None: .htaccess 文件无效
AllowOverride AuthConfig .htaccess 文件中,除了AuthConfig其它指令都无法生效
  • 基于IP的访问控制:

    • 无明确授权的目录,默认拒绝

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

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

    • 控制特定的IP访问:

      Require ip IPADDR:授权指定来源的IP访问

      Require not ip IPADDR:拒绝特定的IP访问

    • 控制特定的主机访问:

      Require host HOSTNAME:授权特定主机访问

      Require not host HOSTNAME:拒绝

      HOSTNAME:

      • FQDN:特定主机
      • domin.tld:指定域名下的所有主机
  • 不能有失败,至少有一个成功匹配才成功,即失败优先

    1
    2
    3
    4
    <RequireAll>
    Require all granted
    Require not ip 172.16.1.1 拒绝特定IP
    </RequireAll>
  • 多个语句有一个成功,则成功,即成功优先

    1
    2
    3
    4
    <RequireAny>
    Require all denied
    require ip 172.16.1.1 允许特定IP
    </RequireAny>
  • 日志设定

    • 日志类型:

      • 访问日志
      • 错误日志
    • 错误日志:

      • ErrorLog logs/error_log
      • LogLevel warn
      • LogLevel 可选值: debug, info, notice, warn,error, crit, alert, emerg
    • 访问日志

      • 定义日志格式:LogFormat format strings

        LogFormat "%h %l %u %{ %F %T}t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" testlog

      • 使用日志格式:

        CustomLog logs/access_log testlog

        参考帮助:

        http://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats

        • %h 客户端IP地址
        • %l 远程用户,启用mod_ident才有效,通常为减号“-”
        • %u 验证(basic,digest)远程用户,非登录访问时,为一个减号“-”
        • %t 服务器收到请求时的时间
        • %r First line of request,即表示请求报文的首行;记录了此次请求的“方法”“URL”以及协议版本
        • %s 原始响应状态码
        • %>s 响应状态码
        • %b 响应报文的大小,单位是字节;不包括响应报文http首部
        • %{Referer}i 请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的
        • %{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序
  • 设定默认字符集

    • AddDefaultCharset UTF-8 此为默认值
    • 中文字符集:GBK, GB2312, GB18030
  • 定义路径别名

    格式:Alias /URL/ “/PATH/“

    示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    alias /netScript /data/downloads/network-scripts      
    #千万要注意,"/netScript"前面的"/"别忘记写了哟~,当客户端访问"/netScript"就会自动跳转到"/data/downloads/network-script"目录下去找index.html,若没有index.html文件就会遵守咱们配置的Options指令,会列出所有文件包括链接文件哟~

    Alias "/image" "/ftp/pub/image"
    <Directory "/ftp/pub/image">
    Require all granted
    </Directory>

    如果Alias指令在<Location>或<LocationMatch>节中使用,则省略URL路径,并使用表达式语法解释文件路径。此语法在Apache2.4.19及更高版本中可用。
    <Location "/image">
    Alias "/ftp/pub/image"
    </Location>
    <LocationMatch "/error/(?<NUMBER>[0-9]+)">
    Alias "/usr/local/apache/errors/%{env:MATCH_NUMBER}.html"
    </LocationMatch>
  • 基于用户的访问控制

    • 认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
    • 认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
    • 认证方式两种:
      • basic:明文
      • digest:消息摘要认证,兼容性差
    • 安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
    • 用户的账号和密码
      • 虚拟账号:仅用于访问某服务时用到的认证标识
      • 存储:文本文件,SQL数据库,ldap目录存储,nis等

    basic认证配置示例:

    (1)定义安全域

    1
    2
    3
    4
    5
    6
    7
    8
    <Directory “/path"> 
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "String"
    AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
    Require user username1 username2 ...
    </Directory>

    允许账号文件中的所有用户登录访问:

    Require valid-user

    (2) 提供账号和密码存储(文本文件)

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

    htpasswd [options] /PATH/HTTPD_PASSWD_FILE username

    • -c 自动创建文件,仅在文件不存在时使用
    • -p 明文密码
    • -n 不加入文件,直接显示密码
    • -b 命令行中免交互直接指定密码
    • -d CRYPT格式加密,默认
    • -m md5格式加密
    • -s sha格式加密
    • -D 删除指定用户
  • 基于组账号进行认证

    (1) 定义安全域

    1
    2
    3
    4
    5
    6
    7
    <Directory “/path"> 
    AuthType Basic
    AuthName "String“
    AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"
    AuthGroupFile "/PATH/HTTPD_GROUP_FILE"
    Require group grpname1 grpname2 ...
    </Directory>

    (2) 创建用户账号和组账号文件组文件:每一行定义一个组

    ​ GRP_NAME: username1 username2 …

    示例:

    1
    2
    vim /etc/httpd/conf.d/.htgroup
    webadmins:xxx yyy
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <Directory "/www/htdocs/admin">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "Administator private"
    AuthUserFile "/etc/httpd/conf.d/.htpasswd"
    AuthGroupFile "/etc/httpd/conf.d/.htgroup"
    Require group webadmins
    </Directory>
  • 远程客户端和用户验证的控制

    Satisfy ALL|Any

    • ALL 客户机IP和用户验证都需要通过才可以
    • Any客户机IP和用户验证,有一个满足即可

    示例:

    1
    2
    3
    4
    5
    Require valid-user
    Require all granted
    <RequireAll>
    Require not ip 172.16.1.1
    </RequireAll> Satisfy Any
  • 实现用户家目录的http共享
    基于模块mod_userdir.so实现
    相关设置:
    vim /etc/httpd/conf.d/userdir.conf

    1
    2
    3
    4
    <IfModule mod_userdir.c>
    #UserDir disabled
    UserDir public_html #指定共享目录的名称
    </IfModule>
    • 准备目录
      su – kinmfer;mkdir ~/public_html
      setfacl –m u:apache:x ~kinmfer

    • 访问

      1
      http://localhost/~kinmfer/index.html
  • ServerSignature On | Off | EMail

    默认值Off,当客户请求的网页并不存在时,服务器将产生错误文档,如果打开 了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache 的版本等信息,如果不对外显示这些信息,就可以将这个参数设置为Off

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

  • TraceEnable [on|off|extended]

    是否支持trace方法,默认on,基于安全风险,建议关闭

  • status页面

    1
    2
    3
    4
    5
    6
    7
    8
    LoadModule	status_module	modules/mod_status.so
    <Location "/status">
    SetHandler server-status
    <RequireAll>
    Require 172.16
    </RequireAll>产环境中不要使用Require all granted 这样不安全,或者直接做认证
    </Location>
    ExtendedStatus On 显示扩展信息
  • 虚拟主机

    站点标识: socket

    • IP相同,但端口不同
    • IP不同,但端口均为默认端口
    • FQDN不同:请求报文中首部 Host:xxx

    有三种实现方案:

    • 基于ip:为每个虚拟主机准备至少一个ip地址
    • 基于port:为每个虚拟主机使用至少一个独立的port
    • 基于FQDN:为每个虚拟主机使用至少一个FQDN

    虚拟主机的配置方法:

    1
    2
    3
    4
    <VirtualHost IP:PORT> 
    ServerName FQDN 如果不指定会反解IP所指定的域名
    DocumentRoot "/path"
    </VirtualHost>

    建议:上述配置存放在独立的配置文件中

    其它可用指令:

    • ServerAlias:虚拟主机的别名;可多次使用
    • ErrorLog: 错误日志
    • CustomLog:访问日志
    • <Directory “/path”> </Directory>
    • Alias

    示例:

    • 基于ip

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      <VirtualHost 172.16.100.6:80>  
      ServerName www.a.com
      DocumentRoot "/www/a.com/htdocs"
      </VirtualHost>

      <VirtualHost 172.16.100.7:80>
      ServerName www.b.net
      DocumentRoot "/www/b.net/htdocs"
      </VirtualHost>

      <VirtualHost 172.16.100.8:80>
      ServerName www.c.org
      DocumentRoot "/www/c.org/htdocs"
      </VirtualHost>
    • 基于端口

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      listen 808
      listen 8080
      <VirtualHost 172.16.100.6:80>
      ServerName www.a.com
      DocumentRoot "/www/a.com/htdocs"
      </VirtualHost>

      <VirtualHost 172.16.100.6:808>
      ServerName www.b.net
      DocumentRoot "/www/b.net/htdocs"
      </VirtualHost>

      <VirtualHost 172.16.100.6:8080>
      ServerName www.c.org
      DocumentRoot "/www/c.org/htdocs"
      </VirtualHost>
    • 基于FQDN

      httpd2.4基于FQDN的虚拟主机不再需要NameVirutalHost指令

      1
      2
      3
      4
      5
      6
      7
      8
      9
      <VirtualHost *:80>
      ServerName www.b.net
      DocumentRoot "/apps/b.net/htdocs"
      <Directory "/apps/b.net/htdocs">
      Options None
      AllowOverride None
      Require all granted
      </Directory>
      </VirtualHost>

      注意:

      • 任意目录下的页面只有显式授权才能被访问
      • 三种方式的虚拟主机可以混和使用

mod_deflate模块

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

    http://httpd.apache.org/docs/2.4/mod/mod_deflate.html

  • 适用场景:

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

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

  • DeflateCompressionLevel 9 指定压缩比

  • 排除特定旧版本的浏览器,不支持压缩

    Netscape 4.x 只压缩text/html

    BrowserMatch ^Mozilla/4 gzip-only-text/html

    Netscape 4.06-08三个版本 不压缩

    BrowserMatch ^Mozilla/4.0[678] no-gzip

    Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压 缩。如果用户代理首部匹配字符串“MSIE”(“B”为单词边界”),就关闭之前定义的限制

    BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html

  • 配置示例

    编辑 http.conf 文件

    去掉 #LoadModule headers_module modules/mod_headers.so 前面的注释#
    去掉 #LoadModule deflate_module modules/mod_deflate.so 前面的注释#
    去掉 #LoadModule filter_module modules/mod_filter.so 前面的注释#

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <IfModule mod_deflate.c>
    DeflateCompressionLevel 9
    SetOutputFilter DEFLATE

    AddOutputFilterByType DEFLATE text/html
    AddOutputFilterByType DEFLATE text/plain
    AddOutputFilterByType DEFLATE text/xml
    AddOutputFilterByType DEFLATE text/css
    AddOutputFilterByType DEFLATE text/javascript

    # 或者这样设置
    # AddOutputFilterByType DEFLATE text/*
    AddOutputFilterByType DEFLATE application/x-javascript
    AddOutputFilterByType DEFLATE application/javascript
    AddOutputFilterByType DEFLATE application/json
    AddOutputFilterByType DEFLATE application/ms* application/vnd*

    #这段是告诉apache对php类型的文件进行压缩
    AddOutputFilterByType DEFLATE application/x-httpd-php application/x-httpd-fastphp

    #设置不对后缀gif,jpg,jpeg,png的图片文件进行压缩
    SetEnvIfNoCase Request_URI .(?:gif|jpe?g|png)$ no-gzip dont-vary
    #同上,就是设置不对exe,tgz,gz。。。的文件进行压缩
    SetEnvIfNoCase Request_URI .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI .(?:pdf|mov|avi|mp3|mp4|rm)$ no-gzip dont-vary

    # 有一些问题,所以只压缩文件类型是text/html的
    BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.x
    # 有更多的问题,所以不开启压缩
    BrowserMatch ^Mozilla/4.0[678] no-gzip # Netscape 4.06-4.08
    # IE浏览器会伪装成 Netscape ,但是事实上它没有问题
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    </IfModule>

    Https

  • https:http over ssl

  • SSL会话的简化过程

    (1)客户端发送可供选择的加密方式,并向服务器请求证书

    (2)服务器端发送证书以及选定的加密方式给客户端

    (3)客户端取得证书并进行证书验证

    ​ 如果信任给其发证书的CA

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

    ​ (b)验证证书的内容的合法性:完整性验证

    ​ (c)检查证书的有效期限

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

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

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

    (5)服务用此密钥加密用户请求的资源,响应给客户端

  • 注意:SSL是基于IP地址实现,单IP的主机仅可以使用一个https虚拟主机

  • httpd -t -D DUMP_VHOSTS 查看虚拟主机配置

实现

(1) 为服务器申请数字证书

​ 测试:通过私建CA发证书

​ (a)创建私有CA

​ (b)在服务器创建证书签署请求

​ (c)CA签证

(2) 配置httpd支持使用ssl,及使用的证书

yum -y install mod_ssl

​ 配置文件:/etc/httpd/conf.d/ssl.conf

​ DocumentRoot

​ ServerName

​ SSLCertificateFile

​ SSLCertificateKeyFile

(3) 测试基于https访问相应的主机

openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

http重定向https

  • 将http请求转发至https的URL

  • 重定向

    Redirect [status] URL-path URL

  • status状态:

    • permanent: 返回永久重定向状态码 301
    • temp:返回临时重定向状态码302. 此为默认值
  • 示例:

    Redirect temp / https://www.kinmfer.com/

HSTS

  • HSTS:HTTP Strict Transport Security

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

  • HSTS preload list

    是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏 览器访问时,会自动转换成HTTPS。Firefox、Safari、Edge浏览器也会采用这 个列表

  • 实现HSTS示例:

    vim /etc/httpd/conf/httpd.conf

    Header always set Strict-Transport-Security “max-age=31536000” RewriteEngine on

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

正向代理和反向代理

image-20200508141517838

  • 启用反向代理

    ProxyPass “/“ “http://www.example.com/"

    ProxyPassReverse “/“ “http://www.example.com/"

  • 特定URL反向代理

    ProxyPass “/images” “http://www.example.com/"

    ProxyPassReverse “/images” http://www.example.com/

  • 示例:

    1
    2
    3
    <VirtualHost *>
    ServerName www.magedu.com ProxyPass / http://localhost:8080/ ProxyPassReverse / http://localhost:8080/
    </VirtualHost>

    Web相关工具

  • links [OPTION]… [URL]… 文本模式的WWW浏览器

    • -dump 非交互式模式,显示输出结果
    • -source 打印源码
    • -g 以图形模式运行
  • elinks 能实现一个纯文本界面的www浏览器

    • -anonymous:是否使用匿名帐号方式;
    • -auto-submit:对于偶然遇到的第一个表单是否自动提交;
    • -config-dir:指定elinks指令运行时读取和写入自身的配置和运行状态的存放目录;
    • -dump:不进入交互模式,将HTML文档以纯文本的方式打印到标准输出设备;
  • wget [OPTION]… [URL]…

    • -q 静默模式
    • -c 断点续传
    • -P /path 保存在指定目录
    • -O filename 保存为指定文件名,filename 为 – 时,发送至标准输出
    • –limit-rate= 指定传输速率,单位K,M等
  • 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…]

    • -A/–user-agent <string> 设置用户代理发送给服务器
    • -e/–referer <URL> 来源网址
    • –cacert <file> CA证书 (SSL)
    • -k/–insecure 允许忽略证书进行 SSL 连接
    • –compressed 要求返回是压缩的格式
    • -H/–header <line>自定义首部信息传递给服务器
    • -i 显示页面内容,包括报文首部信息
    • -I/–head 只显示响应报文首部信息
    • -D/–dump-header <file>将url的header信息存放在指定文件中
    • –basic 使用HTTP基本认证
    • -u/–user <user[:password]>设置服务器的用户和密码
    • -L 如果有3xx响应码,重新发请求到新位置
    • -O 使用URL中默认的文件名保存文件到本地
    • -o <file> 将网络文件保存为指定的文件中
    • –limit-rate <rate> 设置传输速度
    • -0/–http1.0 数字0,使用HTTP 1.0
    • -v/–verbose 更详细
    • -C 选项可对文件使用断点续传功能
    • -c/–cookie-jar <file name> 将url中cookie存放在指定文件中
    • -x/–proxy <proxyhost[:port]> 指定代理服务器地址
    • -X/–request <command> 向服务器发送指定请求方法
    • -U/–proxy-user user:password 代理服务器用户和密码
    • -T 选项可将指定的本地文件上传到FTP服务器上
    • –data/-d 方式指定使用POST方式传递数据
    • -b name=data 从服务器响应set-cookie得到值,返回给服务器

Httpd自带的工具程序

  • httpd自带的工具程序

    • htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具

    • apachectl:httpd 自 带 的 服 务 控 制 脚 本 , 支 持 start 和 stop

    • rotatelogs:日志滚动工具

      1
      2
      3
      access.log -->
      access.log, access.1.log -->
      access.log, acccess.1.log, access.2.log
    • apxs :由httpd自带的服务控制脚本,支持start和stop

    • suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行

  • httpd的压力测试工具

    • ab, webbench, http_load, seige
    • Jmeter 开源
    • Loadrunner 商业,有相关认证
    • tcpcopy:网易,复制生产环境中的真实请求,并将之保存
    • ab [OPTIONS] URL 来自httpd-tools包
      • -n:总请求数
      • -c:模拟的并行数
      • -k:以持久连接模式测试