多个虚拟主机-如何设置单独的目录?

多个虚拟主机-如何设置单独的目录?

我购买了第二个域名,并尝试在同一个 ubuntu 服务器上建立第二个独立的网站。

我如何设置文件夹和配置文件以允许我的网站拥有不能互相访问的单独源文件?

我的 apache2 配置文件:

/etc/apache2/apache2.conf:
Mutex file:${APACHE_LOCK_DIR} default
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}
HostnameLookups On
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel notice
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf
Include ports.conf
<Directory />
    Options FollowSymLinks
    AllowOverride None
    Require all denied
</Directory>
<Directory /var/www/public>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
AccessFileName .htaccess
<FilesMatch "^\.ht">
    Require all denied
</FilesMatch>
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
IncludeOptional conf-enabled/*.conf
IncludeOptional sites-enabled/*.conf

我的端口配置文件:

/etc/apache2/ports.conf:
Listen 80
<IfModule ssl_module>
    Listen 443
</IfModule>
<IfModule mod_gnutls.c>
    Listen 443
</IfModule>

我的站点 1 的配置文件(当前使用 SSL):

/etc/apache2/sites-enabled/site1.com.conf:
<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerName site1.com
        DocumentRoot /var/www/public
        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
        SSLEngine on
        SSLCertificateFile /etc/letsencrypt/live/site1.com/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/site1.com/privkey.pem
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </Directory>
        BrowserMatch "MSIE [2-6]" \
        nokeepalive ssl-unclean-shutdown \
        downgrade-1.0 force-response-1.0
    </VirtualHost>
</IfModule>

我的站点 2 的配置(我现在想将其设置为 HTTP,确认其正常工作后我将设置 SSL):

/etc/apache2/sites-enabled/site2.com.conf:
<VirtualHost *:80>
    ServerName site2.com
    ServerAlias www.site2.com
    DocumentRoot /var/www/site2
</VirtualHost>

我将第二个站点的配置文件放在 /etc/apache2/sites-available 中并运行 a2ensite site2.com.conf,然后运行 ​​systemctl reload apache2。

我该如何设置以便每个站点只能访问其自己的目录?

如果我从 apache2.conf 中删除这些行:

<Directory /var/www/public>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

然后加载 site1.com 会显示错误 403 Forbidden,即使 site1.com.conf 包含以下行:

DocumentRoot /var/www/public

我考虑在 site1.com.conf 中放置一个 Directory 标签,但是已经有一个了:

<Directory /usr/lib/cgi-bin>
    SSLOptions +StdEnvVars
</Directory>

我该如何设置才能让两个站点都能在各自的域上访问,而两个站点都无法从对方的子目录访问?

编辑:

我的问题实际上是关于这三件事之间的关系:

  1. apache2.conf 的“目录”
  2. 站点 1 的“DocumentRoot”
  3. 站点 2 的“DocumentRoot”

以及我应该如何设置我的目录结构。

目前它们的设置如下:

  1. /var/www/公共
  2. /var/www/公共
  3. /var/www/site2

现在,如果我访问站点 2,它会显示 403 禁止,因为站点 2 的 DocumentRoot 位于主配置文件的目录文件夹之外。我不想将站点 2 的 DocumentRoot 设置为 /var/www/public/site2,因为这样它将位于站点 1 的目录中。

那么有必要使用这个配置吗?:

  1. /var/www/公共
  2. /var/www/公共/site1
  3. /var/www/公共/site2

那和这样的事情有什么区别:

  1. /var/www
  2. /var/www/site1
  3. /var/www/site2

如果 /var/www 中有仅供服务器使用的文件,站点 1 或站点 2 是否可以不安全地访问它们(客户端浏览它们)?

我的问题是关于如何精确设置目录结构,并且我不明白 apache2.conf 的“目录”和 sites-enabled conf 的“DocumentRoot”之间的区别。

答案1

以下是 Apache 配置的简要介绍:

<Directory /some/path/to/somewhere>

<Directory ...>是一个 XML 样式的标记,用于启动配置的一部分。它以 结尾</Directory>。在这两个标记之间,所有内容都适用于起始标记中显示的目录。Apache 将这些称为“部分”。

在您的示例中,有几个<Directory>部分:

  • <Directory />- 本节涵盖了文件系统中的所有内容除非在更具体的标签中被覆盖。这里最重要的项目是Require all denied。这会阻止 Apache 访问硬盘上的所有内容。

  • <Directory /var/www/public>- 本节介绍您网站所在的目录。此处最重要的一行是Require all granted允许 Apache 访问该目录中的文件。


DocumentRoot /some/path/to/somewhere

DocumentRoot告诉 Apache 网站文件的位置。通常您会将其放在某个<VirtualHost>部分内,因为您要在此处定义网站的设置。

在您的示例中,您有几个DocumentRoot指令:

  • DocumentRoot /var/www/public- 这是<VirtualHost>您的里面的site1.com。这意味着当用户访问 时site1.com,Apache 应该在 中查找内容/var/www/public

  • DocumentRoot /var/www/site2- 这是<VirtualHost>您的里面的site2.com。这意味着当用户访问 时site2.com,Apache 应该在 中查找内容/var/www/site2


记住以下几点很重要:

  1. 没有要求章节与章节<Directory>相关,并且与绝对没有任何关系。<VirtualHost><Directory>DocumentRoot
  2. DocumentRoot网站的顶层。访问 的用户site1.com只能看到 中的文件/var/www/public,访问 的用户site2.com只能看到 中的文件/var/www/site2(除非您有某种安全问题在您托管的软件中,但这是另一个讨论)。两个站点都无法看到文件,/var/www因为该路径位于“上方” DocumentRoot- 这就是“Root”的意思。

DocumentRoot但是,即使和之间没有任何联系Directory,事实上您仍然需要<Directory>为每个网站设置一个部分。(您也可以为所有网站使用一个部分,但现在我们将保持简单和安全。)这样做的原因是<Directory />上面提到的部分默认阻止对所有地方的访问,并强制您明确授予对其他目录的访问权限。


现在我们已经解释了这两个配置项之间的关系,让我们看看您的设置需要什么:

您有两个站点,site1.comsite2.com。您目前分别在/var/www/public和中拥有它们/var/www/site2,正如DocumentRoot每个 中的指令所设置的那样<VirtualHost>

因此,为了允许访问这些目录,您还应该有两个<Directory>部分,每个网站一个。为了您的目的,它们的内容可以与<Directory /var/www/public>您已有的当前部分相同:

<Directory /var/www/public>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>
<Directory /var/www/site2>
    Options FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

除此之外,您还需要DocumentRoot最初编写的指令。


就我个人而言,我也会重命名/var/www/public/var/www/site1匹配网站名称。如果所有名称都相同,管理起来会容易得多。

相关内容