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初始系统源码编译安装操作。
# 准备环境
[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:\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 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>
Linux下Apache(HTTP)基础知识梳理-运维笔记的更多相关文章
- python基础知识小结-运维笔记
接触python已有一段时间了,下面针对python基础知识的使用做一完整梳理:1)避免‘\n’等特殊字符的两种方式: a)利用转义字符‘\’ b)利用原始字符‘r’ print r'c:\now' ...
- ELK基础架构解说-运维笔记
一.ELK日志分析工具介绍1) Elasticsearch1.1) Elasticsearch介绍ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索 ...
- Centos7下关于系统用户密码规则-运维笔记
针对Centos7下的系统用户的密码规则复杂度的设置,处于安全考虑,说明如下: 一.设置密码规则 1)密码长度.有效期 /etc/login.defs文件是当创建用户时的一些规划,比如创建用户时,是否 ...
- linux下的cron定时任务知识梳理
1 cron定时任务 1.1 cron介绍 为什么需要cron定时任务? 1)cron服务在安装完Linux系统后就默认就存在,主要用来定期执行命令或定期执行指定的应用程序; 2)cron服务默认情况 ...
- Centos6下关于系统用户密码规则-运维笔记
随着linux使用的普遍,对于linux用户以及系统的安全要求越来越高,而用户密码复杂程度是系统安全性高低的首要体现.因此如何对linux下用户的密码进行规则限制,以保证用户必须使用复杂的密码,杜绝用 ...
- Linux系统硬链接和软链接说明 - 运维笔记
在linux系统中有种文件是链接文件,可以用来解决文件的共享使用.链接的方式可以分为两种,一种是硬链接(Hard Link),另一种是软链接或者也称为符号链接(Symbolic Link).先来查看下 ...
- Linux基础知识梳理
Linux基础知识梳理 Linux内核最初只是由芬兰人林纳斯?托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的.Linux是一套免费使用和自由传播的类Unix操作系统,是 ...
- MySQL 基础知识梳理
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装, ...
- [SQL] SQL 基础知识梳理(一)- 数据库与 SQL
SQL 基础知识梳理(一)- 数据库与 SQL [博主]反骨仔 [原文地址]http://www.cnblogs.com/liqingwen/p/5902856.html 目录 What's 数据库 ...
随机推荐
- JavaScript 中精度问题以及解决方案
JavaScript 中的数字按照 IEEE 754 的标准,使用 64 位双精度浮点型来表示.其中符号位 S,指数位 E,尾数位M分别占了 1,11,52 位,并且在 ES5 规范 中指出了指数位E ...
- 【逆向实战】ES文件浏览器未授权访问漏洞(CVE-2019-6447)具体分析及利用
/作者:Kali_MG1937 CSDN博客号:ALDYS4 QQ:3496925334 未经许可,禁止转载/ 漏洞简介 CVE-2019-6447是Android端上的一个知名软件:ES文件浏览器的 ...
- 小程序微信支付(UNIAPP+第三方SDK:binarywang)
小程序支付流程图说明(UNIAPP+第三方SDK:binarywang) 说明:小程序为UNI-APP开发,使用的第三方微信支付SDK为binarywang提供的,此SDK对微信公众号.小程序.微信各 ...
- 小目标增强(Augmentation for small object)
小物体检测的增强 摘要:在近些年来,目标检测已经有了长足的进步.尽管有很大改进,但是在小目标和大目标检测性能方面还是有巨大的差距.我们在具有挑战性的数据集MS-COCO上分析了目前性能最好的模型Mas ...
- Linux集群环境下NTP服务器时间同步
NTP介绍 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议.它的用途是把计算机的时钟同步到世界协调时UTC(Universal Time ...
- ubuntu开机卡在/dev/sda* clean
问题描述: ①Ubuntu通过再生龙从一台笔记本还原到另外一台笔记本(硬盘到硬盘),开机后卡在自检界面: ②备份前的笔记本为17年发布的笔记本,还原后的笔记本为2020款发布的笔记本 从网上搜了一大篇 ...
- 如何管理MongoDB的用户和权限
管理用户的创建及使用 创建用户的函数是db.createUser({...}),创建用户时通常需要为该用户添加权限,如read.readWrite权限. 可添加的权限以及说明: 权限 作用 read ...
- 全局获取HttpContext
全局获取HttpContext 在我们平常开发中会有这样的需求,我们的Service业务层需要获取请求上下文中的用户信息,一般我们从控制器参数传递过来.如果你觉得这样就可以了,请您关闭文章. 场景 但 ...
- redis-list实现
Redis 数据结构---链表 Redis的list底层实现使用的不是数组而是链表的数据结构 叫listnode 是一个双向链表 ListNode{ Struct listNode *prev / ...
- 在docker中使用nginx部署前端项目
前言 部署了三个nginx用于前端项目, 并使用keepalived部署好热备, 所以总共有5个nginx 创建好nginx的文件和配置 根据上面的指令创建好目录 mkdir /home/web/ng ...