虽然您可以直接从PHP页面执行此操作,但出于许多原因,我建议
不要这样做,包括高风险(例如页面执行突然中断)和安全风险(httpd用户将具有对自身配置和某些不应访问的文件系统上的一些内容的写入权限)。
一段时间以前,我编写了一个类似的控制“网站创建控制面板”,工作方式非常相似:
- php脚本接收网站创建请求并将其存储在某个位置(例如数据库)。
- 另一个脚本每隔五分钟作为root运行通过cron检查网站创建请求队列。如果有任何:
- 将网站创建任务标记为“锁定”
- 在适当的位置创建目录,并填充脚本等。
- 根据需要更改所有权限
- 创建新的虚拟主机配置,并启用它
- 使Web服务器重新加载自己的配置
- 将网站创建任务标记为“完成”
第二个脚本可以使用任何您喜欢的语言编写,如PHP、Python、Bash等。
关于Apache配置
要创建与您的域名“映射”的目录,您可以使用以下内容:
首先,“slugify”您的域名。我通常采用(经过净化的!)域名,并将所有点转换为双破折号(这不是有效的域名部分)。除了文件扩展名分离外,我不喜欢文件/目录名称中的点。
然后,您可以创建类似于以下内容的内容(假设域名为www.example.com
):
<VirtualHost *:80>
ServerName www.exampple.com
DocumentRoot `/my-sites/wwwroot/www--example--com`
<Directory "/my-sites/wwwroot/www--example--com">
Options -Indexes FollowSymLinks
Order allow,deny
Allow from all
AllowOverride All
</Directory>
ErrorLog /var/log/apache2/www--example--com_error.log
CustomLog /var/log/apache2/www--example--com_access.log vhost_combined
</VirtualHost>
<VirtualHost *:80>
ServerName www.example.com
ServerAlias example.com
RedirectMatch permanent ^(.*) http://www.example.com$1
</VirtualHost>
假设您将网站文件放置在类似于
/my-sites/wwwroot/www--example--com
的目录中。
一些与安全相关的改进
在我的情况下,我也更喜欢不以root身份运行第二个脚本;为了这样做,您需要进行一些更改,以让一个权限较低的用户在您的系统上执行某些操作:
- 创建一个具有写访问权限的目录,比如说
/my-sites/conf/vhosts
- 创建一个Apache虚拟主机,其中包含以下行:
Include "/my-sites/conf/vhosts/*.vhost"
,并启用它
然后,让您的用户重新加载Apache配置,通过安装sudo
并将其添加到您的/etc/sudoers
中:
Cmnd_Alias A2RELOAD = /usr/sbin/apache2ctl graceful
youruser ALL=NOPASSWD: A2RELOAD
%yourgroup ALL = NOPASSWD: A2RELOAD
当然,还需要将您网站的基础目录赋予写权限,以便运行脚本的用户可以访问。