Linux之http协议及apache

http协议及Apache服务

http协议

什么是http?

http全称为超文件传输协议(Hyper text transfer protocol),其是一个应用层协议,基于tcp的80端口,一般使用ASCII编码传输。http协议是无状态的(stateless),即服务器无法追踪访问者来源. 其可以使用cokie机制来追踪同一个用户.

Cookie的追踪用户的原理

第一次方访问服务时,服务器发送一个cookie的小数据(随机数,用来标识客户端身份), 客户端会将其保存下来,随后 , 访问同一个站点时,会把应用于此站点的cookie提交给服务器,从而服务器就能识别客户端身份.

  • 胖Cookie的实现原理
    将用户会话及状态信息都保存至客户端本地,在请求数据时,将状态信息回传至服务器
  • 瘦cookie + session的实现原理
    将用户的状态信息都保存至服务器端,并与相应客户端的cookie令牌相对应,请求数据的时候,只是需向告诉服务器自己的cookie信息.

什么是超文本?

使用html(Hyper text mark language)编程语言编写,被称为文本标记语言。大致格式如下:

<html>
    <head>
        <title>Title</title>
    </head>
    <body>
        <h1></h1>
        <h2></h2>
            <p>正文<a href="www.magedu.com/download.html">正文</a></p>
        <h2></h2>
    </body>
</html>

http协议版本

  • http 0.9 : 原型版本,功能简单,只添加了GET的方法
  • http 1.0 :增加cache,MIME,Method,长连接等功能
    • MIME : multipurpose internet mail extesion(多用途邮件传输扩展协议,实现文本传输能添加非文本数据等附加),其原理为,将非文件数据在传输前重新编码为文件格式再传输,接收方能够用相反的方式将其重新还原的格式,同时能够调用相应的程序打开此文件
    • 常见的method : 客户端请求数据的方法:
      • GET : 从服务器获取一个资源,通常不包含主体(entiy-body), 其为安全的方法
      • POST : 向服务器发送服务器要处理的数据,通常包含主体(entiy-body),通常向服务器发送HTML的表单数据.
      • HEAD: 只从服务器获取文档的响应首部,不包含entiy-body,其为安全的方法.
      • PUT : 将请求的主体部分直接存储在服务器上, 包含entiy-body,如果上传的文档已经存在,就用这个主体替代它.
      • DELETE : 请求删除服务器上指定URL的文档,通常服务器不会返回删除成功或是失败的消息通知.,不包含主体.
      • TRACE : 追踪请求到达服务器中间经过的代理服务器,由服务器发回一个trace响应,通常不包含主体
      • OPTIONS : 请求获得可以在服务器上执行那些方法,或者对某些特殊资源支持那些方法,通常不包含主体
    • 扩展方法:
      • lock : 允许用户锁定资源,可以在编辑某个资源的时候将其锁定,以防止别人同时对其进行修改
      • mkcol : 允许用户创建资源
      • copy : 便于在服务器上复制资源
      • move : 在服务器上移动资源
  • http 1.1 : 其增加了缓存功能,是目前被广泛使用的标准
  • http 2.0 : 借用Google开放的html协议标准spdy,改进的版本

http的工作模式

  • http请求报文(http request):格式如下:

      <method><request-URL><version> #获取方法 请求的资源 http协议版本
      <headers> #http协议首部
                #空白行
      <entity-body> #报文主体
                #空白行
    
  • http响应报文(http response)

      <version><status><reason-phrase> #http版本 状态码 
      <headers>  #响应报文首部
                  #空白行
      <entity-body>
                  #空白行
    
报文示例:
  • 请求报文
      GET / HTTP/1.1 
      Host:www.zhenping.me
      Connection:keep-aliv #连接方式为长连接
                            #空白行
    
  • 响应报文
      HTTP/1.1 200 OK
      X-powered-By:PHP/5.2.17 # 说明是一个PHP动态网页
      Vary : Accept-Encodeing,cookie,User-Agent
      Cache-Control:max-age=3,must-revalidate
      Content-Encoding:gzip :网页压缩技术
      Content-Length:6931 :网页长度
                          #空白行
    
手动模拟一个http请求会话:
telnet 172.16.36.60 80
Trying 172.16.36.60...
Connected to www.a.com.
Escape character is '^]'.
GET /index.html HTTP/1.1   #输入获取方法 请求的url 使用的协议
host:www.a.com              #指定主机
                            #两次回车
HTTP/1.1 200 OK
Date: Tue, 12 Jan 2016 04:29:18 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Mon, 11 Jan 2016 11:41:51 GMT
ETag: "e000f-13-5290d6c437a91"
Accept-Ranges: bytes
Content-Length: 19
Connection: close
Content-Type: text/html; charset=UTF-8

<h1>www.a.com</h1>
Connection closed by foreign host.          
http的状态码:
  • 1XX : 纯信息(100-101)
    • 100 : continue,说明收到了请求的初始部分,请客户端继续
    • 101 : switching protocols,说明服务器正在根据客户端的指定,将协议切换成update首部所列的协议
  • 2XX : 成功类的状态信息(200-206)
    • 200 : OK,请求没有问题,实体的主体部分包含了所请求的资源
  • 3XX : 重定向类的信息(300-305)
    • 301 : 永久重定向
    • 302 : 临时重定向
    • 304 : 内容没有发生改变,使用缓存(客户端发出了条件式请求,但服务器上的资源未发生改变,则通过)
  • 4XX : 客户端错误类的信息(400-415)
    • 400 : 用于告知客户端发送了一个错误的请求
    • 401 : unauthorized,未授权,访问前需要对用户认证
    • 403 : forbidden,请求服务器拒绝,服务器不想说明拒绝原因的时候使用
    • 404 : not found, 不存在的文件
    • 405 : Method not allowed , 发起的请求不支持的方法
  • 5XX : 服务器端错误类的信息
    • 500 : internal server error,服务器内部错误
    • 502 : bad gateway ,无法连接至其父网关
    • 504 : gateway timeout, 服务器连接超时

http报文首部

  • 通用首部
    • Date : 报文的创建时间
    • connection : 连接方式,如keepalive, close.
    • Via : 显示报文经过的中间节点(via本意为:经由)
    • Cache-control : 控制缓存
    • pragma : 跟缓存相关,为了兼容1.0版本
    • MIME-version : 给出发送端使用的MIME版本
    • trailer : 如果报文采用分块传输编码方式,就可以用这个首部列出位于报文拖挂部分
    • Transfer-Encoding : 告知接收端为了保证报文可选传输,对报文采用的编码方式
    • Update : 给出发送端可能想要"升级"使用新的版本或协议
  • 请求首部
    • accept : 通知服务器自己可接受的媒体类型
    • Accept-charset : 接收的字符集
    • Accept-Encoding : 接收内容编码格式(如压缩格式)
    • Accept-Language : 接收的语言
    • Accept-Length :实体主体数据包含了多少字节数据
    • Accept-type : 实体主体数据是什么类型
    • From : 提供了客户端用户的Email地址
    • Client-ip : 客户端IP地址
    • Host : 请求服务器名称和端口号
    • Referer : 包含了当前正在请求的资源上一级资源(由那跳转过来的)
    • User-agent:浏览器类型
      • 条件式请求首部
        • Expect : 允许客户端列出某请求所要求的服务器行为
        • If-modified-since : 请求的数据如果晚于此修改时间,服务器将发回新文件
        • If-unmodified-sinec : 除非在某个指定日期之后资源没有被修改过, 否则就限制这个请求
        • If-none-match:本地缓存中存储的文档中的ETag标签是否与服务端文档的ETag不匹配(如果提供的实体标记与当前文档的实体标记不相符,就获取文档)
        • If-Match : 如果实体标记与文档当前实体标记相匹配,就获取这份文档
        • If-range : 允许对文档的某范围进行条件请求
        • Range : 如果服务器支持范围请求,就请求资源的指定范围
      • 安全请求首部
        • authorization : 向服务器发送认证信息,如帐号密码
        • Cookie : 客户端向服务器发送cookie
        • cooki2 : cookie的版本2
      • 代理请求首部
        • proxy-authorization : 向代理服务器认证
        • proxy-connection : 与connection首部相同,但这个首部是在与代理建立连接时使用
        • max-forward : 在通往源服务器的路径上,将请求转发给其它代理网关的最大次数---与trace方法一周使用
  • 响应首部
    • 信息性
      • Age: 响应持续时长
      • Server : 服务器程序软件名称和版本
      • date : 服务器产生报文的时间
      • Content-length : 实体主体数据包含了多少字节数据
      • Content-type : 实体数据是什么类型
      • Location : 重定向的连接
      • Public : 服务器为其资源支持的请求方法列表
      • Retry-after : 如果资源不可用的话,就在此时间或日期重试
      • Title : 对HTML文档来说,就是HTML文档的源端给出标题
      • Warning : 对原因短语中更详细的一些警告报文
    • 协商首部(某资源有多种表示方法时使用)
      • Accept-Ranges : 服务器可接受的请求范围类型
      • Vary : 服务器查看的其它首部列表
    • 安全响应
      • set-cookie : 不是真正的安全首部,但隐含有安全功能,可以在客户端设置一个令牌,以便服务器对客户端进行标识
      • set-cookie2 : 与set-cookie类似
      • www-authenticate : 来自服务器对客户端的质询认证表单
      • Porxy-Authenticate : 来自代理的对客户端的质询列表
  • 实体首部
    • Allow : 列出对些实体可使用的请求方法
    • Location : 告诉客户端真正的实体位于何处,重定向时使用
  • 内容首部
    • Content-base : 解析主体中相对URL时使用的基础URL
    • Content-Encoding : 内容的编码格式
    • Content-Language : 理解主体时最适宜使用的自然语言
    • Content-length : 主体的长度或尺寸
    • Content-Location : 实体真正所处位置
    • Content-md5 : 主体的MD5校验和
    • Content-range : 在整个资源中些实体表示的字节范围
    • Content-Type : 主体的对象类型
      • 缓存相关
        • ETag : 实体的扩展标签
        • Expires : 实体的过期时间,实体不再有效,要从原始的源端再次获取此实体的日期和时间
        • Last-Modified : 最后一次修改时间和日期
  • 扩展首部

什么是keep-alive?

其被称之为长连接,由于http基于tcp协议通信,每个资源的请求都需要建立一个会话的虚拟通道,如果对于并发大的服务器来讲,高频的TCP会议建立和拆除将消耗更多的系统开销,故长连接可以实现tcp协议通信建立后,在允许的机制下,进行多个资源请求获取,当服务端设定的条件达到时,将断开与客户端的TCP连接。

keep-alive的控制机制
  • 空闲超时机制(httpd2.2版本以秒为单位,httpd2.4可以以毫秒为单位)

  • 请求次数限制

      注意:在高并发的应用场景中,空闲超时机制将会导致后面用户的请求进行挂起操作,以导致访问慢的情况。故时间需要测试而设定,并且对请求次数进行设定,这样可以避免高并发的情况中,用户的请求长时间连接,而新的用户请求一直得不到处理。 空闲超时机制在低并发的应用场景中, 可以加速用户的访问请求。
    
实现步骤

client发起请求并与server建立Tcp的连接,进行数据传输,当client的资源请求完成后,通知服务端断开连接,服务端并予ack报文,并不发送fin报文,此时连接将处理半连接状态,服务器会检查httpd的keep-alive参数设置的两个条件:1、如果半连接空闲时间超出keep-alive设定的值,将主动断开连接 ;2、当客户端请求的资源次数达到httpd的参数设置,也将会主动断开连接。

客户端浏览器加速访问的机制

  • 1、多线程请求,同时打开不同的资源
  • 2、静态内容进行缓存

web资源的类型:

  • 1、静态资源
    • 无需服务器做出额外处理,一般内容格式为:
      • jpg,png,gif,html,txt,js,css,mp3,avi等
  • 2、动态资源
    • 服务端需要通过执行程序做出处理,并发送给客户端程序的运行结果,一般格式为:
      • php,jsp

服务端完整的HTTP请求处理过程

  • 1、建立和处理连接(接收请求或拒绝请求)
  • 2、接收请求:通过网络读取HTTP请求报文
  • 3、处理请求:解析请求报文并做出相应的动作
  • 4、访问资源:访问请求报文中相应的资源
  • 5、构建响应报文:使用正确的首部生成http响应报文
  • 6、发送响应:向客户端发送生成的响应报文
  • 7、记录日志:当已经完成的http事务记录进日志文件
HTTP的访问归类:
  • 1、PV(Page view),页面的访问量,其在访问日志中的URL字段中第二个位置
  • 2、UV(User view),用户的访问量,以IP访问数量来统计,其在访问日志中的第一个字段

服务端接收请求的模型

1、单进程I/O模型

启动一个进程处理用户请求,这意味着,一次只能处理一个请求,多个请求被串形响应

2、多进程I/O模型

每个请求都有一个独立的进程来响应,并行启动多个进程,每个进程响应一个请求

3、复用的I/O模型(必须要有多路IO管理机制)
  • 1、多线程模式
    • 一个进程生成N个线程,一个线程处理一个请求,其能生成的线程也是有限定的
  • 2、事件驱动
    • 一个进程直接响应N个请求,不用启动线程
4、利用的多进程I/O结构

启动M个进程,每个进程生成N个线程

http服务的实现软件

  • 1、服务程序
    • httpd
    • nginx
    • lighttpd
    • thttpd
  • 2、应用程序服务器
    • IIS :(windwos .net)
    • tomcat :(apache,JSP,open source)
    • websphere : (IBM,JSP,commodity)
    • weblogic : (Oracle,JSP,commodity)
    • JBoos : (readhat,open source,commidity,核心是tomcat)

httpd服务程序

httpd简介

httpd是apache基金会(ASF:apache foundation)维护,其官网为httpd.apache.org,其基金会下有众多的著名软件。

http的版本
  • httpd 1.3
  • httpd 2.0
  • httpd 2.2 (Centos 6平台的默认版本,其event模型仍为测试模型)
  • httpd 2.4(Centos 7平台的默认版本,目前最新稳定版本,对event可用于生产环境中)
httpd的功能特性
  • 1、CGI(Common Gateway Interface)

  • 2、虚拟主机

    • IP
    • PORT
    • FQDN
  • 3、支持反向代理

  • 4、负载均衡

  • 5、路径别名

  • 6、丰富的用户认证机制

    • basic :基本身份认证
    • digest : 摘要身份认证
  • 7、支持第三方模块

  • 8、高度模块化

  • 9、动态模块加载(DSO,Dynamic shared object)

  • 10、多路处理模块(MPM,Multipath processing modules)

    • prefork : 多进程模型,每个进程响应一个请求,特性如下:
      • 工作模型
        • a) 有一个主进程,其负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程处理
        • b) 多个子进程,每个子进程处理一个请求,主进程不负责接收请求
        • c) 会预先生成几个空置的进程,随时等待用于响应用户请求,其预先定义最大空闲和最小空闲
    • worker : 多进程多线程模型,每个线程处理一个用户请求,特性如下:
      • 工作模型
        • a) 有一个主进程,其负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程处理
        • b) 每个子进程负责生成多个线程,每个线程负责响应用户请求
    • event : 事件驱动机制,事件驱动模型,多进程模型,每个进程响应多个请求
      • 工作模型
        • a) 有一个主进程,其负责生成子进程及回收子进程,负责创建套接字,负责接收请求,并将其派发给某子进程处理
        • b) 子进程基于事件驱动机制直接响应多个请求
  • 11、支持https协议,由mod_ssl模块提供

  • 12、支持用户认证

    • 简单认证
    • 摘要认证
    • 基于表单认证
  • 13、访问控制机制

    • 基于IP或主机名的访问控制
    • 基于每目录的访问控制

HTTPD的配置文件

1、httpd-2.2的版本(Centos 6)
  • 配置文件
    • /etc/httpd/conf/httpd.conf
    • /etc/httpd/conf.d/*.conf
  • 服务脚本
    • /etc/rc.d/init.d/httpd
  • 脚本配置文件
    • /etc/sysconfig/httpd
  • 主程序文件
    • /usr/sbin/httpd
    • /usr/sbin/httpd.event
    • /usr/sbin/httpd/worker
  • 日志文件
    • /var/log/httpd/access_log
    • /var/log/httpd/error_log
  • 站点文档
    • /var/www/html
  • 模块文件路径
    • /usr/lib64/httpd/modules
  • 网站文件存放路径
    • /var/www/html : 静态网页存放路径
    • /var/www/cgi-bin : 动态网页存放路径
  • 服务控制和启动
    • service httpd on|off
    • service {start|stop|restart|status|configtest|reload} httpd
2、httpd-2.4的版本(Centos 7)
  • 配置文件
    • /etc/httpd/conf/httpd.conf
    • /etc/httpd/conf.d/*.conf
    • /etc/httpd/conf.modules.d/*.conf : 模块相关的配置文件
    • /usr/lib/systemd/system/httpd.service
  • 主程序文件
    • /usr/sbin/httpd : 2.4版本支持MPM的动态切换
  • 日志文件
    • /var/log/httpd/access_log
    • /var/log/httpd/error_log
  • 站点文档
    • /var/www/html
  • 模块文件路径
    • /usr/lib64/httpd/modules
  • 网站文件存放路径
    • /var/www/html : 静态网页存放路径
    • /var/www/cgi-bin : 动态网页存放路径
  • 服务控制
    • systemctl enable | disable httpd.service
    • systemctl {start|stop|restart|status} httpd.service

HTTPD的进程

1、主进程的属主和属组

root:root

2、子进程或工作进程

apache:apache

HTTPD主配置文件

主配置文件的选项
  • 1、全局配置段:影响apache的全局配置选项
  • 2、中心主机配置段
  • 3、虚拟主机配置段
主配置文件的格式
  • 指令 + 值
    • 指令:不区分大小写
    • 值:在为路径时,是否区分大小写,取决于文件系统
常用配置选项
  • 1、修改监听的IP和PORT

    • 格式:Listen [IP:] PORT
      • a) 省略IP表示0.0.0.0

      • b) Listen指令可复现出现多次

          Listen 80
          Listen 8080
          Listen 172.16.0.1:80
        
      • c) 修改监听的socket,中有重启服务进程方可有效

  • 2、持久连接功能

    • TCP连接建立后,每个资源获取完成后,不会断开连接,而是继续等待其它资源请求的进行,如何断开 ?
      • a) 数量限制

      • b) 时间限制

          KeepAlive on | off
          KeepAlive Timeout 15
          MaxKeepAliveRequests 100
          
          
          注意:副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应。折衷处理:使用较短的持久连接时长,以及较少的请求数量
        
  • 3、MPM
    修改2.2版本中的MPM机制,需要修改/etc/sysconfig/httpd中,启用HTTPD=/usr/sbin/httpd.worker或者指定其它的MPM模块,需要重启服务方可生效。

    • prefork的配置

        <IfModule prefork.c>   
        StartServers        8  #启动时启动多少个进程
        MinSpareServer      5   #最少空闲进程
        MaxSpareServers   20    #最大空闲进程
        ServerLimit      256    #最大启动多少个进程数,可大于maxclients
        MaxClients       256    #最大进程在线数量,不能大于serverlimit
        MaxRequestsPerChild  4000 #表示每个进程最多处理多少个请求,达到数量时由主进程销毁
        </IfModule>
      
    • worker的配置

        <IfModule worker.c>
        StartServers         4
        MaxClients         300
        MinSpareThreads     25
        MaxSpareThreads     75
        ThreadsPerChild     25
        MaxRequestsPerChild  0  #0表示不启用
        </IfModule>
      
  • 4、配置指定实现模块加载

    • 1、定义格式

        LoadModule <mod_name> <mode_path>
      
    • 2、使用相对路径,是相对于serverroot,默认为/etc/httpd

  • 5、定义中心主机"Main server"的文档页面路径

    • 1、定义格式

        DocumentRoot "/var/www/html"
      
    • 2、文档路径映射

      • DocumentRoot指向的路径为URL路径的起始位置,相当于站点URL的根路径
  • 6、站点访问控制定义方法

    • 1、基于文件系统路径

        方法一:
        <Directory "/PATH">
        ......
        </Directory>
        
        方法二
        <File "/PATH">
        ......
        </File>
        
        方法二
        <FileMatch "PATTERN">
        .....
        </FileMatch>   #以模式匹配,需要启动正则表达式引擎,其效率低
      
    • 2、基于URL

        方法一:
        <Location "/">
        ......
        </Location>
        
        方法二:
        <LocationMatch "/">
        ......
        </LocationMatch>
      
  • 7、站点访问控制设定

    • 1、基于IP方式实现控制

        <Location /server-status>
        SetHandler server-status
        order deny,allow   #定义生效次序
        deny from all
        allow from 172.16.249.148
        </Location>
        
        ##注意:
        来源地址定义格式,可如下方式:
        172.16
        172.16.0.0
        172.16.0.0/16
        172.16.0.0/255.255.255.0
      
    • 2、基于用户名和密码方式实现控制

        <Directory "/www/b.com/htdocs">
            Options None            #可以定义多个,使用空格分开,None表示不定义
            AllowOverride None   #是否允许覆盖,覆盖面面order或者auth的认证,None表示不定义
            AuthType Basic      #认证类型
            AuthName "Please Enter your username and password."    #认证提示
            AuthUserFile "/etc/httpd/conf/.htpass"            #用户和密码存放路径
            AuthGroupFile "/etc/httpd/conf/.htpass_group"     #用户组的定义存放路径
            Require group mygrp     #允许mygrp组中的用户
                或者只是定义用户,不定义组
            AuthType Basic      #认证类型
            AuthName "Please Enter your username and password."    #认证提示
            AuthUserFile "/etc/httpd/conf/.htpass"            #用户和密码存放路径
            Require user zhenping    #只允许用户zhenping登录,多个用户可以使用空格隔开
        </Directory>
        
        注意1:如果需要定义的所有用户都可以访问,需使用:
            Require valid-user
        
        注意2:认证方式有两种:
                basic :明文
                digest : 消息摘要认证
        注意3:用户及密码的存储方式
                文本文件
                SQL数据库
                Ldap目录服务
        注意4:组文件定义格式
                GROUP_NAME: group1 group2
                
        注意4:用户名的密码需要使用htpasswd工具来创建,如下格式:
            
            htpasswd -c -m /etc/httpd/conf/.htpasswd tom
                Options:
                        -c : 自动创建加密文件,一般用于第一次
                        -D : 删除用户
                        -m : 以MD5格式加密
                        -s : 以sha格式加密
      
      • Options的各参数说明:

          Index:定义索引,索引是指列出目录下所有的文件
          None:不支持任何选项
          FollowSymLinks:跟随符号连接,意味访问符号连接所指向的文件,会降低服务器的性能
          Includes:允许执行服务器端包含(SSI),此方式不安全
          SymLinksifOwnerMatch:允许执行符号连接,但属主必须与执行httpd进程的属主相匹配,不                               开放
          ExecCGI:允许执行CGI脚本
          MultiViews:判断客户端使用的语言,并显示相应语言的网页,一般比较消耗资源
          ALL:启用所有选项
        
  • 8、定义站点主页

    • 1、定义格式

        DocumentRoot "/www/htdocs"
      
    • 2、未定义的错误提示

      • 404 Not Found错误
      • 显示目录下的所有文件
  • 9、定义路径别名

    • 1、定义格式
      • alias /URL/ "/PATH"

          alias /download/ "/rpms/pub"  #后者为文件系统路径
        
  • 10、定义默认字符集

    • 1、定义格式

        AddDefaultCharset UTF8
        
        可支持的中文字符集:GBK,GB2312,GB18030
      
  • 11、日志设定

    • 1、错误日志的定义格式

        ErroLog logs/error_log
        LogLevel warn
        
        ##日志等级为:
        Debug
        Info
        notice
        Warn
        Error
        Crit
        Alert
        Emerg
      
    • 2、访问日志的定义格式

        CustomLog logs/access_log combined #combined为日志格式
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined 
        LogFormat "%h %l %u %t \"%r\" %>s %b" common 
        LogFormat "%{Referer}i -> %U" referer 
        LogFormat "%{User-agent}i" agent
        
        
        #其宏定义的格式:
        %h :客户端的IP地址
        %l :远程登陆的用户名,通常为一个减号“-”
        %u :远程登陆的用户(from auth),非登陆访问时,其为一个减号
        %t :服务器收到请求的时间,standerd english time
        %r :First line of request,表示请求报文的首先,记录了此次请求的:方法,URL,协议版本
        %>s :响应的状态码
        %b :响应报文的大小,单位字节,不包含http请求首部
        %{Referer}i : 请求报文中首部"referer"的值,即从那个页面中的超连接跳转至当前页面
        %{User-Agent}i : 请求报文中首部"User-Agent"的值,即发出请求的应用程序,浏览器类型
      
  • 12、虚拟主机(如果需要虚拟主机的方式,需先注释中心主机的DocumentRoot)

    • 1、实现方式
      • 基于IP

          <VirtualHost 192.168.0.1:80>
          ......
          </VirtualHost>
          
          <VirtualHost 192.168.0.2:80>
          ......
          </VirtualHost>
        
      • 基于PORT

          <VirtualHost 192.168.0.1:80>
          ......
          </VirtualHost>
          
          <VirtualHost 192.168.0.1:8080
          ......
          </VirtualHost>
        
      • 基于FQDN

          <VirtualHost 192.168.0.1:80>
          servername www.a.com
          ......
          </VirtualHost>
          
          <VirtualHost 192.168.0.1:80>
          servername www.b.com
          .....
          </VirtualHost>
          
          注意:如果需要在2.2版本及以下,需要使用NameVirtualHost IP:PORT来先定义,2.4以后版本不需要
        
  • 13、status页面
    1、启用

      加载对应的模块
      LoadModules status_module modules/mod_status.so
      
      启用server-status容器选项
      <Location /server-status>
      SetHandler server-status
      Order deny,allow
      Deny from all
      Allow from .example.com  
      </Location> 
      
      访问
      www.a.com/server-status
    
  • 14、域名别名

    • 1、定义格式

        serveralias www.b.com www.a.com  #将www.b.com定义为www.a.com
      
httpd的子命令
  • httpd -l : 查看httpd所支持的MPM类型
  • httpd -t : 测试主配置文件是否有语法错误
  • httpd -M : 查看http的加载模块
    ========
15 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,socket5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大.

  • 用法:
    • curl [options] [URL....]
  • 常用选项
    • -A / --user-agent <string> : 设置用户代理发送给服务器
    • --base : 使用http基本认证
    • --tcp-nodelay : 使用tcp_nodelay选项
    • -e / --referer <URL>: 来源网址
    • --cacert <file> : CA证书(SSL)
    • --compressed : 要求返回是压缩的格式
    • -H / --header <line> : 自定义首部信息传递给服务器
    • -I / --head : 只显示响应报文首部信息
    • --limit-rate <rate> : 设置传输速度
    • -u / --user <user[:password]> : 设置服务器的用户和密码
    • -0 / --http1.0 : 使用HTTP1.0
16 apache的用户及组

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

  • user apache
  • group apache
如果需要使用root权限执行操作时,需要使用SUexec命令调用相关操作
17 使用mod_deflate模块压缩页面优化传输速度
  • 适用场景
      1. 节约带宽,额外消耗CPU,同时可能有些老浏览器不支持
      1. 压缩适于压缩的资源,例如文本文件
####设置一个过滤器,名称为DEFLATE ,名称用于后面设置参数引用 
SetOutputFilter DEFLATE 
# mod_deflate configuration
####设置指定那些类型需要压缩
# Restrict compression to these MIME types
AddOutputFilterByType DEFLATE text/plain 
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE text/css
####设置压缩级别
# Level of compression (Highest 9 - Lowest 1)
DeflateCompressionLevel 9
####排除老的浏览器
# Netscape 4.x has some problems.
BrowserMatch ^Mozilla/4  gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch  ^Mozilla/4\.0[678]  no-gzip
# MSIE masquerades as Netscape, but it is fine
BrowserMatch \bMSI[E]  !no-gzip !gzip-only-text/html
18 配置https
  • 配置https的注意事宜

    • yum安装httpd服务情况:
    需要安装mod_ssl模块,其安装后会在/etc/httpd/conf.d/目录下生成ssl.conf文件,需要其配置文件中加载相应的模块文件及配置
    
    • 编译安装httpd服务的情况:
    要编译的时候可以使用 --enable-ssl选项启用ssl功能,只需要在httpd的配置文件中, 加载相应的ssl模块及配置相关ssl参数
    
  • SSL会议的简化过程

    • 客户端发送可供选择的加密方式,并向服务器请求证书
    • 服务器端发送证书以及选定的加密方式给客户端
    • 客户端取得证书并先进行证书验证
      • 验证证书的合法性,用CA的公钥解密证书上数字签名
      • 验证证书的内容合法性:完整性验证
      • 检查证书的有效期限
      • 检查证书是否被吊销
      • 证书中拥有者的名字,与访问的目标主机是否一致
    • 客户端生成临时会议密码(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
    • 服务器用此密码加密用户请求的资源,响应给客户端
  • https配置实例
yum install httpd -y

CA
cd /etc/pki/CA/
[root@Centos7 CA]# ls
certs  crl  newcerts  private
[root@Centos7 CA]# cd private/
[root@Centos7 private]# (umask 077; openssl genrsa -out cakey.pem 2048)
Generating RSA private key, 2048 bit long modulus
.........................................+++
........................+++
e is 65537 (0x10001)
[root@Centos7 private]#

[root@Centos7 CA]# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Mageedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:ca.mageedu.com
Email Address []:admin@mageedu.com
[root@Centos7 CA]# ls
cacert.pem  certs  crl  newcerts  private

[root@Centos7 CA]# touch index.txt serial
[root@Centos7 CA]# echo 01 > serial
[root@Centos7 CA]# ls
cacert.pem  certs  crl  index.txt  newcerts  private  serial


http server
root@Centos7 ~]# cd /etc/httpd/
[root@Centos7 httpd]# ls
conf  conf.d  conf.modules.d  logs  modules  run
[root@Centos7 httpd]# mkdir ssl

root@Centos7 ssl]# (umask 077;openssl genrsa -out httpd.key 2048)
Generating RSA private key, 2048 bit long modulus
...+++
.................................................................................+++
e is 65537 (0x10001)

[root@Centos7 ssl]# openssl req -new -key httpd.key -out httpd.csr -days 365
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:CN
Locality Name (eg, city) [Default City]:Beijing
Organization Name (eg, company) [Default Company Ltd]:Mageedu
Organizational Unit Name (eg, section) []:Ops
Common Name (eg, your name or your server's hostname) []:www.zhenping.com
Email Address []:admin@zhenping.com

[root@Centos7 ssl]# scp httpd.csr root@172.16.36.71:/tmp


CA Server
[root@Centos7 CA]# openssl ca -in /tmp/httpd.csr -out certs/httpd.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 1 (0x1)
        Validity
            Not Before: Jan 17 23:42:58 2016 GMT
            Not After : Jan 16 23:42:58 2017 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = CN
            organizationName          = Mageedu
            organizationalUnitName    = Ops
            commonName                = www.zhenping.com
            emailAddress              = admin@zhenping.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                61:7F:29:8A:68:A6:70:C2:F2:0E:49:15:D7:DD:4D:02:BF:EF:92:6A
            X509v3 Authority Key Identifier:
                keyid:18:F8:A6:71:FB:05:F3:0C:D3:56:9C:90:78:F1:4D:B5:0E:EC:51:5F

Certificate is to be certified until Jan 16 23:42:58 2017 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

[root@Centos7 CA]# scp certs/httpd.crt root@172.16.36.70:/etc/httpd/ssl
The authenticity of host '172.16.36.70 (172.16.36.70)' can't be established.
ECDSA key fingerprint is f7:6e:2f:38:57:8e:8c:0b:12:74:cc:af:44:82:88:17.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.16.36.70' (ECDSA) to the list of known hosts.
root@172.16.36.70's password:
httpd.crt                                                                                                                                       100% 4606     4.5KB/s   00:00


httpd server

vim /etc/httpd/conf.d/ssl.conf
DocumentRoot "/var/www/html"
ServerName www.zhenping.com
SSLCertificateFile /etc/httpd/ssl/httpd.crt
SSLCertificateKeyFile /etc/httpd/ssl/httpd.key
http的配置实例:
root@Centos6-ser1 ~]# cat /etc/httpd/conf.d/vhost.conf
    LoadModule status_module modules/mod_status.so
    <Location /server-status>
        SetHandler server-status
        order deny,allow
        deny from all
        allow from 172.16.249.148
    </Location>

    namevirtualhost 172.16.36.60:80
    <VirtualHost 172.16.36.60:80>
        servername wwww.a.com
        Documentroot "/www/a.com/htdocs/"
        alias /download "/www/a.com/htdocs/file"
        Errorlog /www/log/a.com/error.log
        LogLevel warn
        Customlog /www/log/a.com/access.log combined
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        <Directory "/www/a.com/htdocs/file/">
            Options Indexes
            AllowOverride None
            AuthType Basic
            AuthName "Please enter you username and password...."
            AuthUserFile "/etc/httpd/conf/.htpass"
            Require user zhenping
        </Directory>
    </virtualhost>

    <virtualhost 172.16.36.60:80>
        servername www.b.com
        documentroot "/www/b.com/htdocs"
        Errorlog /www/log/b.com/error.log
        LogLevel warn
        Customlog /www/log/b.com/access.log combined
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        <Directory "/www/b.com/htdocs">
            Options None
            AllowOverride None
            AuthType Basic
            AuthName "Please Enter your username and password."
            AuthUserFile "/etc/httpd/conf/.htpass"
            AuthGroupFile "/etc/httpd/conf/.htpass_group"
            Require group mygrp
        </Directory>
    </virtualhost>

    <virtualhost 172.16.36.60:80>
        servername www.c.com
        documentroot "/www/c.com/htdocs"
        ErrorLog /www/log/c.com/error.log
        LogLevel warn
        CustomLog /www/log/c.com/access.log combined
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        <Directory "/www/c.com/htdocs">
            Options None
            AllowOverride None
            order deny,allow
            deny from all
            allow from 172.16.249.148
        </Directory>
    </virtualhost>

推荐阅读更多精彩内容