apache详细讲解(apache介绍+apache配置实验+apache实现https网站)

发布于:2025-09-11 ⋅ 阅读:(13) ⋅ 点赞:(0)

1.apache HTTP server介绍

httpd项目地址:

https://httpd.apache.org/  

在Apache2中有三种工作模式,使用者可以根据不同的业务场景来进行选择

(1)prefork模式

prefork模式是一种老而稳的模式:

一个主进程管理者多个子进程,每个子进程单独处理用户请求,它比较占内存,但稳定,能够设置进程数量上下限,适合访问量不大的场景(Liunx下最多同时处理1024个连接)

优点:工作稳定

缺点:每个用户请求需要对应开启一个线程,占用资源较多,并发性差,不适用于高并发场景

(2)worker模式

一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程来处理请求,当线程不够用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发

优点:相比prefork模型,其占用的内存较少,可以同时处理更多的请求

缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放,如果过多的线程被这样占据,也会导致再高并发场景下的无服务线程可用

(3)event模型

Apache2的event模型是2012年2.4.x版本新增的稳定模式,基于事件驱动(epoll),每个进程响应多个请求,类似于worker模式,但解决了keepalive时线程空挂浪费资源的问题,用专门线程管理这类线程,高并发下处理能力更强

优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放

缺点:没有线程完全控制

查看使用的哪种模式

[root@apache ~]# httpd -M | grep mpm
 mpm_event_module (shared)

2.apache的安装和使用

2.1apache配置文件注意事项

a.Apache2的配置主要分为三部分,分别是全局配置,虚拟主机配置,模块配置,这些配置项目分散在不同的目录和文件中,在主配置文件中以文件包含的形式引用它们

b.配置文件中的每一行包含一个配置指令,并指定值,配置指令不区分大小写,但值区分大小写

c.以#开头的行是注释行,注释不能出现在指令的后边,空白行和指令前的空白字符将被忽略,因此可用采用缩进以保持配置层次的清晰

2.2安装apache及用法

2.2.1安装apache

[root@apache ~]# yum install httpd -y

2.2.2查看版本

[root@apache ~]# httpd -v
Server version: Apache/2.4.53 (Red Hat Enterprise Linux)
Server built:   Jul 20 2022 00:00:00

2.2.3检测配置文件语法,是否正确

[root@apache ~]# httpd -t
Syntax OK

2.2.4查看apache的web服务配置文件

[root@apache ~]# tree -L 1 /etc/httpd/
/etc/httpd/
├── conf  #主配置文件所在目录
├── conf.d  #子配置文件所在目录
├── conf.modules.d   
├── logs -> ../../var/log/httpd  #日志文件所在目录
├── modules -> ../../usr/lib64/httpd/modules
├── run -> /run/httpd
└── state -> ../../var/lib/httpd

# ../表示上一级目录的位置
比如说../../var/log/httpd
第一层表示在httpd上一级目录
第二层表示在etc上一级目录
所以httpd的日志文件所在目录为/var/log/httpd

2.2.5主配置文件说明

#过滤掉所有以#开头的注释行好所有空白行
[root@apache ~]# grep  -Ev "^.*#|^$" /etc/httpd/conf/httpd.conf
ServerRoot "/etc/httpd"  # http服务的顶级目录为/etc/httpd
Listen 80  #监听80
Include conf.modules.d/*.conf  #包括/etc/httpd/conf.modules.d/*.conf的所有文件
User apache  #服务的用户
Group apache  #服务的组
ServerAdmin root@localhost  #当前服务的管理员
<Directory />   #目录权限设置
    AllowOverride none  #此处权限不可被.htaccess文件权限参数覆盖
    Require all denied  #拒绝访问根目录
</Directory>
DocumentRoot "/var/www/html"  #网页文件存放的目录
<Directory "/var/www">  #目录权限限定
    AllowOverride None
    Require all granted
</Directory>
<Directory "/var/www/html">
    Options Indexes FollowSymLinks  #索引,跟踪软链接
    AllowOverride None
    Require all granted
</Directory>
<IfModule dir_module>  #全局默认提供的页面文件为index.html
    DirectoryIndex index.html
</IfModule>
<Files ".ht*">  #禁止访问所有以 .ht开头的文件
    Require all denied
</Files>
ErrorLog "logs/error_log"  #错误日志
LogLevel warn   #只记录警告(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" combined  #使用combined的日志格式记录日志
</IfModule>
<IfModule alias_module>  #早期的动态网站文件路径
    ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">  #权限设定
    AllowOverride None
    Options None
    Require all granted
</Directory>
<IfModule mime_module>  #MIME类型配置
    TypesConfig /etc/mime.types
    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
    AddType text/html .shtml
    AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8  #Apache 默认的响应字符编码为UTF-8
<IfModule mime_magic_module>  #定义使用通过文件内容识别文件mime类型
    MIMEMagicFile conf/magic
</IfModule>  
EnableSendfile on  #启用sendfile系统调用,实现零拷贝文件传输
IncludeOptional conf.d/*.conf  #加载 conf.d/目录下所有 .conf结尾的文件作为额外配置

2.2.6启动服务并访问默认页面

a.关闭防火墙和SELinux
[root@apache ~]# systemctl disable --now firewalld
[root@apache ~]# setenforce  0
setenforce: SELinux is disabled
b.修改默认index.html页面文件
[root@apache ~]# echo jeams > /var/www/html/index.html
c.重启httpd并查看端口号
[root@apache ~]# systemctl restart httpd
[root@apache ~]# ss -lntup | grep httpd
tcp   LISTEN 0      511                *:80               *:*    users:(("httpd",pid=32197,fd=4),("httpd",pid=32196,fd=4),("httpd",pid=32195,fd=4),("httpd",pid=32193,fd=4))
d.访问网站
第一种:直接查看网站内容
[root@apache ~]#  curl  192.168.75.184
jeams
第二种:仅返回服务器的响应头
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 07:06:39 GMT
Server: Apache/2.4.53 (Red Hat Enterprise Linux)
Last-Modified: Tue, 09 Sep 2025 07:03:22 GMT
ETag: "c-63e58e64fab29"
Accept-Ranges: bytes
Content-Length: 6
Content-Type: text/html; charset=UTF-8

2.2.7响应时不显示版本号

a.向apache服务器的主配置文件的末尾添加一行内容ServerTokens Prod(隐藏服务器的详细信息)
[root@apache ~]# echo "ServerTokens Prod" >> /etc/httpd/conf/httpd.conf
b.检测语法并重启httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
c.查看
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 07:16:26 GMT
Server: Apache      #此处不显示服务端apache具体版本号信息
Last-Modified: Tue, 09 Sep 2025 07:03:22 GMT
ETag: "c-63e58e64fab29"
Accept-Ranges: bytes
Content-Length: 6
Content-Type: text/html; charset=UTF-8

注意: 添加下面一条命令到配置文件,重启速度会特别快

[root@apache ~]# echo "ServerName 0.0.0.0" >> /etc/httpd/conf/httpd.conf

3.apache配置和使用

3.1常用全局配置

3.1.1修改全局默认页面所在目录和文件名

a.编辑apache主配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"
<directory /www>
        allowoverride none
        require all granted
</directory>
<IfModule dir_module>
    DirectoryIndex index.html index default.html
</IfModule>

#<directory /www>   设置 /www 目录的访问权限
#allowoverride none 禁止该目录下的.htaccess文件覆盖主配置
#require all granted 允许所有客户端访问该目录下的内容
#<IfModule dir_module> 当启用目录模块时,定义访问目录时默认加载的页面顺序:
优先加载index.html,如果没有则找index,再没有就用default.html

注意:测试时,我们要从下往上去测试,否则会测试失败,只能看到index.html里面的内容

b.创建/www目录
[root@apache ~]# mkdir /www
c.检测并重启httpd
[root@apache www]# httpd -t
Syntax OK
[root@apache www]# systemctl restart httpd
d.测试
default.html
[root@apache www]# echo "jeams" > /www/default.html
[root@apache ~]# curl  192.168.75.184
jeams
index
[root@apache www]# echo "jeam" > /www/index
[root@apache ~]# curl  192.168.75.184
jeam
index.html
[root@apache www]# echo "jeams6" > /www/index.html
[root@apache ~]# curl  192.168.75.184
jeams6

3.1.2配置监听端口和IP

a.添加监听端口81
[root@apache ~]# echo "listen 0.0.0.0:81" >> /etc/httpd/conf/httpd.conf 
b.检测并重启httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
c.查看端口号
[root@apache ~]# ss -lntup | grep httpd
tcp   LISTEN 0      511          0.0.0.0:81         0.0.0.0:*    users:(("httpd",pid=34228,fd=5),("httpd",pid=34227,fd=5),("httpd",pid=34226,fd=5),("httpd",pid=34223,fd=5))
tcp   LISTEN 0      511                *:80               *:*    users:(("httpd",pid=34228,fd=4),("httpd",pid=34227,fd=4),("httpd",pid=34226,fd=4),("httpd",pid=34223,fd=4))
d.测试
[root@apache ~]# curl 192.168.75.184:81
jeams6
e.添加IP地址
[root@apache ~]# ip addr add 192.168.75.185/24 dev eth0
f.检测并重启httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
g.查看IP
[root@apache ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:b7:fa:01 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.75.184/24 brd 192.168.75.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.75.185/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::c80e:1840:7e94:5d13/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
h.测试
[root@apache ~]# curl 192.168.75.185:81
jeams

3.1.3配置文件压缩

启用数据压缩功能能够减少网络IO的数据量,提高服务器的网络吞吐能力,配置文件默认已开启数据压缩

a.查看压缩模块是否已经加载
[root@apache ~]# httpd -M | grep deflate
 deflate_module (shared)
b.配置压缩规则
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
<IfModule mod_deflate.c>
    DeflateCompressionLevel 6
    AddOutputFilterByType DEFLATE text/html text/plain text/css application/json
</IfModule>

#<IfModule mod_deflate.c> 检查服务器是否加载了mod_deflate压缩模块
#DeflateCompressionLevel 6设置压缩级别为6(范围1-9,级别越高压缩率越高,但消耗服务器资源也越多,6是比较平衡的选择)
#AddOutputFilterByType DEFLATE text/html text/plain text/css application/json 指定对哪些类型的文件进行压缩,这里包含了 HTML、纯文本、CSS、JSON 等常见文本类资源
c.检测并重启httpd
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
d.测试
查看被压缩前的大小
[root@apache ~]# ll /www/
总用量 2958
-rw-r--r-- 1 root root  389  9月  9 04:06 china
-rw-r--r-- 1 root root  1658  9月  9 04:06 jeams
-rw-r--r-- 1 root root  456  9月  9 04:50 jeams.html
-rw-r--r-- 1 root root  455  9月  9 04:50 ok.html
压缩后的大小
[root@apache ~]# curl --compressed -I 192.168.75.184/jeams.html
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 09:05:07 GMT
Server: Apache
Last-Modified: Tue, 09 Sep 2025 08:50:38 GMT
ETag: "4-63e5a65ef230e"
Accept-Ranges: bytes
Content-Length: 350    #被压缩的大小
Content-Type: text/html; charset=UTF-8

3.1.4配置持久连接

持久连接指的是建立连接后,每个资源获取完后不会立即断开连接,而是保持一段时间后断开

a.编辑配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf
KeepAlive on  #开启持久连接
MaxKeepAliveRequests 100  #在一个持久连接内,最多可以累计处理100次请求
KeepAliveTimeout 10  #持久连接保持时间
b.检测并重启
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
c.安装测试软件
[root@apache ~]# yum install telnet -y

#telnet是一个用于远程登录和测试网络连接的工具,安装后可以用它测试服务器的端口是否开放
d.测试
输入测试内容
[root@apache ~]# echo 666 > /www/jeams.html
[root@apache ~]# echo 888 > /www/ok.html
开始测试
[root@apache ~]# telnet 192.168.75.184 80
Trying 192.168.75.184...
Connected to 192.168.75.184.
Escape character is '^]'.
GET /jeams.html HTTP/1.1    #输入请求行信息
host: 192.168.75.184        #输入请求头信息
                            #这个空格是结束行,必须要敲!!!
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 08:58:24 GMT
Server: Apache
Last-Modified: Tue, 09 Sep 2025 08:50:38 GMT
ETag: "4-63e5a65ef230e"
Accept-Ranges: bytes
Content-Length: 4
Content-Type: text/html; charset=UTF-8

666
GET /ok.html HTTP/1.1      #在持久连接时间内继续请求
host: 192.168.75.184       #第一个资源请求完成,不会断开,可以继续请求第二个资源
                           #这个空格是结束行,必须要敲!!!
HTTP/1.1 200 OK
Date: Tue, 09 Sep 2025 08:58:29 GMT
Server: Apache
Last-Modified: Tue, 09 Sep 2025 08:50:49 GMT
ETag: "4-63e5a6696acd7"
Accept-Ranges: bytes
Content-Length: 4
Content-Type: text/html; charset=UTF-8

888
Connection closed by foreign host.  #时间到达后自动断开

3.1.5定义路径别名

alias指令用于在URL和文件系统之间实现映射,使不在DocumentRoot目录下的内容也能成为项目的一部分

a.编辑配置文件
[root@apache ~]# vim /etc/httpd/conf/httpd.conf 
alias /test /alias/alias-test    
<directory /alias/alias-test>
    allowoverride none
    require all granted
</directory> 

#alias /test /alias/alias-test  定义一个别名,当访问http://服务器地址/test时,Apache会转到/alias/alias-test目录下查找资源
#allowoverride none   禁用该目录的.htaccess文件
#require all granted  允许所有客户端访问该目录下的内容
b.创建目录并输入内容
[root@apache ~]# mkdir -p /alias/alias-test
[root@apache ~]# echo "hello,jeams" > /alias/alias-test/index.html
c.检测并重启
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
d.测试
[root@apache ~]# curl 192.168.75.184/test/
hello,jeams

3.2访问资源控制

3.2.1编辑配置文件

[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"
<directory /www>
		DirectoryIndex disabled  #禁用默认的索引文件index.html
        options indexes followsymlinks  #indexes表示显示目录内容列表,followsymlinks表示追踪软链接
        allowoverride none  #none表示不允许读取.htaccess文件中设置的options值,实践中不要使用.htaccess文件,会降低性能
        require all granted
</directory>

3.2.2将默认的配置文件不生效并创建软链接

#禁用Apache默认欢迎页面的配置文件
[root@apache ~]# mv /etc/httpd/conf.d/welcome.conf {,.bak}
#创建软链接
[root@apache ~]# ln -s /var/www/html/index.html /www/link.html

3.2.3检测并重启

[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd

3.2.4测试

a.Linux上测试
[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Wed, 10 Sep 2025 02:13:21 GMT
Server: Apache
Content-Type: text/html;charset=ISO-8859-1
b.Windows上测试

3.2.5控制特定主机访问

a.不允许192.168.75.1主机访问

编辑配置文件

[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"           #指定Apache的网站根目录为/www
<directory /www> 
        DirectoryIndex disabled #禁用默认首页文件
        options indexes followsymlinks #在目录下没有默认首页且没有禁用目录索引时会显示目录内文件列表
        allowoverride none  #禁用该目录下的 .htaccess 文件
        <requireall>
                require all granted  #允许所有
                require not ip 192.168.75.1 #拒绝该主机
        </requireall>
</directory>

检测并重启

[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd

测试

Linux端:

[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 200 OK
Date: Wed, 10 Sep 2025 02:14:14 GMT
Server: Apache
Content-Type: text/html;charset=ISO-8859-1

Windows端:

b.允许192.168.75.1主机访问

编辑配置文件

[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"    #指定Apache网站根目录为/www
<directory /www>
        DirectoryIndex disabled #禁用默认首页文件
        options indexes followsymlinks #在目录下没有默认首页且没有禁用目录索引时会显示目录内文件列表
        allowoverride none  #禁用该目录下的 .htaccess 文件
        <requireany>
                require all denied  #拒绝所有
                require ip 192.168.75.1  #允许该主机访问
        </requireany>
</directory>

测试重启

[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd

测试

Liunx端:

[root@apache ~]# curl -I 192.168.75.184
HTTP/1.1 403 Forbidden
Date: Wed, 10 Sep 2025 02:15:18 GMT
Server: Apache
Content-Type: text/html; charset=iso-8859-1

Windows端:

3.3访问日志配置

3.3.1编辑配置文件

[root@apache ~]# vim /etc/httpd/conf/httpd.conf
DocumentRoot "/www"
<directory /www>
        DirectoryIndex disabled #禁用默认首页文件
        options indexes followsymlinks #在目录下没有默认首页且没有禁用目录索引时会显示目录内文件列表
        allowoverride none  #禁用该目录下的 .htaccess 文件
        require all granted #允许所有客户端登录
</directory>
LogFormat "%h %l %u test-format %{user-agent}i" test-format  #配置自定义日志格式
customlog /http-log/access.log test-format  #使用自定义日志

3.3.2创建目录

[root@apache ~]# mkdir /http-log/

3.3.3检测并重启

[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd

3.3.4测试

[root@apache ~]# cat /http-log/access.log 
192.168.75.184 - - test-format curl/7.76.1

3.4虚拟主机配置

apache服务支持在一台物理服务器上配置多个网站,我们可以通过虚拟主机配置来实现该功能

apache服务中配置了虚拟主机,还需要在DNS解析中添加域名解析,将域名指向apache服务器所在的IP地址

DNS解析负责将域名解析到apache服务器上,虚拟主机配置负责区分不同的网站,将不同点分域名与内容分别对应起来

多虚拟主机的实现方式:

基于端口实现:用不同的端口标识不同的虚拟主机

基于IP实现:用不同的IP地址标识不同的虚拟主机

基于域名实现:用不同的域名标识不同的虚拟主机

3.4.1基于端口实现

a.编辑配置文件
[root@apache ~]# vim /etc/httpd/conf.d/port.conf 
<Directory /virtualhost>
Allowoverride none           #禁用该目录下.htaccess文件的作用
Require all granted          #允许所有客户端访问该目录
</Directory>
<VirtualHost 192.168.75.185:80>
DocumentRoot /virtualhost/port/80    #存放网页文件的路径
ServerName 192.168.75.185            #绑定的IP
</VirtualHost>
Listen 888
<VirtualHost 192.168.75.185:888>
DocumentRoot /virtualhost/port/888   #存放网页文件的路径
ServerName 192.168.75.185            #绑定的IP
</VirtualHost>
b.创建目录并往不同端口里面写内容
[root@apache ~]# mkdir -p /virtualhost/port/{80,888}
[root@apache ~]# echo "I like you" > /virtualhost/port/80/index.html
[root@apache ~]# echo "you is my girl" > /virtualhost/port/888/index.html
c.创建临时IP
[root@apache ~]# ip addr add 192.168.75.185/24 dev eth0
[root@apache ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:b7:fa:01 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.75.184/24 brd 192.168.75.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.75.185/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::c80e:1840:7e94:5d13/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
d.检测并重启
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
e.测试
80端口

888端口

3.4.2基于IP实现

a.编辑配置文件
[root@apache ~]# vim /etc/httpd/conf.d/ip.conf 
<Directory /virtualhost>
 Allowoverride none           #禁用该目录下.htaccess文件的作用
 Require all granted          #允许所有客户端访问该目录
</Directory>
<VirtualHost 192.168.75.186:80>
DocumentRoot /virtualhost/ip/186   #存放该IP对应的网页文件
ServerName 192.168.75.186          #绑定的IP
</VirtualHost>
<VirtualHost 192.168.75.187:80>
DocumentRoot /virtualhost/ip/187   #存放该IP对应的网页文件
ServerName 192.168.75.187          #绑定的IP
</VirtualHost>
b.创建目录并编写内容到文件里
[root@apache ~]# mkdir -p /virtualhost/ip/{186,187}
[root@apache ~]# echo "jeams 192.168.75.186" > /virtualhost/ip/186/index.html
[root@apache ~]# echo "jeams 192.168.75.187" > /virtualhost/ip/187/index.html
c.添加临时IP
[root@apache ~]# ip addr add 192.168.75.186/24 dev eth0
[root@apache ~]# ip addr add 192.168.75.187/24 dev eth0
[root@apache ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:0c:29:b7:fa:01 brd ff:ff:ff:ff:ff:ff
    altname enp3s0
    altname ens160
    inet 192.168.75.184/24 brd 192.168.75.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet 192.168.75.185/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet 192.168.75.186/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet 192.168.75.187/24 scope global secondary eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::c80e:1840:7e94:5d13/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
d.检测并重启
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
e.测试
Linux端:

192.168.75.186

[root@apache ~]# curl 192.168.75.186
jeams 192.168.75.186

192.168.75.187

[root@apache ~]# curl 192.168.75.187
jeams 192.168.75.187
Windows端:

192.168.75.186

192.168.75.187:

3.4.3基于域名实现

a.编辑配置文件
[root@apache ~]# vim /etc/httpd/conf.d/name.conf 
<Directory /virtualhost>
  Allowoverride none           #禁用该目录下.htaccess文件的作用
  Require all granted          #允许所有客户端访问该目录
</Directory>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/king #存放该域名对应的网页文件
ServerName www.king.com        #域名为www.king.com
</VirtualHost>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/jeams#存放该域名对应的网页文件
ServerName www.jeams.org       #域名为www.jeams.org
ServerAlias haha.jeams.org     #别名为haha.jeams.org
</VirtualHost>
b.创建目录并写入文本
[root@apache ~]# mkdir -p /virtualhost/{king,jeams}
[root@apache ~]# echo www.king.com > /virtualhost/king/index.html
[root@apache ~]# echo www.jeams.org > /virtualhost/jeams/index.html
c.检测并重启
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
d.域名解析
[root@apache ~]# vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.75.184    apache www.king.com www.jeams.org haha.jeams.org
e.测试
Linux端
www.king.com
[root@apache ~]# curl www.king.com
www.king.com
www.jeams.org
[root@apache ~]# curl www.jeams.org
www.jeams.org
haha.jeams.org
[root@apache ~]# curl haha.jeams.org
www.jeams.org
Windows端
编辑Windows域名解析本地配置文件路径
C:\Windows\System32\drivers\etc\hosts
添加以下内容到hosts文件
 192.168.75.184   www.king.com  www.jeams.org haha.jeams.org
www.king.com

www.jeams.org

haha.jeams.org

3.5错误页面配置

3.5.1编辑配置文件

[root@apache ~]# vim /etc/httpd/conf/httpd.conf
errordocument 403 "<h1>sorry!</h1>permission denied\n"
errordocument 404 "<h1>sorry!</h1>your page not found\n"

3.5.2检测并重启

[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd

3.5.3测试(本次测试基于域名实现的配置文件上改)

a.出现403(设置黑名单,开启SELinux,将数据给备份或者改名)
设置黑名单
[root@apache ~]# vim /etc/httpd/conf.d/name.conf 
<Directory /virtualhost/king>
  Allowoverride none
  <requireall>
   require all granted         #允许所有
   require not ip 192.168.75.1 #拒绝该主机
  </requireall>
</Directory>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/king
ServerName www.king.com
</VirtualHost>
<VirtualHost 192.168.75.184:80>
DocumentRoot /virtualhost/jeams
ServerName www.jeams.org
ServerAlias haha.jeams.org
</VirtualHost>
检测并重启
[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd
Windows上查看结果

win+r:运行对话框

浏览器查看

开启SELinux
[root@apache ~]# vim /etc/selinux/config 
SELINUX=enforcing
Windows端浏览器查看

将数据给备份或改名
[root@apache ~]# mv /etc/httpd/conf.d/name.conf /etc/httpd/conf.d/name
Windows端浏览器查看

b.出现404(没有这个文件)
[root@apache ~]# curl 192.168.75.184/jeams6
<h1>sorry!</h1>your page not found

3.6访问验证配置

3.6.1编辑配置文件

[root@apache ~]# vim /etc/httpd/conf.d/auth.conf
<VirtualHost 192.168.75.188:80>
servername 192.168.75.188          #绑定的IP
documentroot /virtualhost/auth     #网站的根目录
errordocument 401 /noauth.html     #当出现401未授权错误时,转到/noauth.html
</VirtualHost>
<Directory /virtualhost/auth>
authtype basic                     #使用HTTP基本认证
authname "please login:"           #认证信息弹出
authuserfile /etc/httpd/auth-password #引用之前创建的密码文件
require user jeams xiaoming        #仅允许指定用户(jeams和xiaoming)访问
</Directory>
alias /noauth.html /virtualhost/auth/prompt.html    #当出现401自动调转到prompt.html

[root@apache ~]# vim  /virtualhost/auth/prompt.html
please enter passwd!!!

3.6.2添加临时IP

[root@apache ~]# ip a a 192.168.75.188/24 dev eth0 

3.6.3创建目录并写入内容

[root@apache ~]# mkdir /virtualhost/auth
[root@apache ~]# echo jeams > /virtualhost/auth/index.html

3.6.4设置密码

#-c表示创建新的密码文件(如果该文件已经存在,会被覆盖,所以第二次执行的时候不用加-c)
[root@apache ~]# htpasswd -c /etc/httpd/auth-password jeams
New password: 
Re-type new password: 
Adding password for user jeams
[root@apache ~]# htpasswd  /etc/httpd/auth-password xiaoming
New password: 
Re-type new password: 
Adding password for user xiaoming

3.6.5查看密码文件

[root@apache ~]# cat /etc/httpd/auth-password 
jeams:$apr1$695OAFmJ$iQ3m4RpvxwvD3UmzpBFlM/
xiaoming:$apr1$q0X9wH09$jtfTvyWCTDeyNp.VcZRG90

3.6.6检测并重启

[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd

3.6.7测试

a.无指定用户直接测试
[root@apache ~]# curl 192.168.75.188
please enter passwd ! ! !

[root@apache ~]# curl -I  192.168.75.188
HTTP/1.1 401 Unauthorized
Date: Wed, 10 Sep 2025 10:26:34 GMT
Server: Apache
WWW-Authenticate: Basic realm="please login:"
Last-Modified: Wed, 10 Sep 2025 07:37:33 GMT
ETag: "1a-63e6d7e6391fd"
Accept-Ranges: bytes
Content-Length: 26
Content-Type: text/html; charset=UTF-8
b.指定用户测试
第一种方法
#-u 指定用户登录
[root@apache ~]# curl -u jeams 192.168.75.188
Enter host password for user 'jeams':
jeams
第二种方法
#自动将认证信息以HTTP基本认证的方式发送给服务器,无需手动输入
[root@apache ~]# curl http://xiaoming:123@192.168.75.188
jeams

#xiaoming:123 表示使用用户名xiaoming和密码123进行身份验证
#@192.168.75.188 表示要访问的服务器地址(即你配置了身份验证的虚拟主机)

c.Windows端(输入http://xiaoming:123@192.168.75.188)

4.apache实现https网站

4.1安装软件

#安装Apache的SSL模块
[root@apache ~]# yum install mod_ssl -y
#检测Apache是否加载了SSL模块
[root@apache ~]# httpd -M | grep ssl
 ssl_module (shared)

4.2编辑文件

[root@apache ~]# vim /etc/httpd/conf.d/https.conf
<virtualhost 192.168.75.189:443>
SSLEngine on              #启用SSL加密功能
#指定SSL证书和私钥文件(之前生成的自签名证书)
SSLCertificateFile /etc/httpd/certs/https.crt #公钥证书 
SSLCertificateKeyFile /etc/httpd/certs/https.key #私钥证书
DocumentRoot /virtualhost/https
ServerName 192.168.75.189       #网站根目录
<directory /virtualhost/https>  #绑定的IP
DirectoryIndex index.html       #默认首页文件
allowoverride none              #禁用.htaccess
require all granted             #允许所有客户端访问
</directory>
</virtualhost>

4.3添加临时IP

[root@apache ~]# ip addr add 192.168.75.189/24 dev eth0

4.4创建目录用于存放SSL证书

[root@apache ~]# mkdir /etc/httpd/certs

4.5生成SSL证书

4.5.1生成一个RSA私钥文件,用于加密和解密SSL通信

[root@apache ~]# openssl  genrsa  > /etc/httpd/certs/https.key

4.5.2基于RSA私钥文件创建一个自签名SSL证书

[root@apache ~]# openssl  req  -utf8  -new  -key /etc/httpd/certs/https.key -x509  -days  365  -out /etc/httpd/certs/https.crt

-utf8:支持UTF-8字符输入(如中文单位/地区信息)
-new:生成新的证书请求
-x509:直接生成自签名证书(而非证书请求文件)
-days 365:证书有效期为365天
-out:指定输出的证书文件路径

注意:输入这条命令会叫你填写国家代码,省份,地区,公司,部门,域名,邮箱

4.5.3创建目录并编写内容

[root@apache ~]# mkdir /virtualhost/https/ -p
[root@apache ~]# echo "jeams,this is for you" > /virtualhost/https/index.html 

4.5.4检测并重启

[root@apache ~]# httpd -t
Syntax OK
[root@apache ~]# systemctl restart httpd

4.5.5测试

Linux测试
#-k 标识忽略SSL证书验证(因为你使用的是自签名证书,不被系统默认信任)
[root@apache ~]# curl -k https://192.168.75.189/index.html
jeams,this is for you
Windows测试

注意:因为是自己做的证书,浏览器会提醒你不安全,你点击高级并继续访问即可看到测试内容


网站公告

今日签到

点亮在社区的每一天
去签到