单个域上的多个 vhost

单个域上的多个 vhost

我遇到了虚拟主机和 Apache 方面的问题。我缺少的更多是有关其工作原理的总体解释,而不是某个特定命令,让我解释一下:

我有一个 my.domain 域名,该域名关联了一个 SSL 证书。我无法为 toto.my.domain 等子域名生成证书。

我正在运行四项服务:

  • Zabbix 与 Apache 在端口 443 上运行,位于 /usr/share/zabbix
  • Nextcloud 在端口 443 上使用 Apache 运行,位于 /var/www/html/nextcloud
  • Transmission 在自己的 Web 服务器的 9091 端口上运行,位于 /usr/share/transmission
  • Emby 在自己的 Web 服务器上运行,端口为 8096 (http) 和 8920 (https),​​天知道它位于哪里

我在 sites-available 文件夹中创建了 4 个配置文件。对于 Zabbix 和 Nextcloud,这些不是 vhost,只是带有 Alias 和 Directory 指令的配置。

  • 对于 Zabbix 别名 /zabbix /usr/share/zabbix
  • 对于 Nextcloud 别名 /nextcloud "/var/www/html/nextcloud/"

通过此配置,我可以通过以下方式访问 Zabbix:https://my.domain/zabbix和 Nextcloudhttps://my.domain/nextcloud

对于 Emby 和 Transmission,我希望通过以下方式访问它:

因此,我像脚本小子一样从互联网上复制粘贴了以下 vhost confs,这些配置似乎对每个人都有效。

传动装置

<VirtualHost *:443>
        ServerName my.domain
        ServerAlias www.my.domain
        Redirect permanent /transmission https://my.domain/transmission

        RewriteEngine on
        RewriteRule /transmission[/]?$ /transmission/web/ [R]

        ProxyRequests On
        ProxyPreserveHost Off
        <Proxy *>
        Order allow,deny
        Allow from all
        </Proxy>

        ProxyPass /transmission http://127.0.0.1:9091/transmission
        ProxyPassReverse /transmission http://127.0.0.1:9091/transmission
</Virtualhost>

<VirtualHost *:80>
        ServerName my.domain
        ServerAlias www.my.domain
        Redirect permanent /transmission https://my.domain/transmission
</Virtualhost>

对于 Emby

<VirtualHost *:80>
    ServerName       my.domain
    Redirect         permanent /emby https://my.domain/emby
</VirtualHost>

<VirtualHost *:443>
        ServerName my.domain

        RewriteEngine on
        RewriteRule ^/emby$ /emby/ [R]

        <proxy *>
        Order Allow,Deny
        Allow from all
        </proxy>

        ProxyRequests     Off
        ProxyPreserveHost On

        Header        set        Connection "Upgrade"
        RequestHeader setifempty Connection "Upgrade"
        Header        set        Upgrade "websocket"
        RequestHeader setifempty Upgrade "websocket"

        # Notice!!! Put me before http!!!
        ProxyPass        /socket ws://localhost:8096/socket
        ProxyPassReverse /socket ws://localhost:8096/socket

        # Notice!!! Put me after ws!!!
        ProxyPass        / http://localhost:8096/
        ProxyPassReverse / http://localhost:8096/

</VirtualHost>

问题是,由于我只有一个域名,我不明白创建“vhost”的意义,而实际上它们并不是真正的 vhost。就我而言,Zabbix 和 Nextcloud 不是 Vhost,而 Emby 和 Transmission 共享同一个域名,所以我们不能说它们是 Vhost,对吗?

这些配置的结果是,如果我先启用传输,它可以工作,但 Emby 不工作。我收到了消息您无权访问 /emby

如果我先启用 Emby,Emby 可以工作,但 Transmission 不工作。我收到了消息您无权访问 /transmission/web/

读完本文后https://httpd.apache.org/docs/2.4/vhosts/name-based.html以及我理解 Apache 行为的具体声明“如果在包含最具体的匹配 IP 地址和端口组合的虚拟主机集合中未找到匹配的 ServerName 或 ServerAlias,则将使用匹配的第一个列出的虚拟主机。“。

这就是为什么如果我先启用 Emby,它就会工作,如果我先启用 Transmission,情况也是如此。

所以最后一个问题是:如何解决它!?

提前感谢任何提示!

答案1

是的,在同一个地址:端口上为同一个域创建多个 VirtualHost 没有任何意义。如果它们旨在服务相同的路径 (URL),则 Web 服务器无法区分它们。如果它们旨在服务不同的路径,则一个 VirtualHost 就可以很好地完成此任务。

因为 Emby 似乎只使用路径/emby/而不需要整个根目录/,所以首先相应地调整其 ProxyPass;然后将所有 webapps 的所有 ProxyPass 设置放在同一个 VirtualHost 中。同样,将所有“重定向到 HTTPS”设置合并到一个 VirtualHost 中。

如果某些 Web 应用程序需要不同的设置,请使用<Location>VirtualHost 内的块。

答案2

您是否尝试过或编辑过 apache2 配置文件 (/etc/apache2/apache2.conf;其他 Unix 或 Linux - httpd.conf 等) 目录配置指令,并添加了相应的目录条目?在 apache 配置文件中,您将看到如下指令:

 <Directory />
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /usr/share>
        AllowOverride None
        Require all granted
</Directory>

<Directory /var/www/>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
</Directory>

... these are just examples. Don't use (it's already there usually)

因此,从这个角度来看:

<Directory /var/www/emby>
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

<Directory /var/www/transmission>
        Options FollowSymLinks
        AllowOverride None
        Require all denied
</Directory>

我在这里做了一些改动,并做了一些一般假设。我假设 /var/www 目录中有名为 emby 和 transmission 的目录或链接。我知道 apache2.conf 已经有一个针对 /var/www 的目录指令设置(无论如何对于基于 debian 的变体;很明显我正在对 Ubuntu 进行采样)。我意识到并声明这可能不是您的设置中的实际情况。

这些设置不一定需要在主 apache2 配置文件中。事实上,大多数人会告诉你不要这样做,并将它们添加到实际的 vhost 配置文件中,大多数人会说这是明智的做法(我并不理智,哈哈)。

如上所述,我做了一些假设,因此这更像是一个指导方针,而不是实际用例。我不知道您运行的是哪种操作系统,但我可以告诉您运行的是 Apache 2,或者它看起来很像。

当然,您需要将实际路径放到 /var/www/emby 和 /var/www/transmission 条目的相应目录中。

我希望我能更具体一点,但是提供的信息不够。不过,我希望这能给你提供更多解决问题的弹药。我确实看到了你上面的重写,我再次声明,这只是信息性的,而不是实际用例。警告已说明。;)

相关内容