多站点服务器配置中的 Apache 控件

Apache control in multi site server configuration

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

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

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

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

提前致谢。

如果您担心服务器中的 shell 脚本,您可以 运行 从另一台机器使用 SSH 的应用程序;它可以是一个小例子,一个应用程序可以像一个仅在 windows 上可用的腻子。您应该找到与 Linux 相关的内容,因为有许多可供选择的内容。使用 SSH 客户端应用程序和 Python 语言使其自动化。

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

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

中的步骤

回答我自己的问题:

在 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,这将读取并重新创建必要的虚拟主机。

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