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>