• 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浏览器地址栏输入访问地址http://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浏览器地址栏输入访问地址http://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协议的版本号。
      • 请求头:用于描述客户端请求哪台主机及其端口,以及客户端的一些环境信息等。
      • 空行:空行就是 (POST请求时候有)。
      • 请求正文:当使用POST等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中(GET方式是保存在url地址后面,不会放到这里)
        • 请求方法有哪些种呢?
            GET: 完整请求一个资源 (常用)
            HEAD: 仅请求响应首部
            POST:提交表单  (常用)
            PUT: (webdav) 上传文件(但是浏览器不支持该方法)
            DELETE:(webdav) 删除
            OPTIONS:返回请求的资源所支持的方法的方法
            TRACE: 追求一个资源请求中间所经过的代理(该方法不能由浏览器发出)
    • (6) Web服务器响应并读取浏览器的请求信息,然后返回一条HTTP响应报文。
      • HTTP响应也由三部分组成:状态行,响应头,空格,消息体
      • 状态行包括:协议版本、状态码、状态码描述
      • 响应头:响应头用于描述服务器的基本信息,以及客户端如何处理数据
      • 空格:CRLF(即 )分割
      • 消息体:服务器返回给客户端的数据
        • 状态码:状态码用于表示服务器对请求的处理结果。
            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源码编译安装指定版本。

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

    sohu站点下载:http://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 http://mirrors.sohu.com/apache/httpd-2.4.41.tar.gz
    [root@Server-01 tmpdir]# curl -O http://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:WindowsSystem32driversetchosts

     

    • 基于组认证
    # 接用户认证配置基础,再添加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 you@example.com
    
    # 根目录权限
    <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>
    
    ********************如果您认为这篇文章还不错或者有所收获,可以点击右下角的【推荐】/【赞助】按钮,因为您的支持是我继续写作,分享的最大动力!********************
  • 相关阅读:
    九种常用排序的性能分析总结
    C语言输出格式总结
    线程安全的单例模式
    反射原理
    二进制的计算(计算机为什么采用补码存储数据)
    java程序员必须会的技能
    09网易校园招聘笔试题
    Spring获取ApplicationContext方式,和读取配置文件获取bean的几种方式
    【转】策略与机制分离
    VM PowerCli的简单安装和使用学习
  • 原文地址:https://www.cnblogs.com/zhangwencheng/p/14977918.html
Copyright © 2020-2023  润新知