PHP命令行管理Nginx虚拟主机脚本实例

Hazel
Hazel
发布时间:2026-10-14 | 2人浏览过
原创

本文展示如何利用PHP内置功能编写命令行脚本(CLI),实现对Nginx虚拟主机的批量创建与删除管理。该方案适用于Linux环境下的服务器自动化运维场景。

实现思路与准备条件

虽然通常Shell脚本用于系统配置,但PHP具备强大的字符串处理能力和文件系统操作函数,完全可以胜任此类任务。要实现该功能,需满足以下条件:

  1. 运行环境:Linux服务器,已安装PHP CLI(命令行)模式和Nginx服务。
  2. 权限要求:执行脚本的用户需拥有写入/etc/nginx/及/home/sites/目录的权限(通常需sudo或root权限)。
  3. 目录结构规划:
    • 网站根目录:/home/sites/(子目录对应域名)
    • Nginx配置文件目录:/etc/nginx/sites/
    • 备份目录:/etc/nginx/backup/
    • 配置模板:/etc/nginx/template/site_conf

第1步:编写主交互逻辑

脚本使用 #!/usr/bin/php -q 作为Shebang,使其可直接在终端运行。利用 STDOUT 输出菜单,STDIN 获取用户输入,构建一个简单的状态循环。

#!/usr/bin/php -q
<?php
// 定义全局路径变量
$basePath = "/home/sites";
$configPath = "/etc/nginx/sites";
$templatePath = "/etc/nginx/template/site_conf";
$backupDir = "/etc/nginx/backup";

start:
fwrite(STDOUT,"===========Vhost Script===========\n");
fwrite(STDOUT,"= Choose an operation \n");
fwrite(STDOUT,"= 1.Create 2.Delete 3.Exit\n");
fwrite(STDOUT,"==================================\n");

$operate = trim(fgets(STDIN));

第2步:实现创建虚拟主机流程

当用户选择操作“1”时,脚本执行以下安全检查与文件生成步骤:

  1. 域名校验:读取用户输入的域名,并基于此构造网站根路径和配置路径。
  2. 存在性检查:若目标路径或配置文件已存在,则终止操作以防覆盖。
  3. 目录创建:使用 mkdir($path, 0700) 创建仅所有者可访问的网站目录。
  4. 模板渲染:读取配置文件模板,利用PHP的 eval() 特性或字符串替换将变量填入模板,最后写入Nginx站点配置文件。
if ( $operate == 1 ) {
    fwrite(STDOUT,"Please Enter a Domain Name:");
    $domain = trim(fgets(STDIN));
    $path = "{$basePath}/{$domain}";
    $nginxConf = "{$configPath}/{$domain}";

    // 基础存在性检查
    if( file_exists($path) || file_exists($nginxConf) ) {
        exit("Domain or Config Existed!\n");
    }

    // 创建站点根目录
    mkdir($path, 0700);

    // 读取并处理配置模板
    $confStr = file_get_contents($templatePath);
    // 简单的变量替换示例:假设模板中包含 {$domain} 和 {$path}
    $confStr = str_replace(['{$domain}', '{$path}'], [$domain, $path], $confStr);
    
    // 写入配置文件
    if(file_put_contents($nginxConf, $confStr)) {
        echo "Create Vhost success!\n";
    } else {
        exit("Write Config File Failed!\n");
    }
    goto start;
}

第3步:实现删除与备份流程

当用户选择操作“2”时,需列出所有已有配置供选择。删除操作遵循先备份、后清理的原则:

  1. 扫描列表:遍历 /etc/nginx/sites/ 目录,过滤出非 . 和 .. 的文件列表。
  2. 用户确认:打印带序号的配置列表,等待用户输入编号。
  3. 安全删除:
    • 复制原配置文件到 /etc/nginx/backup/ 目录。
    • 使用 tar 命令对网站数据进行打包备份至 /home/sites/。
    • 彻底删除源站点目录和配置文件。
else if ($operate == 2) {
    // 获取配置文件列表
    $confsDir = dir($configPath);
    $confsList = array();
    $count = 0;
    
    while ( false !== ( $file = $confsDir->read() ) ) {
        if( $file != '.' && $file != '..' && is_file($configPath."/".$file) ) {
            $confsList[$count++] = $file;
        }
    }
    $confsDir->close();

    // 打印列表
    if(count($confsList) > 0) {
        foreach ( $confsList as $k => $v ) {
            echo "{$k}. {$v}\n";
        }
    }

    $index = trim(fgets(STDIN));
    
    // 执行删除与备份
    if( isset($confsList[$index]) ) {
        $targetFile = $confsList[$index];
        $targetSite = $confsList[$index]; // 默认文件名即域名
        
        // 1. 备份配置文件
        copy($configPath."/".$targetFile, "$backupDir/$targetFile");
        
        // 2. 打包网站数据
        exec("tar -zcf {$basePath}/{$targetSite}.tar.gz -C {$basePath} {$targetSite}");
        
        // 3. 删除源文件
        unlink($configPath."/".$targetFile);
        system("rm -Rf {$basePath}/{$targetSite}");
        
        echo "Delete {$targetSite} complete with backup.\n";
    }
    goto start;
}

Nginx配置模版关键点

上述脚本依赖位于 /etc/nginx/template/site_conf 的模板文件。一个标准的动静分离模版应包含:

  • 基本监听:listen 80; 和动态插入的 server_name。
  • 日志规范:access_log 和 error_log 按域名隔离。
  • 静态资源缓存:针对图片、CSS、JS设置较长的 expires 时间以减轻服务器压力。
  • 代理转发:通过 location @proxy 将动态请求转发至后端(如Apache或PHP-FPM端口)。

使用注意事项与排错

在使用此类自定义脚本进行生产环境操作时,请注意以下风险点:

  1. 权限问题:确保Nginx进程用户(通常是www-data或nginx)对生成的 /home/sites/{domain} 目录有读取和执行权限,否则可能导致502错误。
  2. 重载配置:本脚本仅负责创建/删除文件和目录。新建或修改配置后,必须手动执行 nginx -t 测试语法无误,然后执行 systemctl reload nginx 使新规则生效。
  3. 输入安全:原始代码中直接使用了 eval() 进行变量填充。在生产环境中,建议改用正则表达式替换或数组映射,以防止恶意注入字符破坏配置结构。
以上就是使用PHP编写Shell脚本管理Nginx虚拟主机的详细内容,更多关于PHP Shell脚本优化的资料请关注本站其它相关文章!
相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表