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协议的版本号。
    • 请求头:用于描述客户端请求哪台主机及其端口,以及客户端的一些环境信息等。
    • 空行:空行就是\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源码编译安装指定版本。

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

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

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

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# 准备环境
[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配置

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
[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)

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
28
29
30
31
32
33
34
35
36
37
38
39
# 修改虚拟主机配置文件
[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)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
[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)

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 添加另一个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认证方式

基于用户认证

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
[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

 

基于组认证

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 接用户认证配置基础,再添加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
  •  检测测试结果。

:默认配置文件解析。

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
[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>

 

posted @   讲文张字  阅读(758)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
返回顶部
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏