HTTP服务和APACHE

HTTP服务和APACHE

1. 跨Internet的主机间通信

要经过Internet进行通讯,至少须要一对套接字;其中一个运行在客户端,定义了一个惟一的客户进程,称之为ClientSocket,另外一个运行于服务器端面,定义了一个惟一的服务器进程,称为ServerSocket。根据链接启动的方式以及本地要链接的目标,套接字之间的链接过程能够分为三个步骤:服务器监听、客户端请求、链接确认javascript

  • Socket套接字php

    1. 套接(Socket)字做用
      进程间通讯(IPC)的一种实现,容许位于不一样主机(或同一主机)上不一样进程之间进行通讯和数据交换css

      进程间通讯(IPC,Inter-Process Communication)指至少两个进程或线程间传送数据或信号的一些技术或方法html

    2. Socket组成
      IP地址和端口号,合称为套接字地址(socket address)java

    3. 开发程序时如何实现Socket通信
      调用Socket API(封装了内核中所提供的socket通讯相关的系统调用),须要指定两项内容linux

      1. Socket Domain:根据其所使用的地址
        1. AF_INET:Address Family,IPv4 <==经常使用
        2. AF_INET6:IPv6
        3. AF_UNIX:UNIX文件,同一主机上不一样进程之间通讯时使用,不须要封装解封装,经过此文件通信
      2. Socket Type:根据使用的传输层协议
        1. SOCK_STREAM:流,tcp套接字,可靠地传递、面向链接 <==经常使用
        2. SOCK_DGRAM:数据报,udp套接字,不可靠地传递、无链接
        3. SOCK_RAW:裸套接字,无须tcp或udp,APP直接经过IP包通讯

          #API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工做机制的细节nginx

    4. 应用程序通信过程
      开发一个能够和网络通信的应用程序,客户端和服务端相互通信,须要调用Socket相关的一些函数
      在这里插入图片描述web

    5. 通信过程正则表达式

      1. 服务器端先建立一个ServerSocket,绑定用到的协议,ip地址,端口(低于1023的端口只有管理员可用)
      2. 绑定成功后服务器端不定位具体的客户端套接字,而是处于等待链接的状态,实时监控网络状态(监听)
      3. 在客户端,须要链接服务器也须要建立Socket(ClientSocket不须要绑定地址和端口),须要指出服务器端套接字的地址和端口号,建立成功后发起链接请求
      4. 服务器监听到请求,建立新的套接字描述符,用accept函数接收请求
      5. 链接成功后,即可以相互发送数据
    6. 套接字相关的系统调用:shell

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

2 HTTP服务基础理论

  • HTTP相关术语

    1. http(Hyper Text Transfer Protocol, 80/tcp)
      超文本的传输协议

      超文本是由信息结点和表示信息结点间相关性的链构成的一个具备必定逻辑结构和语义的网络,可使单一的信息之间相互交叉“引用”

    2. html(Hyper Text Markup Language )
      http协议传输使用的文件大部分为html(也能够封装传输其余类型文件),使用超文本标记语言,编程语言编写,
      示例:超文本标记语言
           
           
           
           
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      <html> <head> <title>html语言 </title> </head> <body> <img src="http://www.alidns.com/static/img/logo.png" > <h1>标题1</h1> <p><a href=http://www.alidns.com/>linux</a>welcome</p> </body> </html>
      超文本(index.html)显示效果
      在这里插入图片描述
      普通文本显示效果
      在这里插入图片描述
    3. CSS (Cascading Style Sheet )
      层叠样式表:控制网页样式并容许将样式信息与网页内容分离的一种标记性语言,至关于定义一个标准,能够应用于其余页面,不须要每一个页面重复编制
    4. js javascript(与java没有关系)
      JavaScript:一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型,在网页上使用时,用来给HTML网页增长动态功能。
    5. MIME(Multipurpose Internet Mail Extensions)
      多用途互联网邮件扩展 :服务器将MIME标志符放入传送的数据中来告诉浏览器使用哪一种插件读取相关文件
      MIME支持传输的类别:/etc/mime.types
      参考站点:http://www.w3school.com.cn/media/media_mimeref.asp
  • HTTP协议历史
    HTTP 协议不带有状态(记不住访问者是谁),每次请求都必须附上全部信息。请求的不少字段都是重复的,浪费带宽,影响速度

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

    2. http/1.0:1996年5月

      1. 支持缓存(cache)

      2. 开始执行MIME,

      3. 引入更多method

        1. GET
          请求服务器发送某个资源
        2. POST
          起初是用来向服务器写入数据的;实际上,一般会用它来支持HTML的表单。表单中填好的数据一般会被发送给服务器,而后服务器将其发送到他要去的地方
        3. HEAD
          请求服务器发送某个资源,服务器在响应中只返回首部,不会反回实体的主体部分
      4. 头信息是 ASCII 码,后面数据可为任何格式,服务器回应时会告诉客户端,数据是什么格式,即Content-Type字段的做用。

      5. 缺点
        每一个TCP链接只能发送一个请求,发送数据完毕,链接就关闭,若是还要请求其余资源,就必须再新建一个链接

    3. http/1.1:1997年1月

      1. 引入了持久链接(persistent connection),
        即TCP链接默认不关闭,能够被多个请求复用,不用声明Connection: keep-alive。对于同一个域名,大多数浏览器容许同时创建6个持久链接
      2. 引入了管道机制(pipelining),
        即在同一个TCP链接里,客户端能够同时发送多个请求,进一步改进了HTTP协议的效率
      3. 新增方法(method)
        1. PUT
          从客户端发送数据取代指定的文档内容
        2. TRACE
          用于诊断请求报文在发送给最终目标服务器时,中间HTTP程序组是否以及如何被损坏或者修改过
        3. OPTIONS
          能够询问服务器一般支持哪些方法,或者对某些特殊资源支持哪些方法
        4. DELETE
          请服务器删除请求URL所指定的资源
      4. 缺点
        同一个TCP链接里,全部的数据通讯是按次序进行的。服务器只能顺序处理回应,前面的回应慢,会有许多请求排队,形成"队头堵塞"(Head-of-line blocking)
        为避免上述问题,两种方法
        1. 减小请求数
        2. 同时多开持久链接
          网页优化技巧,如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等
    4. Spdy:2009年
      谷歌研发,解决 HTTP/1.1 效率不高问题

    5. http/2.0:2015年

      1. 头信息和数据体都是二进制,称为头信息帧和数据帧
      2. 复用TCP链接
        在一个链接里,客户端和浏览器均可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通讯称为多工(Multiplexing)
      3. 引入头信息压缩机制(header compression),
        头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,全部字段都会存入这个表,生成一个索引号,不发送一样字段,只发送索引号,提升速度
      4. 服务器推送(server push)
        HTTP/2 容许服务器未经请求,主动向客户端发送资源
        HTTP工做机制
  • 工做机制
    一次HTTP操做称为一个事务,其工做过程可分为四步

    1. 首先客户机与服务器须要创建链接
    2. 客户机发送一个请求给服务器(http request)
      请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容
    3. 服务器响应请求(http response)
      服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容
    4. 断开链接
      客户端接收服务器所返回的信息经过浏览器显示在用户的显示屏上,而后客户机与服务器断开链接
  • Web资源:web resource
    一个网页由多个资源构成,打开一个页面,会有多个资源展现出来,可是每一个资源都要单独请求。所以,一个“Web 页面”一般并非单个资源,而是一组资源的集合

    1. 静态文件:无需服务端作出额外处理
      文件后缀:.jpg, .html, .txt, .js, .css, .mp3, .avi
    2. 动态文件:服务端执行程序,返回执行的结果
      文件后缀:.asp, .php, .jsp
  • HTTP链接方式

    1. 串行链接
      访问网站时,页面文件可能包含诸多资源,须要将资源从服务器上下载下来,串行链接方式为,每一个资源都要通过链接请求(三次握手),下载完成后才能开始下一个链接请求,再次(三次握手)
    2. 并行链接
      同时发起屡次请求,服务器端口是固定不变的,客户端要同时打开多个端口分别发起链接请求,服务器同时回应
    3. 持久链接(keep-alive)
      也叫长链接,重用TCP链接,以消除链接和关闭的时延,以事务个数和时间来决定是否关闭链接;只创建一次链接请求(三次握手),获得第一个资源后,TCP链接不会断开,能够继续发送获取数据请求而不须要通过三次握手,直到将全部资源下载下来,属因而串行传输
    4. 管道化持久链接
      经过共享TCP链接发起并发的HTTP请求
      在持久链接的基础上,在第一条请求发出后,不须要等待服务器回应,能够继续发送第二条请求、第三条请求,使多条请求处于列队状态,
  • URI(Uniform Resource Identifier)
    统一资源标识,分为URL和URN,URN使用的较少,因此不少时候说URI就是在说URL

    1. URN(Uniform Resource Naming)
      统一资源命名,典型的就是P2P下载使用的磁力连接,将需求资源标识为名字,而不是指向一个地址,经过搜索资源名,在互联网上找那些主机上有此资源,而后发起并行链接,链接到全部有资源的主机上,进行下载
    2. URL(Uniform Resorce Locator)
      1. 概念
        统一资源定位符,用于描述某服务器某特定资源位置
      2. URL组成
               
               
               
               
        • 1
        <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
        1. schame
          方案,访问服务器以获取资源时要使用哪一种协议(例如http、ftp、rtsp等)
        2. user
          用户,某些方案访问资源时须要的用户名
        3. password
          密码,用户对应的密码,中间用:分隔
        4. Host
          主机,资源宿主服务器的主机名或IP地址或FQDN
        5. port
          端口,资源宿主服务器正在监听的端口号,不少方案有默认端口号
        6. path
          路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔,称为短URL
        7. params
          参数,指定输入的参数,参数为名/值对,多个参数,用[ ; ]分隔
        8. query
          查询,传递参数给程序,如数据库,用[?]分隔,多个查询用[ & ]分隔
        9. frag
          片断,一小片或一部分资源的名字,此组件在客户端使用,用[ # ]分隔
      3. 示例
        query查询
               
               
               
               
        • 1
        https://list.jd.com/list.html?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1
        片断
        http://apache.org/index.html#projects-list
    3. 二者区别
      URN如同一我的的名称,而URL表明一我的的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址
  • 网站访问量

    1. IP(独立IP)
      即Internet Protocol,指独立IP数。一天内来自相同客户机IP地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
    2. PV(访问量)
      即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并非页面的来访者数量,而是网站被访问的页面数量
    3. UV(独立访客)
      即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。能够理解成访问某网站的电脑的数量。网站判断来访电脑的身份是经过来访电脑的cookies实现的。若是更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
      网站统计:http://www.alexa.cn/rank/
    4. QPS(request per second,每秒请求数)
      QPS= PV* 页面衍生链接次数/ 统计时间(86400)
      页面衍生链接数:一个页面的资源数
    5. 并发链接数
      并发链接数 =QPS * http平均响应时间
    6. 峰值时间
      天天80%的访问集中在20%的时间里,这20%时间为峰值时间
      峰值时间每秒请求数(QPS)=( 总PV数 *页⾯衍⽣链接次数)*80% ) / ( 天天秒数 * 20% )
    7. 网站访问统计示例
      甲乙丙三人在同一台经过ADSL上网的电脑上(中间没有断网),分别访问www.magedu.com网站,而且每人各浏览了2个页面,那么网站的流量统计是:
      IP: 1 PV:6 UV:1
      若三人都是ADSL从新拨号后,各浏览了2个页面,则
      IP: 3 PV:6 UV:1

3. Web服务请求处理步骤

  • 处理步骤
    在这里插入图片描述

    1. DNS解析
      1. 客户端发出访问www.taobao.com请求,先从本地host文件解析,不能解析,交给本机DNS缓存
      2. 本机没有解析记录的话,发送给本地解析服务器,本地DNS服务器查询缓存,是否有记录能够回应
      3. 本地DNS服务器缓存没有记录,发往DNS根服务器开始寻址,根服务器返回一级域名.com
      4. 本地DNS服务器拿到一级域名后,访问一级域DNS服务器,返回二级域名taobao.com
      5. 本地DNS服务器访问二级域名,获得IP地址www.taobao.com,本地DNS服务器将全称域名缓存至本地,而后发送给客户
    2. 创建链接
      1. 用户向淘宝发送一个数据包SYN=1,seq=x
      2. 若是淘宝能够收到,则发送SYN=1,ACK=1,seq=y,ack=x+1
      3. 客户收到淘宝的回应包,再发送ACK=1,seq=x+1,ack=y+1,淘宝收到后,则创建成功
    3. web服务请求回应
      1. 创建链接
        客服向服务器发起请求,此请求包括一些数据报文的头部,包括(method:GET、POST/PUT/HEAD/DELECT等)

      2. 接收请求(可能会拒绝)
        接收客户端请求报文中对某资源的一次请求的过程

      3. 处理请求
        服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理

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

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

      6. 发送响应报文
        Web服务器经过链接发送数据时也会面临与接收数据同样的问题。服务器可能有不少条到各个客户端的链接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录链接的状态,还要特别注意对持久链接的处理。对非持久链接而言,服务器应该在发送了整条报文以后,关闭本身这一端的链接。对持久链接来讲,链接可能仍保持打开状态,在这种状况下,服务器要正确地计算Content-Length首部,否则客户端就没法知道响应何时结束了

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

  • 元数据:请求报文首部

       
       
       
       
    • 1
    • 2
    • 3
    • 4
    1. 请求行: <method> <URL> <VERSION> 示例:GET /search?hl=zh-CN&source=hp HTTP/1.1 2. 请求头部: name:value Host: <a>www.baidu.cn</a> 3. 空行: 4. 请求数据: <request body>
  • Web访问响应模型(Web I/O)

    1. 单进程I/O模型
      启动一个进程处理用户请求,并且一次只处理一个,多个请求被串行响应
    2. 多进程I/O模型
      并行启动多个进程,每一个进程响应一个链接请求
    3. 复用I/O结构
      启动一个进程,同时响应N个链接请求
      实现方法:多线程模型和事件驱动
      多线程模型:一个进程生成N个线程,每线程响应一个链接请求
      事件驱动:一个进程处理N个请求
    4. 复用的多进程I/O模型
      启动M个进程,每一个进程响应N个链接请求,同时接收M*N个请求
  • http请求报文
    在这里插入图片描述

  • http回应报文
    在这里插入图片描述

4. HTTP服务器应用

4.1 http简介

  • http服务器程序

    1. apche
    2. nginx
    3. lighttpd
  • 应用程序服务器
    提供http服务的应用,能够提供动态程序

    1. IIS :微软出品,支持.asp
    2. tomcat:支持 .jsp
    3. jetty:开源的servlet容器,基于Java的web容器
    4. Resin:CAUCHO公司,支持servlets和jsp的引擎
    5. webshpere(IBM), weblogic(BEA), jboss,oc4j(Oracle)
  • 市场统计
    www.netcraft.com

  • 特性
    高度模块化:core(核心模块) + modules(辅助模块)
    模块管理方式:

    1. DSO: Dynamic Shared Object
      动态加/卸载
    2. MPM:multi-processing module
      多路处理模块,多种工做模式
  • MPM工做模式

    1. prefork:多进程I/O模型,每一个进程响应一个请求,默认模型
      1. 工做原理
        主进程生成和回收n个子进程,建立套接字,不响应请求;生成多个工做子进程,每一个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求,最大不超过1024个
      2. 限制
        基于linux的管理,程序开启子进程数不能过多,在prefrok模型下,一般会有C10k(并发链接数达到1万)限制,Apache响应速度会受到很大的影响,解决c10k限制目前是应用nginx
    2. worker:复用的多进程I/O模型,多进程多线程,IIS使用此模型
      1. 工做原理
        主进程生成m个子进程,每一个子进程生成n个线程,每一个线程响应一个请求,并发响应请求m*n,占用资源少
      2. 缺点
        线程之间会互相影响,没有prefork模式稳定
    3. event:事件驱动模型(worker模型的变种)
      主进程生成m个子进程,每一个进程直接响应n个请求,并发响应请求m*n个,有专门的线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又容许释放。这样加强了高并发场景下的请求处理能力
  • httpd功能特性

    1. 虚拟主机
      在一个物理服务器上搭建多个网站
    2. CGI(Common Gateway Interface):通用网关接口
      实现动态程序,须要额外做开发
    3. 反向代理
      (通常不使用Apache充当反向代理,使用nginx或haproxy较多)
      接受internet上的链接请求,而后将请求转发给内部网络上的服务器,并将服务器上的到的结果返回给internet上请求链接的客户端

      正向代理
      一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),而后代理向原始服务器转交请求并将得到的内容返回给客户端;使用缓存特性,能够减小局域网客户端带宽使用率;帮助客户端访问远程服务器

    4. 负载均衡
    5. 路径别名
    6. 丰富的用户认证机制
      basic,digest
    7. 支持第三方模块

4.2 httpd(Apache)安装

  • 版本:
    CentOS 6: 2.2
    CentOS 7: 2.4

  • 安装方式:

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

           
           
           
           
      • 1
      [root@hai7-6 ~]$yum install httpd
    2. 编译:定制或特殊需求

  • 相关文件

    1. 配置文件
      1. 主配置文件
        /etc/httpd/conf/httpd.conf
      2. 子配置文件,下降复杂性,分开存放的配置文件
        /etc/httpd/conf.d/*.conf
    2. 服务文件
      /usr/lib/systemd/system/httpd.service
    3. 主程序
      1. CentOS7中,不一样的工做模型由模块方式提供,只有一个主程序
        /usr/lib64/httpd
      2. CentOS 6中,三个程序分别对应三种工做模型
        1. prefork默认模式
          /usr/sbin/httpd
        2. event模式
          /usr/sbin/httpd.event
        3. worker模式
          /usr/sbin/httpd.worker
  • 默认http网页数据存放路径
    /var/www/html

  • 日志存放路径
    软链接:/etc/httpd/logs
    真实路径:/var/log/httpd

    文件属主为root,Apache运行时会开启子进程,是能够写入的

  • 主进程编号文件存放目录
    /etc/httpd/run/httpd.pid

  • 帮助文档包
    httpd-manual

       
       
       
       
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. '安装文档包' [root@hai7-6 html]$yum install httpd-manual 2. '从新加载httpd服务' [root@hai7-6 html]$systemctl reload httpd 3. '在浏览器中访问,192.168.50.107为本机的ip' http://192.168.50.107/manual/
  • 检查配置语法:

    1. httpd –t
    2. service httpd configtest
    3. 示例:语法检查时出现00558报错解决方案
           
           
           
           
      • 1
      • 2
      [root@hai7-6 conf]$httpd -t AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe81:ee10. Set the 'ServerName' directive globally to suppress this message
      会出现AH00558这个提示,是由于没有配置ServerName,能够在配置文件中修改,此名字只有本地意义,须要配置DNS才能够经过网络解析
           
           
           
           
      • 1
      • 2
      • 3
      [root@hai7-6 conf]$vim httpd.conf #ServerName www.example.com:80 <==找到ServerName行,去掉注释,或者新建一行都行 erverName www.moli.com:80

4.3 httpd配置文件格式

  • httpd配置文件的组成

    1. httpd2.2中配置文件的组成:分为三大块
      1. 全局配置
        ### Section 1: Global Environment
      2. 主服务器配置
        ### Section 2: 'Main' server configuration
      3. 虚拟主机配置
        ### Section 3: Virtual Hosts
    2. httpd2.4版本中取消了分块,各类配置仍然支持
  • 配置格式

    1. 格式(相似于键值对)
      directive value
    2. 字符书写要求
      1. directive:
        不区分字符大小写,推荐按官方格式
      2. value:
        为路径时,区分大小写
    3. 示例
           
           
           
           
      • 1
      • 2
      ServerTokens Prod | directive |value|

4.4 Httpd常见配置项

子配置文件之因此优先权高,是由于子配置文件是在主配置文件最后加载的,至关于变量赋值,后面进行的赋值会覆盖前面的

  • 显示服务器版本信息

    1. 配置指令

           
           
           
           
      • 1
      ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
    2. 各类级别显示效果,建议使用ServerTokens Prod

      1. 设置值:ServerTokens Prod[uctOnly]
        显示值:Server: Apache
      2. 设置值:ServerTokens Major
        显示值:Server: Apache/2
      3. 设置值:ServerTokens Minor
        显示值:Server: Apache/2.0
      4. 设置值:ServerTokens Min[imal]
        显示值:Server: Apache/2.0.41
      5. 设置值:ServerTokens OS
        显示值:Server: Apache/2.0.41 (Unix)
      6. 设置值:ServerTokens Full (or not specified)
        显示值:Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2
    3. 查看显示效果,能够经过网站F12查看请求报文,或者在命令行使用curl -I

           
           
           
           
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      [root@hai6 html]$curl -I www.moli.com HTTP/1.1 200 OK Date: Fri, 19 Oct 2018 09:30:22 GMT Server: Apache/2.4.6 (CentOS) <==版本信息 Last-Modified: Fri, 19 Oct 2018 08:21:11 GMT ETag: "6f-5789096068cb7" Accept-Ranges: bytes Content-Length: 111 Content-Type: text/html; charset=UTF-8
  • 修改监听的IP和Port

    1. 配置指令
      Listen [IP:]PORT
    2. 格式说明
      1. 省略IP表示为本机全部IP
      2. Listen指令至少一个,可重复出现屡次
    3. 示例
      1. 示例一:在子配置文件中加入一个非默认端口,让本机的http服务同时存在两个端口
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        1. '修改配置文件,增长非默认端口' [root@hai7-6 ~]$vim /etc/httpd/conf.d/ listen 10086 <==增长端口10086 2. '从新加载服务' [root@hai7-6 ~]$systemctl reload httpd 3. '查看端口号' [root@hai7-6 ~]$ss -ntl LISTEN 0 128 :::80 :::* <==原端口80 LISTEN 0 128 :::10086 :::* <==增长的端口10086
      2. 示例二:为主机配置两个地址1个为内网192.168.50.107,1个为外网地址172.20.122.117,外网的80端口不但愿别人访问,内网的80端口能够正常访问,能够经过http端口绑定在内网ip上实现
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        1. '修改主配置文件端口项,格式以下' [root@hai7-6 ~]$vim /etc/httpd/conf/httpd.conf Listen 192.168.50.107:80 2. '重启服务' [root@hai7-6 ~]$systemctl restart httpd 3. '查看端口信息' [root@hai7-6 ~]$ss -ntl LISTEN 0 128 192.168.50.107:80 *:*
  • 持久链接(Persistent Connection)
    链接创建,每一个资源获取完成后不会断开链接,而是继续等待其它的请求完成,默认关闭持久链接

    1. 配置指令
      1. 启动持久链接
        KeepAlive On|Off
      2. 断开条件
        1. 超时时长,以秒为单位, httpd-2.4 支持毫秒级
          KeepAliveTimeout 15
        2. 数量限制,发起多少次链接就断开链接
          MaxKeepAliveRequests 100
    2. 缺点
      对并发访问量较大的服务器,持久链接会使有些请求得不到响应
    3. 优化
      使用较短的持久链接时间
    4. 测试持久链接
      使用telnet指令, 链接成功后下载资源,若是下载后没有断开就是开启持久链接状态
           
           
           
           
      • 1
      • 2
      • 3
      [root@hai6 html]$telnet 192.168.50.107 80 GET /index.html HTTP/1.1 <==指令,模拟请求报头写法 HOST: 3.3.3.3 <==目标IP
  • MPM( Multi-Processing Module)多路处理模块
    对linux而言,原本就是使用LWP(ligth weight process)机制

    1. httpd2.2版本
      httpd-2.2不支持同时编译多个模块,因此只能编译时选定一个;rpm安装的包提供三个二进制程序文件,分别用于实现对不一样MPM机制的支持
      1. 确认方法:ps aux | grep httpd
        /usr/sbin/httpd, 即prefork模式
        /usr/sbin/httpd.worker,即worker模式
        /usr/sbin/httpd.event,即event模式(测试阶段,不建议2.2使用)
      2. 更换使用的httpd程序模式
        编辑文件/etc/sysconfig/httpd找到以下行,至关于变量,将值修改成对应模式,重启生效
        HTTPD=/usr/sbin/httpd.worker
    2. httpd2.4版本中MPM模式管理
      MPM多路处理以动态模块方式提供
      1. 配置文件
        /etc/httpd/conf.modules.d/00-mpm.conf
      2. 修改示例
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        1. '配置文件中关于模块文件的说明' [root@hai7-6 html]$grep -v '^[ ]*#' /etc/httpd/conf/httpd.conf Include conf.modules.d/*.conf <==找到此行,说明关于模块的配置文件放在那里 2. '编辑上述目录中mpm模块,对应的模式以下所示,没有注释的为启用模式' [root@hai7-6 html]$vim /etc/httpd/conf.modules.d/00-mpm.conf LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so #LoadModule mpm_event_module modules/mod_mpm_event.so
    3. 模块说明
      在目录/etc/httpd/conf.modules.d(/usr/lib64/httpd/modules/)加载了大量模块,httpd支持动态加载卸载模块,能够根据我的须要注释掉对应模块
      1. 查看当前已加载到内存中的动态模块
        httpd -M
      2. 查看当前编译在程序中的静态模块
        httpd -l(小L)
    4. 各模式的默认配置
      Httpd 2.2常见配置,在centos7使用的2.4版本中没有此语句块,须要修改能够手动添加
      1. prefork的默认配置:
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        <IfModule prefork.c> StartServers 8 <==默认启动进程数 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 <==最多进程数,最大20000 MaxClients 256 <==最大并发 MaxRequestsPerChild 4000 <==子进程最多能处理的请求数量(为0时永远不释放) </IfModule>
      2. worker的默认配置:
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        <IfModule worker.c> StartServers 4 MaxClients 300 <==最多为300个客户服务 MinSpareThreads 25 <==最小25个空闲线程 MaxSpareThreads 75 ThreadsPerChild 25 <==每一个子进程支持的线程数 MaxRequestsPerChild 0 <==单个子进程在其生命周期内处理的总请求数限制 </IfModule>
    5. 压力测试
      各模式性能测试,测试命令为ab全面为ApacheBench,-c表示并发访问个数,-n最多访问次数
           
           
           
           
      • 1
      • 2
      [root@hai7-6 ~]$ab -c 100 -n 2000 192.168.50.107/test.html Requests per second: 59.04 [#/sec] (mean) <==主要看这个参数,每秒请求处理次数
  • DSO(Dynamic Shared Object)动态共享对象

    1. 加载动态模块配置
      /etc/httpd/conf/httpd.conf
    2. 配置指定实现模块加载格式:
      LoadModule <mod_name> <mod_path>
    3. 模块文件路径可以使用相对路径:
      相对于ServerRoot(默认/etc/httpd)
    4. 示例
           
           
           
           
      • 1
      LoadModule auth_basic_module modules/mod_auth_basic.so
  • 定义’Main’ server的文档页面路径
    DocumentRoot指向的路径为URL路径的起始位置
    注意:SELinux和iptables的状态

    1. 配置指令
      1. 2.2版本修改后就能够生效
        DocumentRoot “/path”
      2. 2.4版本须要明确受权修改后的路径
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        DocumentRoot “/path” <==定义DocumentRoot路径 <Directory "/var/www/html"> <==受权目录,在Directory后写明须要受权的目录 Require all granted <==授予的权限 </Directory> <==受权行尾
    2. 默认路径
      /var/www/html
  • 定义站点主页面
    主页面显示的内容默认值文件index.html,没有此文件会显示testing 123

    1. 配置指令
      DirectoryIndex
    2. 示例,能够添加多个,找不到第一个用第二个
           
           
           
           
      • 1
      DirectoryIndex index.php index.html
  • 站点访问控制常见机制
    可基于两种机制指明对哪些资源进行何种访问控制:源地址,用户帐号

    1. 访问控制路径格式

      1. 对整个目录受权
               
               
               
               
        • 1
        • 2
        • 3
        <Directory “/path"> ... </Directory>
      2. 对单个文件受权
               
               
               
               
        • 1
        • 2
        • 3
        <File “/path/file”> ... </File>
      3. 基于正则表达式访问控制
               
               
               
               
        • 1
        • 2
        • 3
        <FilesMatch "PATTERN"> ... </FilesMatch>
      4. 基于URL路径:
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        格式1:'指定URL' <Location ""> ... </Location> 格式2:'匹配模式' <LocationMatch ""> ... </LocationMatch>
      5. 示例
        1. 示例一:正则表达式控制访问那些文件
                   
                   
                   
                   
          • 1
          <FilesMatch "\.(gif|jpe?g|png)$">
        2. 示例二:通配符写法
                   
                   
                   
                   
          • 1
          <Files “?at.*”>
        3. URL写法,只容许192.168.50.115访问/status
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          • 8
          • 9
          • 10
          • 11
          • 12
          • 13
          • 14
          1. '只容许192.168.50.115访问/status' <Location /status> <RequireAny> Require all denied require ip 192.168.50.115 </RequireAny> </Location> 2. 'URL支持正则表达式写法,只容许192.168.50.115访问/(extra|special)/data' <LocationMatch "/(extra|special)/data"> <RequireAny> Require all denied require ip 192.168.50.115 </RequireAny> </LocationMatch>
    2. Options定义行为

      1. 配置指令
        Options后跟1个或多个以空白字符分隔的选项列表,定义了用户在某个目录下的特定行为,在选项前的+,- 表示增长或删除指定选项
      2. 常见选项
        1. Indexes
          指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
        2. FollowSymLinks
          容许访问符号连接文件所指向的源文件
        3. None
          所有禁用
        4. All
          所有容许
      3. 示例
        1. 示例一:返回索引列表给用户
          1. 将’Main’ server指向路径下的index.html文件失效,改变后缀便可
                       
                       
                       
                       
            • 1
            [root@hai7-6 ~]$mv /var/www/html/index.html /var/www/html/index.htm
          2. URL路径下不存在与定义的主页面资源相符的资源文件时默认返回的页面为testing 123,此页面是由/etc/httpd/conf.d/welcom.conf定义的,改变此配置文件后缀,让其失效
          3. 使用Indexes,返回索引列表给用户(用于提供下载资源网站,例如阿里云开源镜像站)
                       
                       
                       
                       
            • 1
            • 2
            [root@hai7-6 html]$vim /etc/httpd/conf.d/text.conf options indexes <==增长此项
          4. 访问http页面,返回以下界面
            在这里插入图片描述
        2. 示例二:容许访问符号连接文件所指向的源文件,选项FollowSymLinks
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
          1. '编辑配置文件,在options指令后增长Followsymlinks选项' [root@hai7-6 html]$vim /etc/httpd/conf.d/text.conf options indexes Followsymlinks 2. '定义一个软链接,指向 URL路径' [root@hai7-6 conf.d]$ln -s /etc/passwd /var/www/html/ 3. '重启生效' [root@hai7-6 conf.d]$systemctl restart httpd
        3. 示例三:取消外部以目录形式访问服务器,2.2版本能够直接删除,2.4版本apache须要将options设置-Indexes
                   
                   
                   
                   
          • 1
          • 2
          [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf Options -Indexes
    3. <Directory>中“基于源地址”实现访问控制
      与访问控制相关的指令能够放在指定目录下的.htaccess(.htaccess为默认值,能够由AccessFileName在配置文件中自定义)文件中,覆盖以前的配置指令只对<directory>语句有效

      1. 配置指令
        Allow Override
      2. 常见配置
        1. AllowOverride All
          全部指令都有效
        2. AllowOverride None
          .htaccess 文件无效
        3. AllowOverride AuthConfig Indexes
          除了AuthConfig 和Indexes的其它指令都没法覆盖
      3. 示例
        编辑.htaccess文件,实现目录访问控制,重启生效
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        1. '在/var/www/html目录下新建目录log' [root@hai7-6 html]$mkdir log 2. '在log目录中编辑`.htaccess`文件' [root@hai7-6 log]$vim .htaccess options indexes <==容许此目录返回索引 3. '编辑子配置文件受权目录/var/www/html/log覆盖权限' [root@hai7-6 html]$vim /etc/httpd/conf.d/text.conf <Directory "/var/www/html/log"> <==受权路径 allowoverride all <==受权设置生效 </Directory>
    4. httpd2.2用于容许或拒绝的语句

      1. 配置命令
        1. order:定义生效次序;写在后面的表示优先生效
          Order allow,deny
          Order deny,allow
        2. allow|deny:容许|拒绝
          放在directory, .htaccess
        3. Allow from和Deny from:定义客户端地址
        4. 客户端地址:
          1. 具体IP地址
          2. 网络地址:172.1六、172.16.0.0、172.16.0.0/1六、172.16.0.0/255.255.0.0
      2. 示例
        allow放在后面,表示没有明确拒绝的都被容许,若是不放心,能够加上Allow from all
               
               
               
               
        • 1
        • 2
        • 3
        • 4
        <files "*.txt"> order deny,allow deny from 172.16. 100.100 </files>
    5. http2.4基于IP的访问控制
      无明确受权的目录,默认拒绝

      1. 容许全部主机访问
        Require all granted
      2. 拒绝全部主机访问
        Require all denied
      3. 控制特定的IP访问:
        1. 受权指定来源的IP访问
          Require ip IPADDR
        2. 拒绝特定的IP访问
          Require not ip IPADDR
      4. 控制特定的主机访问:
        1. 受权特定主机访问
          Require host HOSTNAME:
        2. 拒绝 HOSTNAME
          Require not host HOSTNAME
      5. 特定主机
        FQDN
      6. 指定域名下的全部主机
        domin.tld
      7. 示例
        1. 拒绝特定主机访问,先受权全部,再拒绝
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          <RequireAll> Require all granted Require not ip 172.16.1.1 拒绝特定IP </RequireAll>
        2. 受权特定主机访问,先拒绝全部,在受权
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          <RequireAny> Require all denied require ip 172.16.1.1 </RequireAny>
        3. 在2.4版本中只容许192.168.50.115访问配置文件,重启生效
                   
                   
                   
                   
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          <FilesMatch ".+\.(conf|ini)$"> <==控制路径 <RequireAny> <==受权语句 Require all denied require ip 192.168.50.115 </RequireAny> </FilesMatch>
  • 日志设定
    在hpptd中日志分为访问日志和错误日志两类

    1. 错误日志:ErrorLog

      1. 存放路径
        /var/log/httpd/error_log
      2. 配置命令
        ErrorLog “logs/error_log”
      3. 定义错误级别
        LogLevel warn
级别 描述 示例
emerg 紧急状况系统没法使用 “Child cannot open lock file. Exiting”
alert 必须当即处理 “getpwuid: couldn’t determine user name from uid”
crit 关键条件,危险状况 “socket: Failed to get a socket, exiting child”
error 错误条件 “Premature end of script headers”
warn 警告信息 “child process 1234 did not exit, sending another SIGHUP”
notice 正常但比较重要的信息 “httpd: caught SIGBUS, attempting to dump core in …”
info 通常信息 "Server seems busy, (you may need to increase StartServers, or
debug 调试级消息 “Opening config file …”
  • 访问日志

    1. 参考帮助
      http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

    2. 定义日志格式:LogFormat format strings

      1. combined格式
              
              
              
              
        • 1
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
      2. common格式
              
              
              
              
        • 1
        LogFormat "%h %l %u %t \"%r\" %>s %b"
      3. 符号描述
  • 符号 描述
    %h 客户端IP地址
    %l 远程用户,启用mod_ident才有效,一般为减号“-”
    %u 验证(basic,digest)远程用户,非登陆访问时,为一个减号“-”
    %t 服务器收到请求时的时间,格式为[18/Sep/2011:19:18:28 -0400]
    %r First line of request,即表示请求报文的首行;记录了这次请求的“方法”,“URL”以及协议版本
    %>s 响应状态码
    %b 响应报文的大小,单位是字节;不包括响应报文http首部
    %{Referer}i 请求报文中首部“referer”的值;即从哪一个页面中的超连接跳转至当前页面的,用于分析是否链接被盗用,是否由合做网站跳转过来
    %{User-Agent}i 请求报文中首部“User-Agent”的值;即发出请求的应用程序,用户使用的为那种浏览器
  • 在配置文件中定义使用那种日志格式
    CustomLog logs/access_log combined

  • 修改日志时间格式
    格式为%{format}t,设置帮助为man 3 strftime
    例如:%{%Y-%m-%d %H:%M:%S}t 输出格式为[2018-09-30 09:18:32]
    配置文件修改内容

      
      
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    [root@hai7-6 ~]$vim /etc/httpd/conf.d/test.conf `将访问日子命名为molilog,时间格式定义为%{%Y-%m-%d %H:%M:%S}t` LogFormat "%h %l %u %{%Y-%m-%d %H:%M:%S}t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" molilog `应用定义的日志格式` CustomLog "logs/access_log" molilog
  • 设定默认字符集
    中文字符集:GBK, GB2312(简体字), GB18030

    1. 配置命令
      AddDefaultCharset
    2. 示例
          
          
          
          
      • 1
      AddDefaultCharset GB2312
  • 定义路径别名
    将DocumentRoo以外的目录,显示到网站上

    1. 配置指令
      Alias /URL/ "/PATH/"
    2. 示例:
      在DocumentRoot以外的其余目录,建立一个文件,使其显示在网站上,例如服务器的ip地址为192.168.50.107
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      1. '在/data下建一个目录app,在app下建立一个index.html文件' [root@hai7-6 ~]$mkdir /data/app [root@hai7-6 ~]$echo shanwuyu >/data/app/index.hmtl 2. '编辑http的子配置文件' [root@hai7-6 ~]$vim /etc/httpd/conf.d/test.conf alias /stu /data/app <==指定/data/app在http中的别名为/stu <Directory "/data/app"> <==受权目录权限,否则不能访问 Require all granted </Directory> 3. 重启服务,在页面访问'192.168.50.107/stu',能够显示/data/app下内容
  • 基于用户的访问控制

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

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

    3. 认证方式两种:
      basic:明文
      digest:消息摘要认证,兼容性差

    4. 安全域
      须要用户认证后方能访问的路径;应该经过名称对其进行标识,以便于告知用户认证的缘由

    5. 用户的帐号和密码
      虚拟帐号:仅用于访问某服务时用到的认证标识
      帐号存储:文本文件,SQL数据库,ldap目录存储,nis等

    6. basic认证配置示例:

          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      1. '定义安全域' <Directory "/path"> <==针对哪一个目录须要验证 Options None AllowOverride None AuthType Basic <==验证方式 AuthName "String" <==验证时但愿弹出对话框,描述信息 AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE" <==用户名帐户密码放在那里 Require user username1 username2 ... <==访问用户是谁,从上面的文件中挑选 </Directory> 2. '定义能够访问用户' Require valid-user <==容许帐号文件中的全部用户登陆访问
    7. 提供帐号和密码存储(文本文件)
      使用专用命令完成此类文件的建立及用户管理

      1. 语法
        htpasswd [options] /PATH/HTTPD_PASSWD_FILE username
      2. 选项
  • 选项 描述
    -c 自动建立文件,仅首次时使用,再次使用会覆盖
    -p 明文密码
    -d CRYPT格式加密,默认
    -m md5格式加密
    -s sha格式加密
    D 删除指定用户
    1. 示例
      建立用户,指定存放在/data/passwd文件中
         
         
         
         
      • 1
      [root@hai7-6 app]$htpasswd -D /data/passwd a
      修改密码,覆盖现有帐户便可,输入两次密码
         
         
         
         
      • 1
      [root@hai7-6 app]$htpasswd /data/passwd b
  • 基于用户的访问控制示例
    方法一:在配置文件中定义认证范围

      
      
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. '首先建立2个帐户' [root@hai7-6 app]$htpasswd -c /data/passwd a [root@hai7-6 app]$htpasswd /data/passwd b 2. '查看生成的帐户' [root@hai7-6 app]$cat /data/passwd a:$apr1$2JDhlL7o$PE7sXATzsNh9/uESJq31R. b:$apr1$Y/F5MLhN$Xx5g3DVPKLVgyi2AavWHT/ 3. '编辑配置文件定义访问控制' [root@hai7-6 ~]$vim /etc/httpd/conf.d/test.conf <Directory /data/app> <==定义须要认证访问的范围 AuthType Basic <==认证方式 AuthName "key" <==提示用户须要认证的描述语句 AuthUserFile "/data/passwd" <==用户来源 Require user b <==定义可访问用户,用户b能够访问 </Directory> [root@hai7-6 conf.d]$systemctl restart httpd

    方法2
    在须要认证的目录下建.htaccess文件,将认证语法写入此文件,而后在配置文件中受权.htaccess

      
      
      
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    1. '在须要认证的目录下建 .htaccess文件,并添加认证机制' [root@hai7-6 app]$vim /data/app/.htaccess AuthType Basic AuthName "login right name" AuthUserFile "/data/passwd" Require user b 2. '在配置文件中受权目录能够运行设置' [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf <Directory /data/app> Allowoverride authconfig <受权在 /data/app下的设置运行覆盖生效 </Directory>
  • 基于组帐号进行认证

    1. 配置命令
      AuthGroupFile:定义组帐号所在路径
      Require group:受权列表
    2. 定义安全域
          
          
          
          
      • 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>
    3. 建立用户帐号和组帐号文件
      组文件:每一行定义一个组
      GRP_NAME: username1 username2 …
    4. 示例
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      1. '配置文件配置项' <Directory /data/app> AuthType Basic <==认证类型 AuthName "secret dir" <==访问目录提示语 AuthUserFile "/data/passwd" <==用户文件目录 AuthGroupFile "/data/group" <==组文件目录 Require group g1 <==受权g1用户访问 </Directory> 2. '建立组文件,帐号建立在基于用户的访问控制,这里已有帐号a/b/c,分为g1和g2组' [root@hai7-6 data]$cat > /data/group g1:a b g2:b c
  • 远程客户端和用户验证的控制

    1. 配置命令
      Satisfy ALL|Any
    2. 参数描述
      ALL :客户机IP和用户验证都须要经过才能够
      Any:客户机IP和用户验证,有一个知足便可
    3. 示例,ip和用户认证,知足一个便可
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      Require valid-user Require all denied require ip 172.16.1.1 Satisfy Any
  • 实现用户家目录的http共享,只是共享其中的某个目录
    基于模块’mod_userdir.so’实现
    若是SELinux启用须要添加: http_enable_homedirs

    1. 相关设置,2.2版本
          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      [root@hai7-6 conf]$vim /etc/httpd/conf/httpd.conf <IfModule mod_userdir.c> #UserDir disabled UserDir public_html #指定共享目录的名称 </IfModule>
    2. 示例:2.4版本
      1. 创建一个测试用户text,并切换身份
              
              
              
              
        • 1
        • 2
        [root@hai7-6 ~]$useradd test [root@hai7-6~]$su test
      2. 在其家目录中创建一个用于http共享的文件夹
              
              
              
              
        • 1
        [test@hai7-6 ~]$mkdir public_html
      3. 在文件夹下建立一个index.html文件
              
              
              
              
        • 1
        [test@hai7-6 ~]$echo test homedir > public_html/index.html
      4. 确认依赖模块是否加载
              
              
              
              
        • 1
        • 2
        [test@hai7-6 ~]$httpd -M | grep user userdir_module (shared) <==此模块须要加载在内存中
      5. 修改配置文件,在2.4版本中,有独立的配置文件etc/httpd/conf.d/userdir.conf
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        '进入配置文件,找到以下项,将disabled注释掉,public_html去掉注释' [test@hai7-6 ~]$vim /etc/httpd/conf.d/userdir.conf #UserDir disabled UserDir public_html <==public_html此目录名能够修改,只要与家目录下相同就能够
      6. 要在网页上显示,就要要apache最少对目录有执行权限
              
              
              
              
        • 1
        [test@hai7-6 ~]$setfacl -m u:apache:x /home/test
      7. 若是此目录只想让指定用户查看,能够配合身份认证,须要注释掉冲突项
              
              
              
              
        • 1
        • 2
        [test@hai7-6 ~]$vim /etc/httpd/conf.d/userdir.conf AllowOverride FileInfo AuthConfig Limit Indexes <==注释掉此行,而后配置认证
      8. 设置成功后在浏览器访问(~表示家目录下的test目录)
        http://localhost/~test/
  • ServerSignature On | Off | EMail
    当客户请求的网页并不存在时,服务器将产生错误文档,缺省状况下因为打开了 ServerSignature选项,错误文档的最后一行将包含服务器的名字、Apache的版本等信息

    1. 配置命令
      ServerSignature
    2. 参数
      1. on
        显示服务器的名字、Apache的版本等信息
      2. off
        默认值,不显示服务器的名字、Apache的版本等信息
      3. Email
        将显示ServerAdmin 的Email提示,在网页上留下邮箱,供用户联系
    3. 示例:设置为on,会显示的信息
      在这里插入图片描述
  • ServerType inetd | standalone
    设置独立或非独立服务,只适用于Unix平台

    1. 配置命令
      ServerType inetd
    2. 参数
      1. standalone:独立服务模式
      2. inetd:非独立服务模式
  • status页面
    httpd经过内部的处理器Handler在其内部经过模块status_module来额外提供服务器状态的页面

    1. 配置命令
      SetHandler
    2. 参数
      server-status
    3. 示例
      1. 首先确认模块是否已经加载
              
              
              
              
        • 1
        • 2
        [root@hai7-6 ~]$httpd -M |grep status status_module (shared)
        若是没有加载须要在配置文件中加入以下配置
              
              
              
              
        • 1
        LoadModule status_module modules/mod_status.so
      2. 启动模块后,修改配置文件,加入status激活项
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf <Location /server-status> <==/server-status能够自定义,访问地址 SetHandler server-status <==激活内部的程序server-status Require all granted <==能够设置访问权限 </Location> ExtendedStatus On <==加入此项能够显示扩展信息,默认为Off状态
      3. 访问网页,会弹出如下信息
        http://localhost/server-status
              
              
              
              
        • 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
        Apache Server Status for 192.168.50.107 (via 192.168.50.107) Server Version: Apache/2.4.6 (CentOS) PHP/5.4.16 <==服务器版本 Server MPM: prefork <==正在使用的MPM类型 Server Built: Apr 20 2018 18:10:38 <==服务器构建时间 Current Time: Monday, 22-Oct-2018 20:38:13 CST <==当前系统时间 Restart Time: Monday, 22-Oct-2018 20:37:32 CST <==服务重启时间 Parent Server Config. Generation: 1 <==父进程从新生成的版本号 Parent Server MPM Generation: 0 <==MPM版本 Server uptime: 40 seconds <==服务器正常运行时间 Server load: 1.41 1.04 0.55 <==1分钟、5分钟、15分钟的队列长度 Total accesses: 3 - Total Traffic: 5 kB <==accesses:访问次数-Traffic访问流量 CPU Usage: u0 s0 cu0 cs0 <==CPU利用率 .075 requests/sec - 128 B/second - 1706 B/request <==每秒接收的请求数,字节数每秒,每秒请求平均大小 1 requests currently being processed, 5 idle workers ___W__.......................................................... ................................................................ ................................................................ ................................................................ Scoreboard Key: "_" Waiting for Connection, "S" Starting up, "R" Reading Request, "_"表示运行中的空闲进程 , "S"表示正在启动进程,"R"正在接收请求 "W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup, "W"表示发送响应报文, "K"保持链接,等待读取数据,"D"DNS域名查询 "C" Closing connection, "L" Logging, "G" Gracefully finishing, "C"关闭链接,"L"记录日志中,"G"优雅的终止,意思是正常断开 "I" Idle cleanup of worker, "." Open slot with no current process "I"清理空闲中的进程,"."能够启用的进程数
  • 虚拟主机
    基于一个主机,运行多个网站

    1. 实现方案:

      1. 基于ip
        为每一个虚拟主机准备至少一个ip地址
      2. 基于port
        为每一个虚拟主机使用至少一个独立的port
      3. 基于FQDN
        为每一个虚拟主机使用至少一个FQDN
    2. 注意事项
      通常虚拟机不要与main主机混用;所以,要使用虚拟主机,通常先禁用main主机
      禁用方法:注释中心主机的DocumentRoot指令便可

    3. 虚拟主机的配置方法:

          
          
          
          
      • 1
      • 2
      • 3
      • 4
      <VirtualHost IP:PORT> ServerName FQDN DocumentRoot “/path" </VirtualHost>
    4. 其它可用指令:
      ServerAlias:虚拟主机的别名;可屡次使用
      ErrorLog: 错误日志
      CustomLog:访问日志
      <Directory “/path"> </Directory>:受权

    5. 示例
      准备工做,设计运行三个网站web1 、web2 、web3
      分别为其创建html目录,并建立页面文件

          
          
          
          
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      1. '创建目录' [root@hai7-6 data]$mkdir /data/web{1,2,3} 2. '建立页面文件' [root@hai7-6 data]$echo /data/web1 > /data/web1/index.html [root@hai7-6 data]$echo /data/web2 > /data/web2/index.html [root@hai7-6 data]$echo /data/web3 > /data/web3/index.html
      1. 基于端口的配置,规划使用端口分别为web1:8001,web2:8002,web3:8003
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
        [root@hai7-6 data]$vim /etc/httpd/conf.d/text.conf listen 8001 <==配置监听端口,3个端口都要设置 listen 8002 listen 8003 <virtualhost *:8001> <==定义虚拟主机,指定端口号,*表示全部ip documentroot /data/web1 <==指定页面目录 servername www.a.com <==访问 </virtualhost> <==定义虚拟机结尾 <directory /data/web1> <==在2.4中,须要受权目录 require all granted </directory>
      2. 基于IP的虚拟主机示例,须要的多个公网ip,成本高
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        <virtualhost 192.168.50.81:80> <==端口统一为80,为每一个网站分配一个ip地址 documentroot /data/web1 servername www.a.com </virtualhost> <directory /data/web1> require all granted </directory>
      3. 基于FQDN(主机头)实现的虚拟主机
        dns解析ip地址为同一个,指向的是三个域名,在用户访问不一样域名时,请求报头里的HOST会读取域名,找到配置文件中的ServerName,返回相应页面;
        若是输入Ip地址访问,默认返回配置文件中排在前面的。当同一个网站有多个域名时,可使用别名实现,在DNS解析中将域名添加上便可
        httpd2.2版本须要增长:NameVirtualHost *:80
              
              
              
              
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        <virtualhost *:80> <==设置虚拟机全部Ip能够访问80端口 documentroot /data/web2 <==网页目录地址 servername www.b.com <==host,指定域名 ServerAlias a.com *.a.com <==支持别名,当一个网站有多个域名时使用 <directory /data/web2> <==受权目录 require all granted </directory> ErrorLog "logs/b_error_log" <==建独立的错误日志 CustomLog "logs/b_access_log" combined <==建独立的访问日志 </virtualhost>
  • </div>
    					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
                </div>
    相关文章
    相关标签/搜索