HTTP服务和APACHE

HTTP服务和APACHE

1. 跨Internet的主机间通讯

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

  • Socket套接字

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

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

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

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

      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,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节

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

    5. 通讯过程

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

函数 描述
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(也可以封装传输其他类型文件),使用超文本标记语言,编程语言编写,
      示例:超文本标记语言
      <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>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      超文本(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组成
        <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
        
        • 1
        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查询
        https://list.jd.com/list.html?cat=670,671,672&ev=149_2992&sort=sort_totalsales15_desc&trans=1
        
        • 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. 请求行:  <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> 
    
    • 1
    • 2
    • 3
    • 4
  • 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发行版,稳定,建议使用

      [root@hai7-6 ~]$yum install httpd
      
      • 1
    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. '安装文档包'
    [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
    • 2
    • 3
    • 4
    • 5
    • 6
  • 检查配置语法:

    1. httpd –t
    2. service httpd configtest
    3. 示例:语法检查时出现00558报错解决方案
      [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
      
      • 1
      • 2
      会出现AH00558这个提示,是因为没有配置ServerName,可以在配置文件中修改,此名字只有本地意义,需要配置DNS才可以通过网络解析
      [root@hai7-6 conf]$vim httpd.conf
      #ServerName www.example.com:80    <==找到ServerName行,去掉注释,或者新建一行都行
      erverName www.moli.com:80
      
      • 1
      • 2
      • 3

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. 示例
      ServerTokens  Prod
      | directive |value|
      
      • 1
      • 2

4.4 Httpd常见配置项

子配置文件之所以优先权高,是因为子配置文件是在主配置文件最后加载的,相当于变量赋值,后面进行的赋值会覆盖前面的

  • 显示服务器版本信息

    1. 配置指令

      ServerTokens  Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
      
      • 1
    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

      [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
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
  • 修改监听的IP和Port

    1. 配置指令
      Listen [IP:]PORT
    2. 格式说明
      1. 省略IP表示为本机所有IP
      2. Listen指令至少一个,可重复出现多次
    3. 示例
      1. 示例一:在子配置文件中加入一个非默认端口,让本机的http服务同时存在两个端口
        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
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
      2. 示例二:为主机配置两个地址1个为内网192.168.50.107,1个为外网地址172.20.122.117,外网的80端口不希望别人访问,内网的80端口可以正常访问,可以通过http端口绑定在内网ip上实现
        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      *:* 
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
  • 持久连接(Persistent Connection)
    连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认关闭持久连接

    1. 配置指令
      1. 启动持久连接
        KeepAlive On|Off
      2. 断开条件
        1. 超时时长,以秒为单位, httpd-2.4 支持毫秒级
          KeepAliveTimeout 15
        2. 数量限制,发起多少次连接就断开连接
          MaxKeepAliveRequests 100
    2. 缺点
      对并发访问量较大的服务器,持久连接会使有些请求得不到响应
    3. 优化
      使用较短的持久连接时间
    4. 测试持久连接
      使用telnet指令, 连接成功后下载资源,如果下载后没有断开就是开启持久连接状态
      [root@hai6  html]$telnet 192.168.50.107 80
      GET /index.html  HTTP/1.1       <==指令,模拟请求报头写法
      HOST: 3.3.3.3					<==目标IP
      
      • 1
      • 2
      • 3
  • 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. '配置文件中关于模块文件的说明'
        [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
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
    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的默认配置:
        <IfModule prefork.c>
        StartServers 8           <==默认启动进程数
        MinSpareServers 5
        MaxSpareServers 20
        ServerLimit 256			 <==最多进程数,最大20000
        MaxClients 256 			 <==最大并发
        MaxRequestsPerChild 4000 <==子进程最多能处理的请求数量(为0时永远不释放)
        </IfModule>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
      2. worker的默认配置:
        <IfModule worker.c>
        StartServers 4
        MaxClients 300         <==最多为300个客户服务
        MinSpareThreads 25     <==最小25个空闲线程
        MaxSpareThreads 75
        ThreadsPerChild 25     <==每个子进程支持的线程数
        MaxRequestsPerChild 0  <==单个子进程在其生命周期内处理的总请求数限制
        </IfModule>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
    5. 压力测试
      各模式性能测试,测试命令为ab全面为ApacheBench,-c表示并发访问个数,-n最多访问次数
      [root@hai7-6 ~]$ab -c 100 -n 2000 192.168.50.107/test.html
      Requests per second:    59.04 [#/sec] (mean)  <==主要看这个参数,每秒请求处理次数
      
      • 1
      • 2
  • DSO(Dynamic Shared Object)动态共享对象

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

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

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

    1. 访问控制路径格式

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

      1. 配置指令
        Options后跟1个或多个以空白字符分隔的选项列表,定义了用户在某个目录下的特定行为,在选项前的+,- 表示增加或删除指定选项
      2. 常见选项
        1. Indexes
          指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户
        2. FollowSymLinks
          允许访问符号链接文件所指向的源文件
        3. None
          全部禁用
        4. All
          全部允许
      3. 示例
        1. 示例一:返回索引列表给用户
          1. 将’Main’ server指向路径下的index.html文件失效,改变后缀即可
            [root@hai7-6 ~]$mv /var/www/html/index.html /var/www/html/index.htm
            
            • 1
          2. URL路径下不存在与定义的主页面资源相符的资源文件时默认返回的页面为testing 123,此页面是由/etc/httpd/conf.d/welcom.conf定义的,改变此配置文件后缀,让其失效
          3. 使用Indexes,返回索引列表给用户(用于提供下载资源网站,例如阿里云开源镜像站)
            [root@hai7-6 html]$vim /etc/httpd/conf.d/text.conf 
            options indexes     <==增加此项
            
            • 1
            • 2
          4. 访问http页面,返回如下界面
            在这里插入图片描述
        2. 示例二:允许访问符号链接文件所指向的源文件,选项FollowSymLinks
          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
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
          • 7
        3. 示例三:取消外部以目录形式访问服务器,2.2版本可以直接删除,2.4版本apache需要将options设置-Indexes
          [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf 
          Options -Indexes          
          
          • 1
          • 2
    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. '在/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>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
    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.16、172.16.0.0、172.16.0.0/16、172.16.0.0/255.255.0.0
      2. 示例
        allow放在后面,表示没有明确拒绝的都被允许,如果不放心,可以加上Allow from all
        <files "*.txt">
        order deny,allow
        deny from 172.16. 100.100
        </files>
        
        • 1
        • 2
        • 3
        • 4
    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. 拒绝特定主机访问,先授权所有,再拒绝
          <RequireAll>
          Require all granted
          Require not ip 172.16.1.1 拒绝特定IP
          </RequireAll>
          
          • 1
          • 2
          • 3
          • 4
        2. 授权特定主机访问,先拒绝所有,在授权
          <RequireAny>
          Require all denied
          require ip 172.16.1.1 
          </RequireAny>
          
          • 1
          • 2
          • 3
          • 4
        3. 在2.4版本中只允许192.168.50.115访问配置文件,重启生效
          <FilesMatch ".+\.(conf|ini)$">     <==控制路径
          <RequireAny>                 	   <==授权语句
          Require all denied
          require ip 192.168.50.115 
          </RequireAny>
          </FilesMatch>
          
          • 1
          • 2
          • 3
          • 4
          • 5
          • 6
  • 日志设定
    在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格式
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
        
        • 1
      2. common格式
        LogFormat "%h %l %u %t \"%r\" %>s %b"
        
        • 1
      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]
    配置文件修改内容

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
  • 设定默认字符集
    中文字符集:GBK, GB2312(简体字), GB18030

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

    1. 配置指令
      Alias /URL/ "/PATH/"
    2. 示例:
      在DocumentRoot之外的其他目录,创建一个文件,使其显示在网站上,例如服务器的ip地址为192.168.50.107
      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
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
  • 基于用户的访问控制

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

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

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

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

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

    6. basic认证配置示例:

      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     <==允许账号文件中的所有用户登录访问
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    7. 提供账号和密码存储(文本文件)
      使用专用命令完成此类文件的创建及用户管理

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

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

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 基于组账号进行认证

    1. 配置命令
      AuthGroupFile:定义组账号所在路径
      Require group:授权列表
    2. 定义安全域
      <Directory "/path">        <==定义授权路径
      AuthType Basic     		   <==认证类型
      AuthName "String"  	       <==认证描述信息
      AuthUserFile "/PATH/HTTPD_USER_PASSWD_FILE"     <==账号列表文件
      AuthGroupFile "/PATH/HTTPD_GROUP_FILE"   		<==分组信息文件
      Require group grpname1 grpname2 ... 	  	    <==授权列表
      </Directory>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
    3. 创建用户账号和组账号文件
      组文件:每一行定义一个组
      GRP_NAME: username1 username2 …
    4. 示例
      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
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
  • 远程客户端和用户验证的控制

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

    1. 相关设置,2.2版本
      [root@hai7-6 conf]$vim /etc/httpd/conf/httpd.conf
      <IfModule mod_userdir.c>  
      #UserDir disabled
      UserDir public_html #指定共享目录的名称
      </IfModule>
      
      • 1
      • 2
      • 3
      • 4
      • 5
    2. 示例:2.4版本
      1. 建立一个测试用户text,并切换身份
        [root@hai7-6 ~]$useradd test
        [root@hai7-6~]$su test
        
        • 1
        • 2
      2. 在其家目录中建立一个用于http共享的文件夹
        [test@hai7-6 ~]$mkdir public_html
        
        • 1
      3. 在文件夹下创建一个index.html文件
        [test@hai7-6 ~]$echo test homedir > public_html/index.html
        
        • 1
      4. 确认依赖模块是否加载
        [test@hai7-6 ~]$httpd -M | grep user
        userdir_module (shared)    <==此模块需要加载在内存中
        
        • 1
        • 2
      5. 修改配置文件,在2.4版本中,有独立的配置文件etc/httpd/conf.d/userdir.conf
        '进入配置文件,找到如下项,将disabled注释掉,public_html去掉注释'
        [test@hai7-6 ~]$vim /etc/httpd/conf.d/userdir.conf
        #UserDir disabled
        UserDir public_html    <==public_html此目录名可以修改,只要与家目录下相同就可以
        
        • 1
        • 2
        • 3
        • 4
      6. 要在网页上显示,就要要apache最少对目录有执行权限
        [test@hai7-6 ~]$setfacl -m u:apache:x /home/test
        
        • 1
      7. 如果此目录只想让指定用户查看,可以配合身份认证,需要注释掉冲突项
        [test@hai7-6 ~]$vim /etc/httpd/conf.d/userdir.conf
        AllowOverride FileInfo AuthConfig Limit Indexes    <==注释掉此行,然后配置认证
        
        • 1
        • 2
      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. 首先确认模块是否已经加载
        [root@hai7-6 ~]$httpd -M |grep  status
        status_module (shared)
        
        • 1
        • 2
        如果没有加载需要在配置文件中加入如下配置
        LoadModule  status_module  modules/mod_status.so
        
        • 1
      2. 启动模块后,修改配置文件,加入status激活项
        [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状态
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
      3. 访问网页,会弹出以下信息
        http://localhost/server-status
        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
        • 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
  • 虚拟主机
    基于一个主机,运行多个网站

    1. 实现方案:

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

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

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

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

      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
      • 2
      • 3
      • 4
      • 5
      • 6
      1. 基于端口的配置,规划使用端口分别为web1:8001,web2:8002,web3:8003
        [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>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
        • 11
      2. 基于IP的虚拟主机示例,需要的多个公网ip,成本高
        <virtualhost 192.168.50.81:80>    <==端口统一为80,为每个网站分配一个ip地址
        documentroot /data/web1
        servername www.a.com
        </virtualhost>
        <directory /data/web1>
        require  all granted
        </directory>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
      3. 基于FQDN(主机头)实现的虚拟主机
        dns解析ip地址为同一个,指向的是三个域名,在用户访问不同域名时,请求报头里的HOST会读取域名,找到配置文件中的ServerName,返回相应页面;
        如果输入Ip地址访问,默认返回配置文件中排在前面的。当同一个网站有多个域名时,可以使用别名实现,在DNS解析中将域名添加上即可
        httpd2.2版本需要增加:NameVirtualHost *:80
        <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>
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
        • 10
  •         </div>
    					<link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-7f770a53f2.css" rel="stylesheet">
                </div>
    
    posted @ 2018-11-03 19:57  朝圣布达拉  阅读(373)  评论(0编辑  收藏  举报