Linux下Apache(HTTP)基础知识梳理-运维笔记

HTTP介绍:

  • HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议,是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
  • HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统;HTTP协议工作于客户端-服务端架构为上,浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP功能特性:

  • 支持B/S及C/S模式。
  • 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

一次完整的http协议请求的工作流程如下:

(1) 终端客户在Web浏览器地址栏输入访问地址//www.baidu.com
(2) Web浏览器请求DNS服务器把域名www.baidu.com转换成Web服务器的IP地址,此处的解析过程就是DNS解析的原理流程。
(3) Web浏览器将端口号(默认80)从访问地址(URL)中解析出来。
(4) Web浏览器通过解析后的IP地址及端口号于Web服务器之间建立一条TCP连接。
(5) 建立TCP连接后,Web浏览器向Web服务器发送一条HTTP请求报文。
(6) Web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文。
(7) Web服务器关闭http连接,关闭TCP连接,Web浏览器显示访问的网站内容到屏幕。

 各个步骤具体细节

  • (1) 终端客户在Web浏览器地址栏输入访问地址//www.baidu.com
  • (2) Web浏览器请求DNS服务器把域名www.baidu.com转换成Web服务器的IP地址,此处的解析过程就是DNS解析的原理流程。
    • a. 在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个ip地址映射,完成域名解析。
    • b. 如果hosts里没有这个域名的映射,则会查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
    • c. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析记过给客户端,完成域名解析,此解析具有权威性。
    • d. 如果要查询域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
    • e. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(baidu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找baidu.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机。
    • f. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把请求转至上上级,以此循环。不管是本地DNS服务器用是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。

      

  • (3) Web浏览器将端口号(默认80)从访问地址(URL)中解析出来。
  • (4) Web浏览器通过解析后的IP地址及端口号于Web服务器之间建立一条TCP连接。
    • 建立一个TCP连接时,需要客户端和服务器端总共发送3个包。三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。在socket编程中,客户端执行connect()时将触发三次握手。
    • 第一次握手(SYN=1,seq=x):客户端发送一个TCP的SYN标志位置1的包,指明客户端打算连接的服务器的端口,以及初始序号X,保存在包头的序列号(Sequence Number)字段里。
    • 第二次握手(SYN=1,ACK=1,seq=y,ACKnum=x+1):服务器发回确认包(ACK)应答。即SYN标志位和ACK标志位均为1。服务器端选择自己的ISN序列号,放在seq域里,同时将确认序号(Acknowledgement Number)设置为客户的ISN加1,即X+1。发送完毕后,服务器端进入SYN_RCVD状态。
    • 第三次握手(ACK=1,ACKnum=y+1):客户端再次发送确认包(ACK),SYN标志位为0,ACK标志位为1,并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方,并且在数据段放写ISN的+1。发送完毕后,客户端进入ESTABLISHED状态,当服务器端收到这个包时,也进入ESTABLISHED状态,TCP握手结束,TCP连接建立完成。

    

  • (5) 建立TCP连接后,Web浏览器向Web服务器发送一条HTTP请求报文。
    • HTTP请求报文由三部分组成:请求行,请求头、空格、请求正文。
    • 请求行:用于描述客户端的请求方式(GET/POST等),请求的资源名称(URL)以及使用的HTTP协议的版本号。
    • 请求头:用于描述客户端请求哪台主机及其端口,以及客户端的一些环境信息等。
    • 空行:空行就是\r\n (POST请求时候有)。
    • 请求正文:当使用POST等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中(GET方式是保存在url地址后面,不会放到这里)
      • 请求方法有哪些种呢?
          GET: 完整请求一个资源 (常用)
          HEAD: 仅请求响应首部
          POST:提交表单  (常用)
          PUT: (webdav) 上传文件(但是浏览器不支持该方法)
          DELETE:(webdav) 删除
          OPTIONS:返回请求的资源所支持的方法的方法
          TRACE: 追求一个资源请求中间所经过的代理(该方法不能由浏览器发出)
  • (6) Web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文。
    • HTTP响应也由三部分组成:状态行,响应头,空格,消息体
    • 状态行包括:协议版本、状态码、状态码描述
    • 响应头:响应头用于描述服务器的基本信息,以及客户端如何处理数据
    • 空格:CRLF(即 \r\n)分割
    • 消息体:服务器返回给客户端的数据
      • 状态码:状态码用于表示服务器对请求的处理结果。
          1xx:指示信息——表示请求已经接受,继续处理
          2xx:成功——表示请求已经被成功接收、理解、接受。
          3xx:重定向——要完成请求必须进行更进一步的操作
          4xx:客户端错误——请求有语法错误或请求无法实现
          5xx:服务器端错误——服务器未能实现合法的请求。
  • (7) Web服务器关闭http连接,关闭TCP连接,Web浏览器显示访问的网站内容到屏幕。
    • 释放一个TCP连接,需要客户端和服务器总共发送4个包。客户端和服务器端均可主动发起挥手动作。在socket编程中,任何一方执行close()操作即可产生挥手操作。
    • 第一次挥手(FIN=1,seq=x):假设客户端想要关闭连接,客户端发送一个FIN标志位置为1的包,表示自己已经没有数据可以发送了,但是仍然可以接收数据。发送完毕之后,客户端进入FIN_WAIT_1状态。
    • 第二次挥手(ACK=1,ACKnum=x+1):服务器端确认客户端的FIN包,发送一个确认包,表明自己接收到了客户端关闭连接的请求,但还没有准备好关闭连接。发送完毕后,服务器端进入CLOSE_WAIT状态,客户端接收到这个确认包之后进入FIN_WAIT_2状态,等待服务器端关闭连接。
    • 第三次挥手(FIN=1,seq=y):服务器端准备好关闭连接时,向客户端发送结束连接请求,FIN置为1。发送完毕后,服务器端进入LAST_ACK状态,等待来自客户端的最后一个ACK。
    • 第四次挥手(ACK=1,ACKnum=y+1):客户端接收到来自服务器的端的关闭请求,发送一个确认包,并进入TIME_WAIT状态,等待可能出现的要重传的ACK包。服务器端接收到这个确认包之后,关闭连接,进入CLOSED状态。客户端等待了某个固定时间(两个最大段生命周期,2MSL,2Maximum Segment Lifetime)之后,没有收到服务器端的ACK,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入CLOSED状态。

    

httpd介绍:

  • httpd早期叫做apache–a patchy server=apache,属于Apache软件基金会(ASF:apache software foundation)的一个项目,后来apache更名为httpd,因此这样更符合http server这个含义了。httpd是Apache超文本传输协议(HTTP)服务器的主程序。被设计为一个独立运行的后台进程,它会建立一个处理请求的子进程或线程的池。

httpd的特性:

  •  httpd有很多特性,下面就分别来说说httpd-2.2版本和httpd-2.4版本各自的特性。
版本 特性
2.2 事先创建进程
按需维持适当的进程
模块化设计,核心比较小,各种功能通过模块添加(包括PHP),支持运行时配置,支持单独编译模块
支持多种方式的虚拟主机配置,如基于ip的虚拟主机,基于端口的虚拟主机,基于域名的虚拟主机等
支持https协议(通过mod_ssl模块实现)
支持用户认证
支持基于IP或域名的ACL访问控制机制
支持每目录的访问控制(用户访问默认主页时不需要提供用户名和密码,但是用户访问某特定目录时需要提供用户名和密码)
支持URL重写
支持MPM(Multi Path Modules,多处理模块)。用于定义httpd的工作模型(单进程、单进程多线程、多进程、多进程单线程、多进程多线程)
2.4 httpd-2.4的新特性:
MPM支持运行DSO机制(Dynamic Share Object,模块的动态装/卸载机制),以模块形式按需加载
支持event MPM,eventMPM模块生产环境可用
支持异步读写
支持每个模块及每个目录分别使用各自的日志级别
每个请求相关的专业配置,使用<If>来配置
增强版的表达式分析器
支持毫秒级的keepalive timeout
基于FQDN的虚拟主机不再需要NameVirtualHost指令
支持用户自定义变量
支持新的指令(AllowOverrideList)
降低对内存的消耗

 httpd的工作模式:

  • (1) prefork 工作模式

  httpd在启动之初,就预先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
  优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全的问题。
  缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,它并不擅长处理高并发请求。

  • (2) worker 工作模式

  使用了多进程和多线程的混合模式。它也预先fork了几个子进程(数量比较少),然后每个子进程创建一些线程,同时包括一个监听线程。每个请求过来,会被分配到1个线程来服务。线程比起进程会更轻量,因为线程通常会共享父进程的内存空间,因此,内存的占用会减少一些。在高并发的场景下,因为比起prefork有更多的可用线程,表现会更优秀一些。
  优点:占据更少的内存,高并发下表现更优秀。
  缺点:必须考虑线程安全的问题。

  • (3) event 工作模式

  它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。

  HTTP采用keepalive方式减少TCP连接数量,但是由于需要与服务器线程或进程进行绑定,导致一个繁忙的服务器会消耗完所有的线程。Event MPM是解决这个问题的一种新模型,它把服务进程从连接中分离出来。在服务器处理速度很快,同时具有非常高的点击率时,可用的线程数量就是关键的资源限 制,此时Event MPM方式是最有效的,但不能在HTTPS访问下工作。

Apache源码编译安装指定版本。

官方站点下载://archive.apache.org/dist/httpd/

sohu站点下载://mirrors.sohu.com/apache/

 第一部分:Centos7初始系统源码编译安装操作。

# 准备环境
[root@Server-01 ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)    
[root@Server-01 ~]# uname -r
3.10.0-862.el7.x86_64
[root@Server-01 ~]# uname -a
Linux Server-01 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@Server-01 ~]# hostname -I
172.16.70.37

[root@Server-01 ~]# yum -y install apr apr-devel apr-util-devel gcc gcc-c++ pcre pcre-devel openssl-devel wget curl   # 安装依赖及所需软件
[root@Server-01 ~]# mkdir -p /data/apps /data/tmpdir
[root@Server-01 ~]# cd /data/tmpdir/
# 下载源码可用以下2种方式
[root@Server-01 tmpdir]# wget //mirrors.sohu.com/apache/httpd-2.4.41.tar.gz
[root@Server-01 tmpdir]# curl -O //mirrors.sohu.com/apache/httpd-2.4.41.tar.gz
[root@Server-01 tmpdir]# tar xf httpd-2.4.41.tar.gz
[root@Server-01 tmpdir]# ls
httpd-2.4.41  httpd-2.4.41.tar.gz

[root@Server-01 httpd-2.4.41]# cd /data/tmpdir/httpd-2.4.41
# 查看并选择适合的编译参数
[root@Server-01 httpd-2.4.41]# ./configure -h | less
`configure' configures this package to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking ...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
                          [/usr/local/apache2]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
                          [PREFIX]
.......此处省略无数.......

[root@Server-01 httpd-2.4.41]# ./configure --prefix=/data/apps/apache24/ --enable-so --enable-ssl \
--enable-cgi --enable-rewrite --with-zlib --with-pcre  --enable-mpms-shared=all --with-mpm=prefork
......
# 以下为正常编译完成输出
config.status: executing default commands
configure: summary of build options:

    Server Version: 2.4.41
    Install prefix: /usr/local/apache24
    C compiler:     gcc -std=gnu99
    CFLAGS:           -pthread
    CPPFLAGS:        -DLINUX -D_REENTRANT -D_GNU_SOURCE
    LDFLAGS:
    LIBS:
    C preprocessor: gcc -E

[root@Server-01 httpd-2.4.41]# echo $?    # 完成编译后检查是否有报错
0

参数说明:
  --enable-so  启动模块动态装卸载
  --enable-ssl 编译ssl模块
  --enable-cgi 支持cgi机制(能够让静态web服务器能够解析动态请求的一个协议)
  --enable-rewrite  支持url重写     
  --with-zlib  支持zlib压缩     
  --with-pcre  支持正则表达式
  --enable-mpms-shared=all  以共享方式编译的模块
  --with-mpm=prefork   指明httpd的工作方式为prefork
  
  附:
  --with-apr= 指明依赖的apr所在目录
  --with-apr-util=  指明依赖的apr-util所在的目录

# 查看机器CPU核心数
[root@Server-01 httpd-2.4.41]# cat /proc/cpuinfo | grep "processor" | wc -l
4
[root@Server-01 httpd-2.4.41]# make -j 4 && make install
[root@Server-01 httpd-2.4.41]# cd /data/apps/apache24/
# apache目录结构
[root@Server-01 apache24]# tree -d ./
./
├── bin        # 启动文件存放目录
├── build       #  apache的安装参数存放目录,包括版本号等
├── cgi-bin      # 存放cgi的启动文件(cgi:连接数据库API的接口)
├── conf        # 存放apache配置文件
│   ├── extra      # 一些额外的配置文件,虚拟主机等
│   └── original    # 原始配置文件备份
│       └── extra
├── error        # 存放错误日志
│   └── include
├── htdocs        # 默认站点跟目录,存放主页文件
├── icons        # 图标提示文件
│   └── small
├── include       # include目录
│   └── include
├── logs        # 存放日志文件
├── man         # 手册
│   ├── man1
│   └── man8
├── manual        # 其他工具手册
│   ├── developer
│   ├── faq
│   ├── howto
│   ├── images
│   ├── misc
│   ├── mod
│   ├── platform
│   ├── programs
│   ├── rewrite
│   ├── ssl
│   ├── style
│   │   ├── css
│   │   ├── lang
│   │   ├── latex
│   │   ├── scripts
│   │   └── xsl
│   │       └── util
│   └── vhosts
└── modules        # 模块存放目录

说明:
bin目录为二进制程序存放位置,如启动脚本apachectl、httpd、htpasswd、ab(压力测试工具)等;
conf目录为配置文件存放位置
htdocs目录存放网页文件,默认里面有index.html;
logs目录存放了日志文件,除了日志文件,默认还有httpd运行的pid文件httpd.pid,这个建议修改到/var/run目录下(方便判断);
man目录为帮助文档路径;
modules存放了编译后的模块;

[root@Server-01 apache24]# bin/apachectl start
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using fe80::20c:29ff:fe19:1ffb. Set the 'ServerName' directive globally to suppress this message

# 修改配置文件
[root@Server-01 apache24]# vim conf/httpd.conf    
......
# 用户和组修改为apache
User apache
Group apache
......
#ServerName www.example.com:80
ServerName localhost:80    # 添加此项,取消'ServerName'提示
......

# 检测配置文件语法
[root@Server-01 apache24]# apachectl -t
Syntax OK

# 设置环境变量
[root@Server-01 apache24]# echo 'PATH=/usr/local/src/apache24/bin:$PATH' > /etc/profile.d/apache24.sh
[root@Server-01 apache24]# source /etc/profile.d/apache24.sh
[root@Server-01 apache24]# echo $PATH
/data/apps/apache24/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@Server-01 apache24]# ln -s /usr/include /data/apps/apache24/include

# 新建用户并设置目录权限
[root@Server-01 apache24]# useradd -r -M apache -s /sbin/nologin
[root@Server-01 apache24]# grep apache /etc/passwd
apache:x:997:996::/home/apache:/sbin/nologin
[root@Server-01 apache24]# chown -R apache:apache /data/apps/apache24
[root@Server-01 apache24]# ls -ld /data/apps/apache24
drwxr-xr-x. 14 apache apache 164 Jul  8 15:57 /data/apps/apache24

[root@Server-01 apache24]# apachectl restart
# 查看进程及端口
[root@Server-01 apache24]# ps -ef | grep http
root       1423      1  0 11:21 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1453   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1454   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1455   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1456   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
apache     1457   1423  0 11:34 ?        00:00:00 /data/apps/apache24//bin/httpd -k start
root       1459    983  0 11:35 pts/0    00:00:00 grep --color=auto http
[root@Server-01 apache24]# netstat -nutpl | grep http
tcp6       0      0 :::80                   :::*                    LISTEN      1423/httpd

# 测试结果
[root@Server-01 apache24]# curl 172.16.70.37
<html><body><h1>It works!</h1></body></html>

注:或在浏览器输入http服务所在的IP

 第二部分:设置虚拟主机。

在一个Apache服务器上可以配置多个虚拟主机,实现一个服务器提供多站点服务,其实就是访问同一个服务器上的不同目录。Apache虚拟主机配置有3种方法:基于端口配置、基于域名配置和基于IP配置

[root@Server-01 apache24]# pwd
/data/apps/apache24
[root@Server-01 apache24]# ls
bin  build  cgi-bin  conf  error  htdocs  icons  include  logs  man  manual  modules

# 创建网站目录内容
[root@Server-01 apache24]# for i in {1..3};do mkdir -pv /data/web/www$i; echo "www$i: Mysite $i" > /data/web/www$i/index.html;done
[root@Server-01 apache24]# tree /data/web/
/data/web/
├── www1
│   └── index.html
├── www2
│   └── index.html
└── www3
    └── index.html
[root@Server-01 apache24]# cat /data/web/www*/*
www1: Mysite 1
www2: Mysite 2
www3: Mysite 3

# 修改主配置文件
[root@Server-01 apache24]# vim conf/httpd.conf
......
Listen 80
Listen 81    # 添加所需要的端口号
......
# Virtual hosts
Include conf/extra/httpd-vhosts.conf  # 去掉注释'#'
....


[root@Server-01 apache24]# apachectl -t Syntax OK
[root@Server-01 apache24]# apachectl restart
[root@Server-01 apache24]# netstat -ntpul | grep http
tcp6       0      0 :::80                   :::*                    LISTEN      1423/httpd
tcp6       0      0 :::81                   :::*                    LISTEN      1423/httpd

# 查看配置加载过程
[root@Server-01 apache24]# apachectl -S
VirtualHost configuration:
172.16.70.37:80        www1.wencheng.com (/data/apps/apache24/conf/extra/httpd-vhosts.conf:25)
172.16.70.37:81        www2.wencheng.com (/data/apps/apache24/conf/extra/httpd-vhosts.conf:34)
ServerRoot: "/data/apps/apache24/"
Main DocumentRoot: "/data/apps/apache24/htdocs"
Main ErrorLog: "/data/apps/apache24/logs/error_log"
Mutex default: dir="/data/apps/apache24/logs/" mechanism=default
Mutex mpm-accept: using_defaults
PidFile: "/data/apps/apache24/logs/httpd.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="apache" id=997
Group: name="apache" id=996
  • 基于端口(PORT)
# 修改虚拟主机配置文件
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# 末行添加以下内容
# PORT
<VirtualHost 172.16.70.37:80>
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" common
  <Directory "/data/web/www1">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost 172.16.70.37:81>
    DocumentRoot "/data/web/www2"
    ErrorLog "logs/www2-error_log"
    CustomLog "logs/www2-access_log" common
  <Directory "/data/web/www2">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>


[root@Server-01 apache24]# apachectl -t 
Syntax OK 
[root@Server-01 apache24]# apachectl restart

# 检测结果
[root@Server-01 apache24]# curl 172.16.70.37
www1: Mysite 1
[root@Server-01 apache24]# curl 172.16.70.37:80
www1: Mysite 1
[root@Server-01 apache24]# curl 172.16.70.37:81
www2: Mysite 2
  •  基于域名(FQDN)
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# 末行新增以下内容
# FQDN
<VirtualHost *:80>
    ServerName www1.wencheng.com
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" common
  <Directory "/data/web/www1">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName www3.wencheng.com
    DocumentRoot "/data/web/www3"
    ErrorLog "logs/www3-error_log"
    CustomLog "logs/www3-access_log" common
  <Directory "/data/web/www3">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

# 添加域名解析
[root@Server-01 apache24]# echo '172.16.70.37 www1.wencheng.com www3.wencheng.com' >> /etc/hosts

[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl restart

# 检测结果
[root@Server-01 apache24]# curl www1.wencheng.com
www1: Mysite 1
[root@Server-01 apache24]# curl www3.wencheng.com
www3: Mysite 3
  • 基于地址(IP)
# 添加另一个IP地址
[root@Server-01 apache24]# ip addr add 172.16.70.38/24 dev ens33
[root@Server-01 apache24]# ip addr | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 172.16.70.37/24 brd 172.16.70.255 scope global noprefixroute dynamic ens33
    inet 172.16.70.38/24 scope global secondary ens33    # 添加的IP

[root@Server-01 apache24]# ping 172.16.70.38 -c4    # 通讯正常
PING 172.16.70.38 (172.16.70.38) 56(84) bytes of data.
64 bytes from 172.16.70.38: icmp_seq=1 ttl=64 time=0.034 ms
64 bytes from 172.16.70.38: icmp_seq=2 ttl=64 time=0.050 ms

[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# 末行新增
# IP
<VirtualHost 172.16.70.37:80>
    ServerName www2.wencheng.com
    DocumentRoot "/data/web/www2"
    ErrorLog "logs/www2-error_log"
    CustomLog "logs/www2-access_log" common
  <Directory "/data/web/www2">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

<VirtualHost 172.16.70.38:80>
    ServerName www3.wencheng.com
    DocumentRoot "/data/web/www3"
    ErrorLog "logs/www3-error_log"
    CustomLog "logs/www3-access_log" common
  <Directory "/data/web/www3">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>


[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl restart

# 检测结果
[root@Server-01 apache24]# curl 172.16.70.37
www2: Mysite 2
[root@Server-01 apache24]# curl 172.16.70.38
www3: Mysite 3

第三部分:Apache Web认证方式

  • 基于用户认证。
[root@Server-01 apache24]# pwd
/data/apps/apache24

# 创建认证用户账号文件,并添加用户
[root@Server-01 apache24]# htpasswd -cb /data/apps/apache24/conf/.htpasswd user1 user1
Adding password for user user1
[root@Server-01 apache24]# htpasswd -b /data/apps/apache24/conf/.htpasswd user2 user2
Adding password for user user2
[root@Server-01 apache24]# cat /data/apps/apache24/conf/.htpasswd
user1:$apr1$670zn8qW$R6BsrSdUZGYIKzYRl2opd.
user2:$apr1$k3FCnqKK$qzm4fqkIXINWX43kKAToA/

# 创建测试网页
[root@Server-01 apache24]# echo "<h1>User authentication</h1>" > /data/web/www1/admin.html

# 虚拟主机配置文件
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
......
# FQDN
<VirtualHost *:80>
    ServerName www1.wencheng.com
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" combined
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    Require all granted
  </Directory>
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "Please enter your name & passwd"
    AuthUserFile "/data/apps/apache24/conf/.htpasswd"
    Require valid-user
  </Directory>
</VirtualHost>


[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl graceful
  • 检测测试结果。

  WIN10的hosts文件添加解析:将’172.16.70.37 www1.wencheng.com www2.wencheng.com www3.wencheng.com’添加到C:\Windows\System32\drivers\etc\hosts

 

  • 基于组认证
# 接用户认证配置基础,再添加user3,uer4用户
[root@Server-01 apache24]# htpasswd -b /data/apps/apache24/conf/.htpasswd user3 user3
Adding password for user user3
[root@Server-01 apache24]# htpasswd -b /data/apps/apache24/conf/.htpasswd user4 user4
Adding password for user user4
[root@Server-01 apache24]#
[root@Server-01 apache24]# cat /data/apps/apache24/conf/.htpasswd
user1:$apr1$670zn8qW$R6BsrSdUZGYIKzYRl2opd.
user2:$apr1$k3FCnqKK$qzm4fqkIXINWX43kKAToA/
user3:$apr1$x6J3/DAj$XMP3eMjDC83Yk3aT4Yp.u0
user4:$apr1$CV4vuoTu$KN.Ha.IB41Aq0AGZVfw6E0

# 创建组文件
[root@Server-01 apache24]# echo "admins:user3 user4" > /data/apps/apache24/conf/.htgroup
[root@Server-01 apache24]# cat /data/apps/apache24/conf/.htgroup
admins:user3 user4

# 创建测试网页
[root@Server-01 apache24]# echo '<h1>Group user authentication</h1>' > /data/web/www1/admin.html

# 虚拟主机配置文件
[root@Server-01 apache24]# vim conf/extra/httpd-vhosts.conf
# FQDN
<VirtualHost *:80>
    ServerName www1.wencheng.com
    DocumentRoot "/data/web/www1"
    ErrorLog "logs/www1-error_log"
    CustomLog "logs/www1-access_log" combined
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    Require all granted
  </Directory>
  <Directory "/data/web/www1">
    Options None
    AllowOverride None
    AuthType Basic
    AuthName "Please enter your name & passwd"
    AuthUserFile "/data/apps/apache24/conf/.htpasswd"
    AuthGroupFile "/data/apps/apache24/conf/.htgroup"
    Require valid-user
    Require group admins
  </Directory>
</VirtualHost>

[root@Server-01 apache24]# apachectl -t
Syntax OK
[root@Server-01 apache24]# apachectl graceful
  •  检测测试结果。

:默认配置文件解析。

[root@Server-01 apache24]# grep -Ev '#|^$' conf/httpd.conf
# 服务安装路径
ServerRoot "/data/apps/apache24/"

# 监听端口
Listen 80

# 启动的模块
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
<IfModule !mpm_prefork_module>
</IfModule>
<IfModule mpm_prefork_module>
</IfModule>
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so

# 运行httpd的用户和组
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>

# 管理员邮箱(若服务出来问题,会给管理员发邮件,提前是服务能发邮件)
ServerAdmin [email protected]

# 根目录权限
<Directory />
    AllowOverride none
    Require all denied
</Directory>

# 网页文件存放目录
DocumentRoot "/data/apps/apache24//htdocs" 

# 目录权限
<Directory "/data/apps/apache24//htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# 默认访问主页
<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

# 控制不让web用户查看.htpasswd和.haccess两文件访问权限
<Files ".ht*">
    Require all denied
</Files>

# 错误日志存放位置
ErrorLog "logs/error_log"

# 日志级别
LogLevel warn

# 定义日志格式
<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>
    CustomLog "logs/access_log" common
</IfModule>

# CGI模块别名管理
<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/data/apps/apache24//cgi-bin/"
</IfModule>

# CGI模块别名
<Directory "/data/apps/apache24//cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

# 取消旧代理模块
<IfModule headers_module>
    RequestHeader unset Proxy early
</IfModule>

# 支持的文件
<IfModule mime_module>
    TypesConfig conf/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

# 启用的代理模块
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>

# ssl模块
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>