注意:以下操作都在 root 用户下执行

Apache 主配置文件

1.编辑 apache 主配置文件 /usr/local/apache2/conf/httpd.conf ,将默认的虚拟主机配置注释掉,即找到下面这段配置并进行注释:

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
DocumentRoot "/usr/local/apache2/htdocs"
<Directory "/usr/local/apache2/htdocs">
#
# Possible values for the Options directive are "None", "All",
# or any combination of:
# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#
# Note that "MultiViews" must be named *explicitly* --- "Options All"
# doesn't give it to you.
#
# The Options directive is both complicated and important. Please see
# http://httpd.apache.org/docs/2.4/mod/core.html#options
# for more information.
#
Options Indexes FollowSymLinks

#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# AllowOverride FileInfo AuthConfig Limit
#
AllowOverride None

#
# Controls who can get stuff from this server.
#
Require all granted
</Directory>

2.同时,找到 #Include conf/extra/httpd-vhosts.conf 行,将前面的注释符号 # 去掉,表示启用虚拟主机配置文件!

1
sed -i 's@#Include conf/extra/httpd-vhosts.conf@Include conf/extra/httpd-vhosts.conf@' /usr/local/apache2/conf/httpd.conf

基于端口的虚拟主机

基于端口的虚拟主机是指通过不同的端口来区分不同的虚拟主机。在同一个IP地址上,可以通过不同的端口提供不同的网站服务,每个端口对应一个独立的虚拟主机。这种方式可以实现在同一台服务器上通过不同端口提供多个网站服务。

基于 80 端口

1.创建 web 存放目录:

1
mkdir -p /data/websites/apache/site01

2.在 web 目录创建测试的静态网页文件 index.html ,内容为:

1
echo '这是 apache 基于 80 端口配置的虚拟主机' > /data/websites/apache/site01/index.html

3.编辑虚拟主机配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf,将其默认的所有配置都注释掉,然后添加以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
##基于 80 端口的配置
# 定义了一个监听端口为80的虚拟主机。 * 表示监听所有的IP地址,即对来自所有IP地址的请求都生效。
<VirtualHost *:80>
# 指定了该虚拟主机的根目录为 /data/websites/apache/site01 ,即网站文件的存放路径。
DocumentRoot "/data/websites/apache/site01"
# 设置了虚拟主机的域名为 localhost ,表示通过该域名可以访问该虚拟主机配置的网站。
ServerName localhost
# 这个指令 AddDefaultCharset utf-8 用于向Apache的配置中添加默认字符集为UTF-8。
# 当浏览器没有指定字符集时,服务器会使用UTF-8作为默认字符集来发送内容给客户端。
# 这有助于确保网站内容能够正确地显示在各种浏览器中,并且支持Unicode字符。
AddDefaultCharset utf-8
# 指定了错误日志文件的路径为 logs/site01_error_log ,用于记录该虚拟主机的错误日志信息。
ErrorLog "logs/site01_error_log"
# 指定了访问日志文件的路径为 logs/site01_access_log ,使用 common 格式记录访问日志信息。
CustomLog "logs/site01_access_log" common
# 针对 /data/websites/apache 目录的访问权限设置。 不配置会出现 403
<Directory "/data/websites/apache">
# 设置了对 /data/websites/apache 目录下的所有请求都允许访问。
# Require all granted 表示允许所有请求访问该目录,是Apache 2.4版本中的访问控制设置方式。
Require all granted
</Directory>
</VirtualHost>

注意:

  • 如果在配置虚拟主机时使用 80 端口以外的端口,那么还需要在 apache 主配置文件中添加 Listen PORT ,否则系统不会监听虚拟主机配置的端口,最终就会导致配置的虚拟主机资源不可访问!
  • 如果虚拟主机使用默认的 80 端口,则在配置虚拟主机时不能将 <VirtualHost *:80> 简写成 <VirtualHost>,否则会报 <VirtualHost> directive requires additional arguments 这个错!

4.执行命令 apachectl -t 检查 apache 配置是否有误

1
apachectl -t

5.执行命令 systemctl restart apache.service 重启 apache 服务:

1
systemctl restart apache.service

6.打开浏览器测试使用服务器 IP 访问,看内容是否为上面第二步创建的静态网页内容:

基于非 80 端口

1.创建 web 存放目录:

1
mkdir -p /data/websites/apache/site02

2.在 web 目录创建测试的静态网页文件 index.html ,内容为:

1
echo '这是 apache 基于非 80 端口配置的虚拟主机' > /data/websites/apache/site02/index.html

3.编辑虚拟主机配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf,在该文件中新增一个非 80 端口的虚拟主机配置,内容如下:

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
cat << 'EOF' >> /usr/local/apache2/conf/extra/httpd-vhosts.conf

##基于非 80 端口的配置
# 定义了一个监听端口为81的虚拟主机。 * 表示监听所有的IP地址,即对来自所有IP地址的请求都生效。
<VirtualHost *:81>
# 指定了该虚拟主机的根目录为 /data/websites/apache/site01 ,即网站文件的存放路径。
DocumentRoot "/data/websites/apache/site02"
# 设置了虚拟主机的域名为 localhost ,表示通过该域名可以访问该虚拟主机配置的网站。
ServerName localhost
# 这个指令 AddDefaultCharset utf-8 用于向Apache的配置中添加默认字符集为UTF-8。
# 当浏览器没有指定字符集时,服务器会使用UTF-8作为默认字符集来发送内容给客户端。
# 这有助于确保网站内容能够正确地显示在各种浏览器中,并且支持Unicode字符。
AddDefaultCharset utf-8
# 指定了错误日志文件的路径为 logs/site01_error_log ,用于记录该虚拟主机的错误日志信息。
ErrorLog "logs/site02_error_log"
# 指定了访问日志文件的路径为 logs/site01_access_log ,使用 common 格式记录访问日志信息。
CustomLog "logs/site02_access_log" common
# 针对 /data/websites/apache 目录的访问权限设置。 不配置会出现 403
<Directory "/data/websites/apache">
# 设置了对 /data/websites/apache 目录下的所有请求都允许访问。
# Require all granted 表示允许所有请求访问该目录,是Apache 2.4版本中的访问控制设置方式。
Require all granted
</Directory>
</VirtualHost>
EOF

注意:

  • 如果在配置虚拟主机时使用 80 端口以外的端口,那么还需要在 apache 主配置文件中添加 Listen PORT ,否则系统不会监听虚拟主机配置的端口,最终就会导致配置的虚拟主机资源不可访问!
  • 同时, <VirtualHost *:81> 配置内容后面的 *:81 不能省。

4.编辑 apache 主配置文件 /usr/local/apache/conf/httpd.conf ,找到 Listen 80 这一行配置,在下面添加一行 Listen 81。其它保持默认,保存退出配置文件!

5.执行命令 apachectl -t 检查 apache 配置是否有误

1
apachectl -t

6.执行命令 systemctl restart apache.service 重启 apache 服务:

1
systemctl restart apache.service

7.打开浏览器测试使用服务器 IP:PORT 访问,看是否能正确访问到静态网页内容:

基于域名的虚拟主机

基于域名的虚拟主机是指通过不同的域名来区分不同的虚拟主机,它们可以共享同一个IP地址,但根据不同的域名来访问不同的网站。

如果你服务器是公网的,且有域名,那么先要去将自己的域名做好解析(域名如何作解析这里就不作介绍了),比如我自己的域名解析如下图:

  • 因为我的服务器是大陆的,且没有作域名备案,所以下面的域名实例都是用本地环境进行配置(apache 版本及安装步骤与上面的一模一样);
  • 本地 hosts 文件解析:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    127.0.0.1 localhost
    127.0.1.1 leazhi-ubuntu2310

    # The following lines are desirable for IPv6 capable hosts
    ::1 ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters

    192.168.3.120 apache.abc.com
    192.168.3.120 apache02.abc.com
    192.168.3.120 apache03.abc.com
    192.168.3.120 apache04.abc.com
    192.168.3.120 apache05.abc.com

基于单域名

1.创建 web 存放目录:

1
mkdir -p /data/websites/apache/site03

2.在 web 目录创建测试的静态网页文件 index.html ,内容为:

1
echo '这是 apache 基于单域名的虚拟主机' > /data/websites/apache/site03/index.html

3.编辑虚拟主机配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf,在该文件中新建一个基于单域名的虚拟主机配置,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cat << 'EOF' >> /usr/local/apache2/conf/extra/httpd-vhosts.conf

## 基于单域名的虚拟主机配置
<VirtualHost *:80>
# 指定了该虚拟主机的根目录为 /data/websites/apache/site03 ,即网站文件的存放路径。
DocumentRoot "/data/websites/apache/site03"
# 设置了虚拟主机的域名为 localhost ,表示通过该域名可以访问该虚拟主机配置的网站。
ServerName apache.abc.com
# 这个指令 AddDefaultCharset utf-8 用于向Apache的配置中添加默认字符集为UTF-8。
# 当浏览器没有指定字符集时,服务器会使用UTF-8作为默认字符集来发送内容给客户端。
# 这有助于确保网站内容能够正确地显示在各种浏览器中,并且支持Unicode字符。
AddDefaultCharset utf-8
# 指定了错误日志文件的路径为 logs/site03_error_log ,用于记录该虚拟主机的错误日志信息。
ErrorLog "logs/site03_error_log"
# 指定了访问日志文件的路径为 logs/site03_access_log ,使用 common 格式记录访问日志信息。
CustomLog "logs/site03_access_log" common
# 针对 /data/websites/apache 目录的访问权限设置。 不配置会出现 403
<Directory "/data/websites/apache">
# 设置了对 /data/websites/apache 目录下的所有请求都允许访问。
# Require all granted 表示允许所有请求访问该目录,是Apache 2.4版本中的访问控制设置方式。
Require all granted
</Directory>
</VirtualHost>
EOF

注意:

  • 如果你的服务器在中国大陆,且在有做备案的前提下,那么你就可以直接使用域名的进行访问;否则,就只能使用 域名+端口 的形式访问;
  • 如果你的服务器不在中国大陆,且在没有做备案的前提下,那么你也可以使用域名随意访问;

4.执行命令 apachectl -t 检查 apache 配置是否有误

1
apachectl -t

5.执行命令 systemctl restart apache.service 重启 apache 服务:

1
systemctl restart apache.service

6.打开浏览器输入我们配置的域名,看是否能正确访问到静态网页内容:

6.1.这个是因为服务器在大陆,且域名没有备案,所以提示无法访问,如图:

6.2.下面这个是本地环境的配置,由于我们做了本地 hosts 解析,所以可以正常使用域名访问:

基于多域名

1.创建 web 存放目录:

1
mkdir -p /data/websites/apache/site04

2.在 web 目录创建测试的静态网页文件 index.html ,内容为:

1
echo '这是 apache 基于多域名的虚拟主机' > /data/websites/apache/site04/index.html

3.编辑虚拟主机配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf,在该文件中新建一个基于单域名的虚拟主机配置,内容如下:

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
cat << 'EOF' >> /usr/local/apache2/conf/extra/httpd-vhosts.conf

## 基于多域名的虚拟主机配置
<VirtualHost *:80>
# 指定了该虚拟主机的根目录为 /data/websites/apache/site04 ,即网站文件的存放路径。
DocumentRoot "/data/websites/apache/site04"
# 设置了虚拟主机的主域名为 `apache02.abc.com` ,表示通过该域名可以访问该虚拟主机配置的网站。
ServerName apache02.abc.com
# 这个配置指定了虚拟主机的多个别名,允许用户通过 apache03.abc.com 、 apache04.abc.com 和 apache05.abc.com 这三个域名访问同一个虚拟主机。
ServerAlias apache03.abc.com apache04.abc.com apache05.abc.com
# 这个指令 AddDefaultCharset utf-8 用于向Apache的配置中添加默认字符集为UTF-8。
# 当浏览器没有指定字符集时,服务器会使用UTF-8作为默认字符集来发送内容给客户端。
# 这有助于确保网站内容能够正确地显示在各种浏览器中,并且支持Unicode字符。
AddDefaultCharset utf-8
# 指定了错误日志文件的路径为 logs/site04_error_log ,用于记录该虚拟主机的错误日志信息。
ErrorLog "logs/site04_error_log"
# 指定了访问日志文件的路径为 logs/site04_access_log ,使用 common 格式记录访问日志信息。
CustomLog "logs/site04_access_log" common
# 针对 /data/websites/apache 目录的访问权限设置。 不配置会出现 403
<Directory "/data/websites/apache">
# 设置了对 /data/websites/apache 目录下的所有请求都允许访问。
# Require all granted 表示允许所有请求访问该目录,是Apache 2.4版本中的访问控制设置方式。
Require all granted
</Directory>
</VirtualHost>
EOF

注意:

  • 如果你的服务器在中国大陆,且在有做备案的前提下,那么你就可以直接使用域名的进行访问;否则,就只能使用 域名+端口 的形式访问;
  • 如果你的服务器不在中国大陆,且在没有做备案的前提下,那么你也可以使用域名随意访问;

4.执行命令 apachectl -t 检查 apache 配置是否有误

1
apachectl -t

5.执行命令 systemctl restart apache.service 重启 apache 服务:

1
systemctl restart apache.service

6.打开浏览器测试使用多个域名进行访问:

基于 IP 的虚拟主机

基于IP的虚拟主机是指通过不同的IP地址来区分不同的虚拟主机。当一个服务器有多个IP地址时,可以根据不同的IP地址来提供不同的网站服务,每个IP地址对应一个独立的虚拟主机。这样可以实现在同一台服务器上托管多个网站,并且每个网站都可以拥有独立的IP地址。

1.创建 web 存放目录:

1
mkdir -p /data/websites/apache/site05

2.在 web 目录创建测试的静态网页文件 index.html ,内容为:

1
echo '这是 apache 基于 IP 的虚拟主机' > /data/websites/apache/site05/index.html

3.编辑虚拟主机配置文件 /usr/local/apache2/conf/extra/httpd-vhosts.conf,在该文件中新建一个基于单域名的虚拟主机配置,内容如下:

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
cat << 'EOF' >> /usr/local/apache2/conf/extra/httpd-vhosts.conf

## 基于 IP 的虚拟主机配置
# 这个配置 <VirtualHost 192.168.3.120:80> 指定了一个基于IP地址的虚拟主机。
# 在这个配置中, 192.168.3.120 是服务器的IP地址, :80 表示监听端口为80。
# 通过这样的配置,Apache会将所有发送到IP地址为 192.168.3.120 且端口为80的HTTP请求交给这个特定的虚拟主机处理。
# 这意味着只有通过该IP地址访问的请求才会被这个虚拟主机处理,其他IP地址发送的请求不会被这个虚拟主机处理。
<VirtualHost 192.168.3.120:80>
# 指定了该虚拟主机的根目录为 /data/websites/apache/site05 ,即网站文件的存放路径。
DocumentRoot "/data/websites/apache/site05"
# 设置了虚拟主机的主域名为 `192.168.3.120`(也可以设置域名) ,表示通过该 IP 可以访问该虚拟主机配置的网站。
ServerName 192.168.3.120
# 这个指令 AddDefaultCharset utf-8 用于向Apache的配置中添加默认字符集为UTF-8。
# 当浏览器没有指定字符集时,服务器会使用UTF-8作为默认字符集来发送内容给客户端。
# 这有助于确保网站内容能够正确地显示在各种浏览器中,并且支持Unicode字符。
AddDefaultCharset utf-8
# 指定了错误日志文件的路径为 logs/site05_error_log ,用于记录该虚拟主机的错误日志信息。
ErrorLog "logs/site05_error_log"
# 指定了访问日志文件的路径为 logs/site05_access_log ,使用 common 格式记录访问日志信息。
CustomLog "logs/site05_access_log" common
# 针对 /data/websites/apache 目录的访问权限设置。 不配置会出现 403
<Directory "/data/websites/apache">
# 设置了对 /data/websites/apache 目录下的所有请求都允许访问。
# Require all granted 表示允许所有请求访问该目录,是Apache 2.4版本中的访问控制设置方式。
Require all granted
</Directory>
</VirtualHost>
EOF

4.执行命令 apachectl -t 检查 apache 配置是否有误

1
apachectl -t

6.执行命令 systemctl restart apache.service 重启 apache 服务:

1
systemctl restart apache.service

7.打开浏览器测试使用服务器 IP:PORT 访问,看是否能正确访问到静态网页内容:

在实际工作中,基于端口、基于域名和基于 IP 经常混着使用,上面实例只是给个基础的引导

注意: 在同一个虚拟主机配置文件中,同时配有基于 IP 、基于 端口和基于 域名的虚拟主机在访问站点资源是有优先级的,其优先级为:基于 IP > 基于 域名 > 基于端口