我有一个运行lamp堆栈的ubunto vm,目前,一个域名重定向到vm的ip地址。概念明智的主要原则是,我希望用户注册一个帐户,并得到一个“网站”运行在我自己的域名的一个子域。使用apache、vhosts等中的通配符子域,以及使用certbot,我可以自动地在ssl下保护所有的子域。
现在,如果客户想要购买他/她自己的域名,通过我或其他注册商,他们需要将A记录指向我的ip地址,并将来自www的CNAME指向域名。在我的终端,我需要在sites-available文件夹下添加一个vhost文件,为新域名配置虚拟主机文件,然后“优雅地”重新启动apache。
这就是问题所在。我如何操作apache、vhosts、文件等,这样我只需在我的主网站上按一下按钮就可以完成这些操作?我在后台使用PHP,在php (shell、exec等)中做这件事似乎有安全风险。
我在GCP上运行,所以GCP的任何服务都是可用的。
提前谢谢。
发布于 2021-07-29 15:45:15
回答我自己的问题:
在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,apache将读取并重新创建必要的虚拟主机。
我希望这对任何想做同样事情的人有所帮助
发布于 2021-07-28 22:02:10
如果您担心服务器中的shell脚本,您可以使用SSH从另一台计算机运行应用程序;应用程序可以是一个小实例,比如只能在windows上使用的putty。你应该找到一些与Linux相关的东西,因为有很多替代方案可供选择。使用SSH客户端应用程序和Python语言将其自动化。
由于手动过程涉及多次运行同一命令,因此您可以创建虚拟主机文件,并查看文件是否在站点可用目录等中创建。
一旦新用户注册了您的服务,您就需要创建虚拟主机文件并运行chown命令,查看这些文件是否从目录在站点中创建,然后重新启动apache。您可以参考自动化virtual host setup on your server中的步骤。
https://stackoverflow.com/questions/68533559
复制相似问题