从 PHP 创建新的 Apache 配置文件

Creating new Apache config file from PHP

我的程序员们

我对 Apache2 和 PHP 有疑问。 好吧,现在我正在尝试制作一个脚本,该脚本将从 PHP 脚本创建新的“虚拟主机”,而无需在 PHP.

中使用 sudo 命令

带有 echo passwd | /usr/bin/sudo -S command 的解决方案并不是很安全,我不会使用类似的东西。 另外,我发现带有 www-data ALL=(ALL) NOPASSWD: 的解决方案也不是解决方案。

有人可以说明一下吗,这是最好的解决方案,最好的保护措施是什么?如果我需要在 PHP.

中使用 sudo

当然,该脚本将包含创建新目录、在目录中复制新站点文件等的一部分...

这听起来像是一个非常糟糕的安全计划。您必须编辑 apache 配置文件,然后重新加载或重新启动 apache2 服务器。

您可以通过编辑 sudoers 文件来授予 www-data 用户重新加载 apache 的权利,并向 www-data 用户具有写入权限的 apache 添加 vhost 配置。

第二个选项是通过 php:

伪造虚拟主机
<?php
switch ($_SERVER['SERVER_NAME']) {
  case "site1.example.com" :
     require_once 'some_config_for_site_1.php';
     // load scripts from site1 folder.
     break;
  case "site2.example.com" :
     require_once 'some_config_for_site_2.php';
     // load scripts from site1 folder.
     break;
  default:
     http_response_code(404);
     break;
}


  

好的,这是一个非常糟糕的计划,但不知何故这是最好的解决方案。

为了以正确的方式执行此操作,我将使用 bash 脚本,我将从 PHP.

调用该脚本
    $output = shell_exec("sudo /path/to/script/script.sh $SiteName $Domain");

script.sh

    #! /bin/bash

    #First parameter given by calling the script
    sitename=

    #Second parameter given by calling the script
    domain=
   
    #Directorium where are stored files of the web app
    dirlocation="/var/www/$sitename"
    
    #Creating a new directorium
    mkdir $dirlocation

    #Copying the defoult files of app to the just created dir
    cp -R /var/www/someapp/* $dirlocation
    
    #Creating the new configurationg file for Apache and VHost
    vhost_script="/etc/apache2/sites-available/$sitename.conf"
    cat > "${vhost_script}" << EOF
    <VirtualHost *:80>
        ServerName $domain
        DocumentRoot $dirlocation

        <Directory $dirlocation>
            Options Indexes FollowSymLinks
            AllowOverride All
            Require all granted
        </Directory>
    </VirtualHost>
    EOF

    #Enabling the site in Apache
    a2ensite $sitename.conf
   
    #Reloading the Apache
    systemctl reload apache2.service

此外,为了从 PHP 执行此操作,我需要仅使用 sudo 为 运行 授予 www-data 权限。 为此,请打开 sudoers 文件 (sudo visudo /etc/sudoers) 并添加以下行

www-data ALL=(root) NOPASSWD: /path/to/script/script.sh

我知道这可能不是最好的解决方案,但这是我为此目的找到的。

免责声明:这只是展示如何做到这一点,这里的 bash 脚本也非常简单。