Post

CentOS 7 Apache 配置 Virtual Host (虚拟主机)

简介

Apache 是世界上最流行的网页服务器,其功能和组件被分解为不同的单元与功能,其中基础的配置单元是站点(域名)。Apache 用 Virtul Host 表示站点,通过支持多 Virtual Host ,便能够在单个服务器上托管多个站点,共享服务器资源,而且保持互相独立。这里要注意子域名和一级域名一样,都可作为不同的 Virtual Host 进行配置。

这篇教程,将介绍在 CentOS 7 VPS 上如何配置多个 Apache Virtual Host。

提前准备

要使用此教程,你至少要有一个可用的域名(包括子域名)。下面的教程假设你有 example.com 和 example2.com 两个域名需要配置 Apache Virtual Host。

Step 1 - 创建目录结构

首先,我们要为不同域名(站点)分别创建存放网页数据的目录。

1
2
sudo mkdir /var/www/example.com/html
sudo mkdir /var/www/example2.com/html

注意: example.comexample2.com 为你想配置的站点,这里引入 html 二级目录作为 Virtual Host 的根目录,是为了与日志文件等隔离开,如果你要创建的站点是 WordPress、Nextcloud 等服务,可将 html 变更为相应的服务名称。

CentOS 7 未引入  sites-enabled 、sites-available 目录结构,我们需要为 Apache 创建 这两个目录(这样有利于后续灵活直观地管理 Virtual Host)

1
2
sudo mkdir /etc/httpd/sites-available
sudo mkdir /etc/httpd/sites-enabled

提示:你应该将可用 Virtual Host 配置文件统统存储在 site-available 目录下,而在 sites-enabled 目录下配置已启用的 Virtual Host。

现在,让 Apache 加载 sites-enabled 目录下的配置文件。编辑 http.conf,尾部增加一行, IncludeOptional sites-enabled/*.conf

1
2
3
4
sudo vim /etc/httpd/conf/httpd.conf 

...
IncludeOptional sites-enabled/*.conf

Step 2 - 创建新 Virtual Host 配置文件

创建 example.com.conf 文件,指定 /var/www/example.com/html 为 DocumentRoot

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
sudo vim /etc/httpd/sites-available/example.com.conf

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com/html
    ErrorLog /var/www/example.com/error.log
    CustomLog /var/www/example.com/requests.log combined
</VirtualHost>

<Directory /var/www/example.com/html>
    Options -Indexes -FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

# 某些服务如 Nextcloud 需要覆写 .htaccess ,那么使用下面的配置
#<Directory /var/www/example.com/nextcloud>
#    AllowOverride All
#    Require all granted
#</Directory>

这里 <VirtualHost *:80>...</VirtualHost> 表示监听 80 端口的一个 Virtual Host, ServerName 指明 Virtual Host 的绑定的域名; DocumentRoot 指定 Virtual Host 的根目录( 意味着 example.com 对 html 目录外的访问都将被禁止);ErrorLog 、CustomLog 指定日志存储目录。

出于安全考虑,我们在 <Directory /...;</Directory> 标签中使用 -Indexes 禁止目录浏览;使用 -FollowSymLinks 禁止符号链接逃逸 document root;AllowOverride None 不允许 .htaccess 覆写;Require all granted 允许所有 IP 连接。

注意:<Directory /...> 应使用绝对路径;新版本 Apache 已不允许 Options -Indexes FollowSymLinks 这种既有+/-参数又有非+/-参数的写法,应该统一写成 Options -Indexes +FollowSymLinks ,或去掉 -Indexes

Step 3 - 使能 Virtual Host 文件

现在,要让先前创建的 Virtual Host 配置文件生效了。在 site-enabled 目录下建立 example.com.conf 的软连接

1
sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf

重启 Apache ,使配置生效

1
apachectl restart

Step 4 - 测试最终结果

/var/www/example.com/html 放置你要展示的 index.html ,然后使用浏览器访问 http://example.com

若一切正常,你的页面将正常展示。接下来去完成另一个域名 example1.com 的配置吧。

Step 5 - 指定默认 Virtual Host (可选)

现在我们配置了多个站点,Apache 将会根据访问不同域名匹配不同的 Virtual Host,一切正常。但是,如果访问的域名与任何 ServerName 都不匹配,例如使 IP 访问时将连接哪个 Virtual Host 呢?

配置文件第一个被加载的为默认 Virtual Host。

在本文场景中,我们配置了 example.com.confexample2.com.conf 两个 Virtual Host,Apache 会首先加载 example.con.conf 然后加载 example2.com.conf ,依据文件名排序。也就是说,如果使用 IP 访问站点,加载的将会是 example.com 。如果你想让 example2.com 成为默认的站点,可以在将其配置文件命名为 0-example2.com.conf 。要自定义默认 Virtual Host,通常的做法是建立一个 000-default.conf 的配置文件。

This post is licensed under CC BY 4.0 by the author.