【问题标题】:Apache control in multi site server configuration多站点服务器配置中的 Apache 控制
【发布时间】:2023-12-29 11:02:01
【问题描述】:

我有一个运行灯堆栈的 ubunto 虚拟机,现在,一个域名重定向到虚拟机的 IP 地址。 概念明智的主要原则是我希望用户注册一个帐户并获得一个在我自己域的子域上运行的“网站”。这部分很容易使用 apache vhosts 等中的通配符子域,并且使用 certbot 我设法自动使所有子域受 ssl 保护。

现在,如果客户想要购买他/她自己的域名,他们需要通过我或其他注册商将 A 记录指向我的 IP 地址,并将来自 www 的 CNAME 指向域名。最后,我需要在站点可用文件夹下添加一个 vhost 文件,为该新域名配置虚拟主机文件并“优雅地”重新启动 apache。

这就是问题所在。如何操作 apache vhosts 文件等,以便在我的主网站上按一下按钮即可完成此操作?我在后端使用 PHP,而在 php(shell exec 等)中执行它似乎存在安全风险..

我在 GCP 上运行,因此 GCP 的任何服务都可用。

提前致谢。

【问题讨论】:

  • 我认为预配置的多站点虚拟主机将解决您的问题。请检查此链接(serverfault.com/questions/326130/…)。这是回答您的问题吗?
  • @AghilanB 只要我的客户在我的域上使用 store1.mydomain.com 之类的子域,预配置的虚拟主机就可以工作。我要问的是如何动态重新配置 apache,以便如果客户购买了 hisstore.com 之类的域,我可以将该域重定向到正确的文件夹。我可以手动购买添加一个新的 vhost 配置文件(:80 和:443),然后重新启动 apache,但我想知道是否有办法通过 php 或其他语言来做到这一点,以便系统将自身更新为客户在网页上按下按钮

标签: php apache google-cloud-platform virtual-machine virtualhost


【解决方案1】:

如果您担心服务器中的 shell 脚本,您可以在另一台机器上使用 SSH 运行应用程序;它可以是一个小实例,应用程序可以是仅在 Windows 上可用的腻子之类的东西。你应该找到一些与 Linux 相关的东西,因为有很多替代品可用。使用 SSH 客户端应用程序和 Python 语言实现自动化。

由于手动过程涉及多次运行相同的命令,您可以创建虚拟主机文件并查看文件是否在站点可用目录等中创建。

一旦新用户注册了您的服务,您需要创建虚拟主机文件并运行 chown 命令并查看这些文件是否是在目录中的站点中创建的,然后重新启动您的 apache。可以参考自动化virtual host setup on your server中的步骤。

【讨论】:

    【解决方案2】:

    回答我自己的问题:

    在 apache 中启用 mod_macros;

    sudo a2enmod macro
    

    添加了一个用于创建 http :80 虚拟主机的宏和另一个用于创建带有必要变量的 https :443 虚拟主机的宏;

    <Macro ProtectedVHost $domain>
        <VirtualHost *:80>
            ServerAdmin admin@email.com
            ServerName $domain
            ServerAlias www.$domain
    
            DocumentRoot /var/www/customer_sites/$domain/public_html
    
            ErrorLog ${APACHE_LOG_DIR}/error.log
            CustomLog ${APACHE_LOG_DIR}/access.log combined
    
            RewriteEngine on
            RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
        </VirtualHost>
    
        <IfModule mod_ssl.c>
            <VirtualHost *:443>
                ServerName $domain
                ServerAlias www.$domain
                ServerAdmin admin@email.com
    
                DocumentRoot /var/www/customer_sites/$domain/public_html
    
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
    
                SSLEngine on
                SSLCertificateFile /etc/letsencrypt/live/$domain/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/$domain/privkey.pem
                Include /etc/letsencrypt/options-ssl-apache.conf
            </VirtualHost>
        </IfModule>
    </Macro>
    

    在我的主要网站上的 public_html 文件夹中创建了一个 conf 文件,可在 php 中编辑,当用户在他的域中添加时,我使用自己的宏添加记录:

    Use {Macro Name} {Domain Name}
    

    将该文件导入 apache.conf

    最后,我创建了一个 CRON,它经常启动并读取该文件并将其与保存的版本进行比较。如果文件发生了变化,它会优雅地重新启动 apache,它会读取并重新创建必要的虚拟主机。

    希望这可以帮助任何想要做同样事情的人

    【讨论】:

      最近更新 更多