PHP命令行管理Nginx虚拟主机脚本实例
本文展示如何利用PHP内置功能编写命令行脚本(CLI),实现对Nginx虚拟主机的批量创建与删除管理。该方案适用于Linux环境下的服务器自动化运维场景。
实现思路与准备条件
虽然通常Shell脚本用于系统配置,但PHP具备强大的字符串处理能力和文件系统操作函数,完全可以胜任此类任务。要实现该功能,需满足以下条件:
- 运行环境:Linux服务器,已安装PHP CLI(命令行)模式和Nginx服务。
- 权限要求:执行脚本的用户需拥有写入/etc/nginx/及/home/sites/目录的权限(通常需sudo或root权限)。
- 目录结构规划:
- 网站根目录:
/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”时,脚本执行以下安全检查与文件生成步骤:
- 域名校验:读取用户输入的域名,并基于此构造网站根路径和配置路径。
- 存在性检查:若目标路径或配置文件已存在,则终止操作以防覆盖。
- 目录创建:使用
mkdir($path, 0700)创建仅所有者可访问的网站目录。 - 模板渲染:读取配置文件模板,利用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”时,需列出所有已有配置供选择。删除操作遵循先备份、后清理的原则:
- 扫描列表:遍历
/etc/nginx/sites/目录,过滤出非.和..的文件列表。 - 用户确认:打印带序号的配置列表,等待用户输入编号。
- 安全删除:
- 复制原配置文件到
/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端口)。
使用注意事项与排错
在使用此类自定义脚本进行生产环境操作时,请注意以下风险点:
- 权限问题:确保Nginx进程用户(通常是www-data或nginx)对生成的
/home/sites/{domain}目录有读取和执行权限,否则可能导致502错误。 - 重载配置:本脚本仅负责创建/删除文件和目录。新建或修改配置后,必须手动执行
nginx -t测试语法无误,然后执行systemctl reload nginx使新规则生效。 - 输入安全:原始代码中直接使用了
eval()进行变量填充。在生产环境中,建议改用正则表达式替换或数组映射,以防止恶意注入字符破坏配置结构。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













